Программирование методом копирования и вставки

Уничижительный термин для обозначения часто повторяющегося программирования

Программирование методом копирования и вставки , иногда называемое просто вставкой , представляет собой создание многократно повторяющегося кода компьютерного программирования , создаваемого операциями копирования и вставки . Это в первую очередь уничижительный термин; те, кто использует этот термин, часто подразумевают отсутствие компетенции в программировании и способности создавать абстракции. Это также может быть результатом технологических ограничений (например, недостаточно выразительной среды разработки), поскольку вместо этого обычно используются подпрограммы или библиотеки. Однако бывают случаи, когда программирование методом копирования и вставки считается приемлемым или необходимым, например, для шаблона , развертывания цикла (когда компилятор не поддерживает его автоматически), языков с ограниченными возможностями метапрограммирования или определенных идиом программирования, и оно поддерживается некоторыми редакторами исходного кода в виде фрагментов .

Происхождение

Программирование методом копирования и вставки часто выполняется неопытными программистами или студентами, которые считают процесс написания кода с нуля сложным или раздражающим и предпочитают искать готовое решение или частичное решение, которое они могут использовать в качестве основы для собственного решения проблем. [1] (См. также Программирование с использованием культа карго )

Неопытные программисты, которые копируют код, часто не полностью понимают заранее написанный код, который они берут. Таким образом, проблема возникает скорее из-за их неопытности и отсутствия смелости в программировании, чем из-за самого процесса копирования и вставки. Код часто поступает из разрозненных источников, таких как код друзей или коллег, интернет-форумы , проекты с открытым исходным кодом, код, предоставленный профессорами/ассистентами студента или учебники по информатике . Результат рискует стать бессвязным столкновением стилей и может иметь избыточный код, который решает проблемы, для которых новые решения больше не требуются.

Еще одна проблема заключается в том, что ошибки могут легко быть внесены из-за предположений и проектных решений, принятых в отдельных источниках, которые больше не применимы при помещении в новую среду.

Такой код может также, по сути, быть непреднамеренно запутанным , поскольку имена переменных, классов, функций и т. п. обычно остаются неизменными, даже если их назначение может быть совершенно иным в новом контексте. [1]

Программирование методом копирования и вставки также может быть результатом плохого понимания особенностей, распространенных в компьютерных языках, таких как циклические структуры, функции и подпрограммы.

Дублирование

Повторяющийся код рефакторится с использованием механизма абстракции, такого как функция .

Применение библиотечного кода

Копирование и вставка также выполняются опытными программистами, которые часто имеют собственные библиотеки хорошо протестированных, готовых к использованию фрагментов кода и универсальных алгоритмов , которые легко адаптируются к конкретным задачам. [2]

Будучи формой дублирования кода , копирование и вставка программирования имеет некоторые внутренние проблемы; такие проблемы усугубляются, если код не сохраняет никакой семантической связи между исходным текстом и копиями. В этом случае, если требуются изменения, время тратится на поиск всех дублирующихся мест. (Это можно частично смягчить, если исходный код и/или копия должным образом прокомментированы; однако даже в этом случае остается проблема внесения одних и тех же правок несколько раз. Кроме того, поскольку поддержка кода часто не включает обновление комментариев, [3] комментарии, описывающие, где найти удаленные части кода, печально известны тем, что устаревают.)

Сторонники объектно-ориентированных методологий также возражают против использования копирования и вставки в «библиотеке кода». Вместо создания нескольких измененных копий универсального алгоритма, объектно-ориентированный подход абстрагирует алгоритм в повторно используемый инкапсулированный класс . Класс написан гибко, с полной поддержкой наследования и перегрузки , так что весь вызывающий код может быть подключен для использования этого универсального кода напрямую, а не для изменения исходного. [4] По мере необходимости дополнительной функциональности библиотека расширяется (сохраняя обратную совместимость ). Таким образом, если исходный алгоритм имеет ошибку, которую нужно исправить или которую можно улучшить, все программное обеспечение, использующее его, выиграет. Универсальное программирование предоставляет дополнительные инструменты для создания абстракций.

Код ветвления

Код ветвления является обычной частью разработки программного обеспечения большой командой, позволяя параллельную разработку на обеих ветвях и, следовательно, более короткие циклы разработки. Классическое ветвление обладает следующими качествами:

  • Управляется системой контроля версий , которая поддерживает ветвление
  • После завершения параллельной разработки ветви объединяются повторно.

Копирование и вставка — менее формальная альтернатива классическому ветвлению, часто используемая, когда предполагается, что ветви будут со временем все больше расходиться, например, когда новый продукт выделяется из существующего.

Как способ создания нового продукта, копирование и вставка программирования имеет некоторые преимущества. Поскольку новая инициатива разработки не затрагивает код существующего продукта:

  • Нет необходимости проводить регрессионное тестирование существующего продукта, что экономит время на контроль качества, связанное с запуском нового продукта, и сокращает время выхода на рынок .
  • Нет риска появления ошибок в существующем продукте, которые могли бы расстроить базу пользователей.

