Копипаста (программирование)

Материал из wikixw
Перейти к навигации Перейти к поиску

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

Происхождение[править]

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

(См. также Cargo cult programming)

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

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

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

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

Дублирование[править]

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

Применение библиотечного кода[править]

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

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

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

Ветвящийся код[править]

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

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

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

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

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

Недостатками являются:

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

Как и выше, альтернативой подходу copy-and-paste будет модульный подход:

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

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

Трудность и риск сохранения кода, написанного копипастным программированием

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

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

Осознанный выбор дизайна[править]

Copy-and-paste programming иногда принимается в качестве допустимого метода программирования. Это чаще всего наблюдается в шаблонах, таких как объявления классов или импорт стандартных библиотек, или при использовании существующего шаблона кода (с пустым содержимым или функциями-заглушками) в качестве фреймворка для заполнения.

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

Язык программирования Subtext - это исследовательский проект, направленный на "декриминализацию" вырезки и вставки. Используя этот язык, вырезать и вставить является основной моделью взаимодействия и, следовательно, не считается анти-паттерном.

Пример[править]

Простой пример - цикл for , который может быть выражен как for (int i=0; i!=n; ++i) {}.

Пример кода, использующего такой цикл for, может быть:

void foo(int n) {
   for (int i=0; i!=n; ++i) {
      /* body */
   }
}

Циклический код мог быть сгенерирован следующим фрагментом (с указанием типов и имен переменных):

   for ($type $loop_var = 0; $loop_var != $stop; ++$loop_var) {
       /* body */
   }

См. Также[править]

Читать[править]

//neolurk.org/wiki/копипаста:Программирование

  • Копипаста:Программирование/Функциональщина
  • Копипаста:Программирование/Для чайников

Пруф[править]

/wiki.c2.com/?CopyAndPasteProgramming