Программирование копирования и вставки
Программирование копирования и вставки , иногда называемое просто вставкой , представляет собой создание повторяющегося компьютерного программного кода, создаваемого операциями копирования и вставки . Это прежде всего уничижительный термин; те, кто использует этот термин, часто подразумевают отсутствие компетентности в программировании и способности создавать абстракции. Это также может быть результатом технологических ограничений (например, недостаточно выразительной среды разработки), поскольку вместо этого обычно используются подпрограммы или библиотеки. Однако бывают случаи, когда программирование копирования и вставки считается приемлемым или необходимым, например, для шаблонного кода , развертывания цикла (если это не поддерживается автоматически компилятором), языков с ограниченными возможностями метапрограммирования или определенных идиом программирования, и оно поддерживается. некоторыми редакторами исходного кода в виде фрагментов .
Происхождение
[ редактировать ]Программирование методом копирования и вставки часто выполняется неопытными программистами или студентами-программистами, которые считают написание кода с нуля трудным или раздражающим и предпочитают искать заранее написанное решение или частичное решение, которое они могут использовать в качестве основы для своей собственной проблемы. решение. [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) {
/* body */
}
}
Код цикла затем можно было бы сгенерировать с помощью следующего фрагмента (с указанием типов и имен переменных):
for ($type $loop_var = 0; $loop_var != $stop; ++$loop_var) {
/* body */
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б Ярмиш, Гавриил; Копец, Дэнни (2007). «Возвращение к ошибкам начинающих программистов» . Бюллетень ACM Sigcse . 39 (2). acm.org: 131–137. дои : 10.1145/1272848.1272896 . S2CID 8854303 . Проверено 4 июня 2008 г.
- ^ «Динамическое создание веб-страниц ASP.NET с помощью кода программной части» . codeproject.com. 25 апреля 2008 года . Проверено 4 июня 2008 г.
- ^ Спинеллис, Диомидис. «Руководство по обнаружению плохого кода» . ИнформИТ.com . Проверено 6 июня 2008 г.
- ^ Леваллен, Раймонд. «4 основных принципа объектно-ориентированного программирования» . codebetter.com. Архивировано из оригинала 25 ноября 2010 г. Проверено 4 июня 2008 г.
- ^ Эриксен, Лиза. «Повторное использование кода в объектно-ориентированной разработке программного обеспечения» (PDF) . Норвежский университет науки и технологий, факультет компьютерных и информационных наук . Проверено 29 мая 2008 г.
- ^ Эшли Марш. «Стандарты кодирования – путь к поддерживаемому коду» . МААН Программное обеспечение, ИНК . Проверено 10 апреля 2018 г.
- ^ «Стэнфордский университет, CS 106X («Абстракции программирования»), раздаточный материал курса: «Декомпозиция» » (PDF) . Стэнфордский университет. Архивировано из оригинала (PDF) 16 мая 2008 г. Проверено 4 июня 2008 г.
Внешние ссылки
[ редактировать ]- c2:CopyAndPasteПрограммирование
- Андрей Карпов. Последствия использования метода Copy-Paste в программировании на C++ и как с этим бороться
- Andrey Karpov. The Last Line Effect
- PMD Детектор копирования/вставки , CPD.