Недостатки:

  • Если новый продукт не будет отличаться от существующего продукта так сильно, как ожидалось, может потребоваться поддержка двух баз кода (по вдвое большей стоимости) там, где это было бы возможно. Это может привести к дорогостоящему рефакторингу и ручному слиянию в дальнейшем.
  • Дублирование кодовой базы удваивает время, необходимое для внедрения изменений, которые могут потребоваться в обоих продуктах; это увеличивает время вывода таких изменений на рынок и может фактически свести на нет любые выигрыши во времени, достигнутые за счет изначального ветвления кода.

Аналогично вышесказанному, альтернативой подходу копирования и вставки может стать модульный подход:

  • Начните с выделения кода, который будет совместно использоваться обоими продуктами, в библиотеки.
  • Используйте эти библиотеки (а не вторую копию кодовой базы) в качестве основы для разработки нового продукта.
  • Если в дальнейшем планируется выпуск третьей, четвертой или пятой версии продукта, этот подход становится гораздо более эффективным, поскольку готовые библиотеки кода значительно сокращают жизненный цикл разработки любых дополнительных продуктов после второй. [5]

Повторяющиеся задачи или вариации задачи

Сложность и риск поддержки кода, написанного методом копирования-вставки

Одна из самых вредных форм копирования и вставки программирования происходит в коде, который выполняет повторяющуюся задачу или вариации одной и той же базовой задачи в зависимости от некоторой переменной. Каждый экземпляр копируется сверху и вставляется снова с небольшими изменениями. Вредные эффекты включают:

  • Подход «копировать и вставить» часто приводит к созданию больших методов ( запах плохого кода ).
  • Каждый экземпляр создает дубликат кода со всеми проблемами, обсуждавшимися в предыдущих разделах, но с гораздо большим масштабом. Обычны десятки дубликатов; возможны сотни. Исправление ошибок, в частности, становится очень сложным и дорогостоящим в таком коде. [6]
  • Такой код также страдает от значительных проблем с читаемостью из-за сложности различения того, что именно отличается между каждым повторением. Это напрямую влияет на риски и затраты на пересмотр кода.
  • Процедурная модель программирования настоятельно не рекомендует использовать подход «копировать-вставить» для повторяющихся задач. В рамках процедурной модели предпочтительным подходом к повторяющимся задачам является создание функции или подпрограммы, которая выполняет один проход через задачу; затем эта подпрограмма вызывается родительской подпрограммой, либо повторно, либо, что еще лучше, с некоторой формой циклической структуры. Такой код называется «хорошо разложенным» и рекомендуется как более простой для чтения и более легко расширяемый. [7]
  • Общее правило, применимое в этом случае, — « не повторяйся ».

Обдуманный выбор дизайна

Программирование методом копирования и вставки иногда принимается как допустимая техника программирования. Чаще всего это можно увидеть в шаблонах, таких как объявления классов или импорт стандартных библиотек, или при использовании существующего шаблона кода (с пустым содержимым или функциями-заглушками) в качестве основы для заполнения.

Использование идиом программирования и шаблонов проектирования похоже на программирование методом копирования и вставки, поскольку они также используют шаблонный код. В некоторых случаях это может быть выражено как фрагмент , который затем может быть вставлен, когда такой код необходим, хотя часто он просто вызывается из памяти программиста. В других случаях идиомы не могут быть сведены к шаблону кода. Однако в большинстве случаев, даже если идиому можно свести к коду, она будет либо достаточно длинной, чтобы ее можно было абстрагировать в функцию, либо достаточно короткой, чтобы ее можно было ввести напрямую.

Язык программирования 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 ) { /* тело */ }           

Смотрите также

Ссылки

  1. ^ ab Yarmish, Gavriel; Kopec, Danny (2007). «Повторный взгляд на ошибки начинающих программистов». ACM SIGCSE Bulletin . 39 (2). acm.org: 131–137. doi :10.1145/1272848.1272896. S2CID  8854303. Получено 04.06.2008 .
  2. ^ "Создание веб-страниц ASP.NET динамически в выделенном коде". codeproject.com. 25 апреля 2008 г. Получено 04.06.2008 г.
  3. ^ Спинеллис, Диомидис. «Руководство по обнаружению плохого кода». InformIT.com . Получено 06.06.2008 .
  4. ^ Льюаллен, Рэймонд. "4 основных принципа объектно-ориентированного программирования". codebetter.com. Архивировано из оригинала 2010-11-25 . Получено 2008-06-04 .
  5. ^ Эриксен, Лиза. "Повторное использование кода в объектно-ориентированной разработке программного обеспечения" (PDF) . Норвежский университет науки и технологий, кафедра компьютерных и информационных наук . Получено 29.05.2008 .
  6. ^ Эшли Марш. «Стандарты кодирования — путь к поддерживаемому коду». MAAN Softwares INC . Получено 10 апреля 2018 г.
  7. ^ "Stanford University, CS 106X ("Programming Abstractions") Course Handout: "Decomposition"" (PDF) . Stanford University. Архивировано из оригинала (PDF) 16 мая 2008 г. . Получено 2008-06-04 .
  • c2:Копировать и вставитьПрограммирование
  • Андрей Карпов. Последствия использования метода Copy-Paste в программировании на C++ и как с этим бороться
  • Андрей Карпов. Эффект последней строки
  • Детектор копирования/вставки PMD, CPD.
Взято с "https://en.wikipedia.org/w/index.php?title=Копировать-и-вставить_программирование&oldid=1241367200"