Введение
Использование существующего программного обеспечения для создания нового программного обеспечения
В разработке программного обеспечения (и в компьютерном программировании в целом) повторное использование кода, также называемое повторным использованием программного обеспечения, — это использование существующего программного обеспечения или знаний о нём для создания нового программного обеспечения в соответствии с принципами повторного использования. Повторное использование кода может быть реализовано различными способами, в зависимости от сложности выбранного языка программирования, и варьируется от низкоуровневых подходов, таких как копирование кода (например, с помощью сниппетов), простых функций (процедур или подпрограмм), до наборов объектов или функций, организованных в модули (например, библиотеки) или пользовательские пространства имён, а также пакетов, фреймворков или программных комплексов на более высоких уровнях. Повторное использование кода подразумевает наличие зависимостей, которые могут затруднить поддержку кода. По крайней мере, одно исследование показало, что повторное использование кода снижает технический долг.
Обзор
Повторное использование кода практиковалось с самых первых дней программирования. Программисты всегда повторно использовали фрагменты кода, шаблоны, функции и процедуры. Однако, как признанная область исследований в разработке программного обеспечения, повторное использование программного обеспечения возникло только в 1968 году, когда Дуглас Макилрой из Bell Laboratories предложил строить индустрию программного обеспечения на основе повторно используемых компонентов. Цель повторного использования кода – экономия времени и ресурсов, а также снижение избыточности за счет использования активов, которые уже были созданы в той или иной форме в процессе разработки программного продукта. Ключевая идея повторного использования заключается в том, что части компьютерной программы, написанные в одно время, могут или должны использоваться при создании других программ, написанных позднее. Повторное использование кода может подразумевать создание отдельно поддерживаемой версии повторно используемых активов. Хотя код является наиболее распространенным ресурсом для повторного использования, другие активы, создаваемые в течение цикла разработки, также могут предоставлять возможности для повторного использования: программные компоненты, наборы тестов, проекты, документация и так далее. Библиотека программного обеспечения – хороший пример повторного использования кода. Программисты могут создавать внутренние абстракции, чтобы определенные части их программы можно было повторно использовать, или создавать собственные библиотеки для собственного использования. Некоторые характеристики, облегчающие повторное использование программного обеспечения, включают модульность, слабую связанность, высокую связность, сокрытие информации и разделение ответственности. Чтобы новый код мог использовать существующий код, необходимо определить определенный интерфейс или средство связи. Обычно это включает в себя вызов или использование подпрограммы, объекта, класса или прототипа. В организациях такие практики формализуются и стандартизируются с помощью доменной инженерии, также известной как разработка семейств программных продуктов. Общая практика использования предыдущей версии существующей программы в качестве отправной точки для следующей версии также является формой повторного использования кода. Некоторые так называемые случаи "повторного использования" кода сводятся к простому копированию части или всего кода из существующей программы в новую. Хотя организации могут получить преимущества в скорости вывода продукта на рынок с помощью этого подхода, впоследствии они могут столкнуться со многими проблемами дублирования кода, вызванными программированием методом "вырезать и вставить". Многие исследователи работали над тем, чтобы сделать повторное использование более быстрым, простым, систематизированным и неотъемлемой частью нормального процесса программирования. Это одни из основных целей, лежащих в основе изобретения объектно-ориентированного программирования, которое стало одной из наиболее распространенных форм формализованного повторного использования. Более поздним изобретением является обобщенное программирование. Другой, более новый подход – использование программных "генераторов", программ, которые могут создавать новые программы определенного типа на основе набора параметров, выбираемых пользователями. Области изучения таких систем – генеративное программирование и метапрограммирование.
Библиотеки программного обеспечения
Очень распространенным примером повторного использования кода является использование программной библиотеки. Многие стандартные операции, такие как преобразование информации между известными форматами, доступ к внешним носителям, взаимодействие с внешними программами или обработка информации (чисел, слов, имен, местоположений, дат и т.д.) общепринятыми способами, требуются множеству различных программ. Авторы новых программ могут использовать код из программной библиотеки для выполнения этих задач, вместо того чтобы "изобретать велосипед", – писать новый код непосредственно в программе для выполнения операции. Реализации библиотек часто хорошо протестированы и учитывают необычные или сложные случаи. К недостаткам относятся невозможность тонкой настройки деталей, что может повлиять на производительность или желаемый результат, а также время и затраты на приобретение, изучение и настройку библиотеки.
Конструктивные шаблоны
Шаблон проектирования — это общее решение для часто возникающей проблемы. Шаблоны проектирования носят скорее концептуальный, чем конкретный характер и могут быть адаптированы под конкретные нужды. Тем не менее, абстрактные классы и интерфейсы могут быть использованы повторно для реализации определенных шаблонов.
Рамки
Разработчики обычно повторно используют крупные фрагменты программного обеспечения с помощью сторонних приложений и фреймворков. Однако фреймворки, как правило, ориентированы на конкретную предметную область и применимы лишь к семействам приложений.
Функция высшего порядка
В функциональном программировании функции высшего порядка могут использоваться во многих случаях, где раньше применялись шаблоны проектирования или фреймворки.
Ретрокомпьютерные
Ретрокомпьютинг включает в себя повторное использование кода, поскольку ретро-программы запускаются на старых компьютерах или их эмуляторах.
Компьютерная безопасность
В компьютерной безопасности повторное использование кода применяется как метод эксплуатации программного обеспечения. Когда злоумышленник не может напрямую ввести код для изменения потока управления программой, например, при наличии средств защиты от инъекций кода, таких как W^X, он может перенаправить поток управления на существующие в памяти последовательности кода. Примерами атак, основанных на повторном использовании кода, являются атака "return-to-libc", ориентированное на возвраты программирование (ROP) и ориентированное на переходы программирование (JOP).
Компоненты
Компонент, в объектно-ориентированном контексте, представляет собой набор взаимодействующих классов (или один класс) и их интерфейсы. Интерфейсы обеспечивают возможность замены компонентов. Многократно используемые компоненты могут также быть изолированы и синхронизированы между репозиториями систем контроля версий с помощью технологий управления исходным кодом компонентов (CSCM).
Внешние компьютеры
Вся концепция "повторного использования кода" может также распространяться на инженерные приложения за пределами программного обеспечения. Например, параметрическое моделирование в системах автоматизированного проектирования (САПР) позволяет создавать повторно используемые проекты. Стандартизация приводит к созданию взаимозаменяемых компонентов, которые затем можно повторно использовать в различных областях.
Критика
Повторное использование кода влечет за собой зависимость от используемого компонента. Роб Пайк заметил, что "немного копирования лучше, чем немного зависимости". Когда он пришел в Google, компания делала сильный акцент на повторное использование кода. Он считает, что кодовая база Google до сих пор страдает от последствий этой прежней политики, особенно в отношении скорости компиляции и поддерживаемости. Написание и проектирование повторно используемого кода обычно требует больших усилий. Фред Брукс обсуждает значительно более высокие затраты, связанные с этими усилиями, в своих эссе "The Tar Pit" и "No Silver Bullet" (Не серебряная пуля). Заблуждение заключается в том, что усилия часто тратятся без глубокого понимания механизмов, которые должны окупить эти затраты. Обоснование часто строится на ошибочном проведении параллелей с многоразовыми деталями в физическом производстве. Это ошибочно, поскольку написание кода аналогично проектированию единичного продукта, а не производству множества экземпляров.