Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Истоки [ править ]

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

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

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

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

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

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

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

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

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

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

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

Код ветвления [ править ]

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

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

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

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

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

Минусы:

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

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

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

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

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

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

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

Сознательный выбор дизайна [ править ]

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

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

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

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

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

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

void  foo ( int  n )  {  for  ( int  i = 0 ;  i ! = n ;  ++ i )  {  / * тело * /  } }

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

 for  ( $ type  $ loop_var  =  0 ;  $ loop_var  ! =  $ stop ;  ++ $ loop_var )  {  / * тело * /  }

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

  • Культ грузового программирования

Ссылки [ править ]

  1. ^ a b «Пересмотр ошибок начинающих программистов» . acm.org . Проверено 4 июня 2008 . CS1 maint: обескураженный параметр ( ссылка )
  2. ^ «Динамическое построение веб-страниц ASP.NET в программном обеспечении» . codeproject.com . Проверено 4 июня 2008 . CS1 maint: обескураженный параметр ( ссылка )
  3. ^ Спинеллис, Диомидис. «Путеводитель по поиску плохого кода» . InformIT.com . Проверено 6 июня 2008 . CS1 maint: обескураженный параметр ( ссылка )
  4. ^ Леваллен, Раймонд. «4 основных принципа объектно-ориентированного программирования» . codebetter.com. Архивировано из оригинала на 2010-11-25 . Проверено 4 июня 2008 . CS1 maint: обескураженный параметр ( ссылка )
  5. Эриксен, Лиза. «Повторное использование кода в объектно-ориентированной разработке программного обеспечения» (PDF) . Норвежский университет науки и технологий, факультет компьютерных и информационных наук . Проверено 29 мая 2008 . CS1 maint: обескураженный параметр ( ссылка )
  6. ^ Эшли Марш. «Стандарты кодирования - путь к поддерживаемому коду» . MAAN Softwares INC . Проверено 10 апреля 2018 . CS1 maint: обескураженный параметр ( ссылка )
  7. ^ "Стэнфордский университет, CS 106е (" Программирование абстракций ") курс Раздаточный: "Распад " " (PDF) . Стэндфордский Университет. Архивировано из оригинального (PDF) 16 мая 2008 года . Проверено 4 июня 2008 . CS1 maint: обескураженный параметр ( ссылка )

Внешние ссылки [ править ]

  • c2: CopyAndPasteProgramming
  • Андрей Карпов. Последствия использования метода Copy-Paste в программировании на C ++ и как с этим бороться
  • Андрей Карпов. Эффект последней строки
  • Детектор копирования / вставки PMD , CPD.