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