Программирование методом копирования и вставки , иногда называемое просто вставкой , представляет собой создание многократно повторяющегося кода компьютерного программирования , создаваемого операциями копирования и вставки . Это в первую очередь уничижительный термин; те, кто использует этот термин, часто подразумевают отсутствие компетенции в программировании и способности создавать абстракции. Это также может быть результатом технологических ограничений (например, недостаточно выразительной среды разработки), поскольку вместо этого обычно используются подпрограммы или библиотеки. Однако бывают случаи, когда программирование методом копирования и вставки считается приемлемым или необходимым, например, для шаблона , развертывания цикла (когда компилятор не поддерживает его автоматически), языков с ограниченными возможностями метапрограммирования или определенных идиом программирования, и оно поддерживается некоторыми редакторами исходного кода в виде фрагментов .
Программирование методом копирования и вставки часто выполняется неопытными программистами или студентами, которые считают процесс написания кода с нуля сложным или раздражающим и предпочитают искать готовое решение или частичное решение, которое они могут использовать в качестве основы для собственного решения проблем. [1] (См. также Программирование с использованием культа карго )
Неопытные программисты, которые копируют код, часто не полностью понимают заранее написанный код, который они берут. Таким образом, проблема возникает скорее из-за их неопытности и отсутствия смелости в программировании, чем из-за самого процесса копирования и вставки. Код часто поступает из разрозненных источников, таких как код друзей или коллег, интернет-форумы , проекты с открытым исходным кодом, код, предоставленный профессорами/ассистентами студента или учебники по информатике . Результат рискует стать бессвязным столкновением стилей и может иметь избыточный код, который решает проблемы, для которых новые решения больше не требуются.
Еще одна проблема заключается в том, что ошибки могут легко быть внесены из-за предположений и проектных решений, принятых в отдельных источниках, которые больше не применимы при помещении в новую среду.
Такой код может также, по сути, быть непреднамеренно запутанным , поскольку имена переменных, классов, функций и т. п. обычно остаются неизменными, даже если их назначение может быть совершенно иным в новом контексте. [1]
Программирование методом копирования и вставки также может быть результатом плохого понимания особенностей, распространенных в компьютерных языках, таких как циклические структуры, функции и подпрограммы.
Копирование и вставка также выполняются опытными программистами, которые часто имеют собственные библиотеки хорошо протестированных, готовых к использованию фрагментов кода и универсальных алгоритмов , которые легко адаптируются к конкретным задачам. [2]
Будучи формой дублирования кода , копирование и вставка программирования имеет некоторые внутренние проблемы; такие проблемы усугубляются, если код не сохраняет никакой семантической связи между исходным текстом и копиями. В этом случае, если требуются изменения, время тратится на поиск всех дублирующихся мест. (Это можно частично смягчить, если исходный код и/или копия должным образом прокомментированы; однако даже в этом случае остается проблема внесения одних и тех же правок несколько раз. Кроме того, поскольку поддержка кода часто не включает обновление комментариев, [3] комментарии, описывающие, где найти удаленные части кода, печально известны тем, что устаревают.)
Сторонники объектно-ориентированных методологий также возражают против использования копирования и вставки в «библиотеке кода». Вместо создания нескольких измененных копий универсального алгоритма, объектно-ориентированный подход абстрагирует алгоритм в повторно используемый инкапсулированный класс . Класс написан гибко, с полной поддержкой наследования и перегрузки , так что весь вызывающий код может быть подключен для использования этого универсального кода напрямую, а не для изменения исходного. [4] По мере необходимости дополнительной функциональности библиотека расширяется (сохраняя обратную совместимость ). Таким образом, если исходный алгоритм имеет ошибку, которую нужно исправить или которую можно улучшить, все программное обеспечение, использующее его, выиграет. Универсальное программирование предоставляет дополнительные инструменты для создания абстракций.
Код ветвления является обычной частью разработки программного обеспечения большой командой, позволяя параллельную разработку на обеих ветвях и, следовательно, более короткие циклы разработки. Классическое ветвление обладает следующими качествами:
Копирование и вставка — менее формальная альтернатива классическому ветвлению, часто используемая, когда предполагается, что ветви будут со временем все больше расходиться, например, когда новый продукт выделяется из существующего.
Как способ создания нового продукта, копирование и вставка программирования имеет некоторые преимущества. Поскольку новая инициатива разработки не затрагивает код существующего продукта:
Недостатки:
Аналогично вышесказанному, альтернативой подходу копирования и вставки может стать модульный подход:
Одна из самых вредных форм копирования и вставки программирования происходит в коде, который выполняет повторяющуюся задачу или вариации одной и той же базовой задачи в зависимости от некоторой переменной. Каждый экземпляр копируется сверху и вставляется снова с небольшими изменениями. Вредные эффекты включают:
Программирование методом копирования и вставки иногда принимается как допустимая техника программирования. Чаще всего это можно увидеть в шаблонах, таких как объявления классов или импорт стандартных библиотек, или при использовании существующего шаблона кода (с пустым содержимым или функциями-заглушками) в качестве основы для заполнения.
Использование идиом программирования и шаблонов проектирования похоже на программирование методом копирования и вставки, поскольку они также используют шаблонный код. В некоторых случаях это может быть выражено как фрагмент , который затем может быть вставлен, когда такой код необходим, хотя часто он просто вызывается из памяти программиста. В других случаях идиомы не могут быть сведены к шаблону кода. Однако в большинстве случаев, даже если идиому можно свести к коду, она будет либо достаточно длинной, чтобы ее можно было абстрагировать в функцию, либо достаточно короткой, чтобы ее можно было ввести напрямую.
Язык программирования Subtext — это исследовательский проект, направленный на «декриминализацию» вырезания и вставки. При использовании этого языка вырезание и вставка являются основной моделью взаимодействия и, следовательно, не считаются антишаблоном.
Простым примером является цикл for, который можно выразить как .for (int i=0; i!=n; ++i) {}
Пример кода с использованием такого цикла for может быть следующим:
void foo ( int n ) { for ( int i = 0 ; i != n ; ++ i ) { /* тело */ } }
Затем код цикла можно было бы сгенерировать с помощью следующего фрагмента (с указанием типов и имен переменных):
для ( $type $loop_var = 0 ; $loop_var != $stop ; ++ $loop_var ) { /* тело */ }