В разработке программного обеспечения (и компьютерном программировании в целом) повторное использование кода , также называемое повторным использованием программного обеспечения , — это использование существующего программного обеспечения или знаний о программном обеспечении для создания нового программного обеспечения, [1] [2] :7 в соответствии с принципами повторного использования .
Повторное использование кода может быть достигнуто разными способами в зависимости от сложности выбранного языка программирования и варьируется от подходов более низкого уровня, таких как копирование кода (например, с помощью фрагментов ), [3] простых функций ( процедур или подпрограмм ) или набора объекты или функции , организованные в модули (например, библиотеки ) [4] [2] : 7 или пользовательские пространства имен , а также пакеты , платформы или комплекты программного обеспечения на более высоких уровнях.
Повторное использование кода подразумевает зависимости, которые могут усложнить сопровождение кода . [ нужна цитата ] По крайней мере одно исследование показало, что повторное использование кода уменьшает технический долг . [5]
Повторное использование специального кода практиковалось с самых первых дней программирования . Программисты всегда повторно использовали разделы кода, шаблоны, функции и процедуры. Однако повторное использование программного обеспечения как признанная область исследований в области разработки программного обеспечения началось только в 1968 году, когда Дуглас Макилрой из Bell Laboratories предложил основать индустрию программного обеспечения на повторно используемых компонентах.
Повторное использование кода направлено на экономию времени и ресурсов, а также на сокращение избыточности за счет использования ресурсов, которые уже были созданы в той или иной форме в процессе разработки программного продукта. [6] Ключевая идея повторного использования заключается в том, что части компьютерной программы , написанные в одно время, могут или должны использоваться при создании других программ, написанных позже.
Повторное использование кода может подразумевать создание отдельно поддерживаемой версии повторно используемых ресурсов. Хотя код является наиболее распространенным ресурсом, выбираемым для повторного использования, другие ресурсы, созданные в ходе цикла разработки, могут предлагать возможности для повторного использования: программные компоненты, наборы тестов, проекты, документация и т. д. [7]
Библиотека программного обеспечения является хорошим примером повторного использования кода. Программисты могут решить создать внутренние абстракции, чтобы определенные части их программы можно было использовать повторно, или создать собственные библиотеки для собственного использования. Некоторые характеристики, которые делают программное обеспечение более удобным для повторного использования, — это модульность , слабая связанность , высокая связность , сокрытие информации и разделение задач .
Чтобы вновь написанный код мог использовать часть существующего кода, необходимо определить какой-то интерфейс или средство связи. Они обычно включают «вызов» или использование подпрограммы , объекта , класса или прототипа . В организациях такие методы формализованы и стандартизированы с помощью предметной инженерии , также известной как разработка линейки программных продуктов .
Общая практика использования предыдущей версии существующей программы в качестве отправной точки для следующей версии также является формой повторного использования кода.
Некоторое так называемое «повторное использование кода» предполагает простое копирование части или всего кода из существующей программы в новую. Хотя при таком подходе организации могут получить выгоду от сокращения времени вывода на рынок нового продукта, впоследствии они могут столкнуться со многими проблемами дублирования кода , вызванными программированием вырезания и вставки .
Многие исследователи работали над тем, чтобы сделать повторное использование более быстрым, простым, систематическим и неотъемлемой частью обычного процесса программирования. Таковы некоторые из основных целей изобретения объектно-ориентированного программирования , которое стало одной из наиболее распространенных форм формализованного повторного использования. Несколько более позднее изобретение — обобщенное программирование .
Другим, более новым средством является использование программных « генераторов », программ, которые могут создавать новые программы определенного типа на основе набора параметров, которые выбирают пользователи. Областями изучения таких систем являются генеративное программирование и метапрограммирование .
Что касается мотивации и движущих факторов, повторное использование может быть:
Повторное использование можно разделить на следующие категории:
Что касается формы или структуры повторного использования, код может быть: [9]
Повторное использование ветвей часто не рекомендуется, поскольку это форма дублирования кода, которая требует исправления каждой ошибки в каждой копии, а улучшения, внесенные в повторно используемый код, необходимо вручную объединять в каждой копии, иначе они устареют. Однако повторное использование форков может иметь такие преимущества, как изоляция, гибкость при изменении повторно используемого кода, упрощение упаковки, развертывания и управления версиями. [9]
Систематическое повторное использование программного обеспечения — это стратегия повышения производительности и улучшения качества индустрии программного обеспечения. Несмотря на простоту концепции, успешная реализация повторного использования программного обеспечения на практике затруднена. Причиной этого является зависимость повторного использования программного обеспечения от контекста, в котором оно реализовано. Некоторые проблемные вопросы, связанные с систематическим повторным использованием программного обеспечения, которые необходимо решить: [10]
Очень распространенным примером повторного использования кода является метод использования программной библиотеки . Многие общие операции, такие как преобразование информации в различные известные форматы, доступ к внешнему хранилищу, взаимодействие с внешними программами или манипулирование информацией (числа, слова, имена, местоположения, даты и т. д.) обычными способами, необходимы для многих различных программы. Авторы новых программ могут использовать код из библиотеки программного обеспечения для выполнения этих задач вместо того, чтобы «изобретать велосипед», написав полностью новый код непосредственно в программе для выполнения операции. Реализации библиотек часто имеют то преимущество, что они хорошо протестированы и охватывают необычные или загадочные случаи. К недостаткам относятся невозможность настройки деталей, которые могут повлиять на производительность или желаемый результат, а также время и стоимость приобретения, изучения и настройки библиотеки. [11]
Шаблон проектирования — это общее решение повторяющейся проблемы. Шаблоны проектирования более концептуальны, чем осязаемы, и могут быть изменены в соответствии с конкретными потребностями. Однако абстрактные классы и интерфейсы можно повторно использовать для реализации определенных шаблонов.
Разработчики обычно повторно используют большие части программного обеспечения через сторонние приложения и платформы. Хотя фреймворки обычно специфичны для предметной области и применимы только к семействам приложений .
В функциональном программировании функции высшего порядка могут использоваться во многих случаях, когда ранее использовались шаблоны проектирования или структуры.
Ретрокомпьютинг подразумевает повторное использование кода просто потому, что ретро-программы запускаются на старых компьютерах или на их эмуляторах .
В компьютерной безопасности повторное использование кода используется как метод эксплойта программного обеспечения. [12] Когда злоумышленник не может напрямую ввести код для изменения потока управления программой, например, при наличии средств защиты от внедрения кода, таких как W^X , он или она может перенаправить поток управления на последовательности кода, существующие в памяти. .
Примерами атак с повторным использованием кода являются атака с возвратом в libc , программирование, ориентированное на возврат , и программирование, ориентированное на переход. [12] [13]
Компонент в объектно-ориентированном виде представляет собой набор совместных классов (или только один класс) и его интерфейсов. Интерфейсы отвечают за возможность замены компонентов. Повторно используемые компоненты также можно изолировать и синхронизировать между репозиториями SCM с помощью технологий управления исходным кодом компонентов (CSCM). [ нужна цитата ]
Вся концепция «повторного использования кода» может также охватывать инженерные приложения вне программного обеспечения. Например, параметрическое моделирование в системе автоматизированного проектирования позволяет создавать конструкции многократного использования. Результатом стандартизации является создание совместимых частей, которые затем можно повторно использовать во многих контекстах. [ нужна цитата ]
Повторное использование кода приводит к зависимости от повторно используемого компонента. Роб Пайк высказал мнение, что «небольшое копирование лучше, чем небольшая зависимость». Когда он присоединился к Google , компания уделяла большое внимание повторному использованию кода. Он считает, что кодовая база Google по-прежнему страдает от последствий прежней политики с точки зрения скорости компиляции и удобства сопровождения. [14]
Повторно используемый код обычно требует больше усилий для написания и проектирования. Фред Брукс обсуждает значительно более высокие затраты, связанные с этими усилиями, в своих эссе «Смоляная яма» и « Нет серебряной пули ». Заблуждение заключается в том, что усилия часто тратятся без тщательного понимания механизмов, с помощью которых эти затраты будут окупаться. Оправдание часто происходит из-за неправильного проведения параллелей с деталями многократного использования в физическом производственном процессе. Неверно, потому что написание кода аналогично проектированию одного продукта, а не производству нескольких единиц.