Введение
Копирование и вставка, иногда называемое просто вставкой, — это создание высоко повторяющегося компьютерного программного кода посредством операций копирования и вставки. Это преимущественно уничижительный термин; использующие его часто подразумевают недостаток навыков программирования и умения создавать абстракции. Это также может быть вызвано технологическими ограничениями (например, недостаточно выразительной средой разработки), поскольку в таких случаях обычно используются подпрограммы или библиотеки. Однако существуют ситуации, когда копирование и вставка кода считается допустимым или необходимым, например, для шаблонного кода, разворачивания циклов (если это не поддерживается компилятором автоматически) или определенных приемов программирования, и эта практика поддерживается некоторыми редакторами исходного кода в виде сниппетов.
Copy and paste programming, sometimes referred to as just pasting, is the production of highly repetitive computer programming code, as produced by copy and paste operations. It is primarily a pejorative term; those who use the term are often implying a lack of programming competence and ability to create abstractions. It may also be the result of technology limitations (e. g., an insufficiently expressive development environment) as subroutines or libraries would normally be used instead. However, there are occasions when copy and paste programming is considered acceptable or necessary, such as for boilerplate, loop unrolling (when not supported automatically by the compiler), or certain programming idioms, and it is supported by some source code editors in the form of snippets.
Повторяющиеся задачи или вариации задачи
Одна из самых вредных форм программирования методом копирования и вставки встречается в коде, выполняющем повторяющуюся задачу или вариации одной и той же основной задачи в зависимости от некоторой переменной. Каждый экземпляр копируется сверху и вставляется повторно с незначительными изменениями. Вредные последствия включают в себя: подход копирования и вставки часто приводит к большим методам (что является признаком плохого качества кода). Каждый экземпляр создает дубликат кода, со всеми проблемами, обсуждавшимися в предыдущих разделах, но в гораздо большем масштабе. Десятки дубликатов – обычное явление, возможны сотни. Особенно сложно и дорого становится исправление ошибок в таком коде. Такой код также страдает от значительных проблем с читаемостью из-за трудности точного определения различий между каждым повторением. Это напрямую влияет на риски и затраты на изменение кода. Процедурное программирование настоятельно не рекомендует использовать копирование и вставку для повторяющихся задач. В рамках процедурной модели предпочтительным подходом к повторяющимся задачам является создание функции или подпрограммы, выполняющей однократный проход по задаче; эта подпрограмма затем вызывается вызывающей рутиной либо многократно, либо, что еще лучше, с использованием циклической структуры. Такой код называют "хорошо структурированным" и рекомендуют как более простой для чтения и более легко расширяемый. Общее правило, применимое в этом случае, – "не повторяйся".
The copy and paste approach often leads to large methods (a bad code smell). Each instance creates a code duplicate, with all the problems discussed in prior sections, but with a much greater scope. Scores of duplications are common; hundreds are possible. Bug fixes, in particular, become very difficult and costly in such code. Such code also suffers from significant readability issues, due to the difficulty of discerning exactly what differs between each repetition. This has a direct impact on the risks and costs of revising the code. The procedural programming model strongly discourages the copy and paste approach to repetitive tasks. Under a procedural model, a preferred approach to repetitive tasks is to create a function or subroutine that performs a single pass through the task; this subroutine is then called by the parent routine, either repetitively or better yet, with some form of looping structure. Such code is termed "well decomposed", and is recommended as being easier to read and more readily extensible. The general rule of thumb applicable to this case is "don't repeat yourself".
Умышленный выбор конструкции
Копирование и вставка иногда допускается как допустимая техника программирования. Чаще всего это встречается в шаблонном коде, таком как объявления классов или импорт стандартных библиотек, или при использовании существующего шаблона кода (с пустым содержимым или заглушками функций) в качестве каркаса для заполнения. Использование программистских идиом и шаблонов проектирования аналогично программированию копированием и вставкой, поскольку они также используют типовой код. В некоторых случаях это может быть представлено в виде сниппета, который затем можно вставить при необходимости такого кода, хотя часто он просто вспоминается программистом. В других случаях идиому нельзя свести к шаблону кода. Однако в большинстве случаев, даже если идиому можно свести к коду, он будет либо достаточно длинным, чтобы его вынесли в функцию, либо достаточно коротким, чтобы его можно было ввести напрямую. Язык программирования Subtext — это исследовательский проект, направленный на "легализацию" вырезания и вставки. В этом языке вырезание и вставка является основной моделью взаимодействия и, следовательно, не считается антипаттерном.