Jump to content

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

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

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

[ редактировать ]

Программирование методом копирования и вставки часто выполняется неопытными программистами или студентами-программистами, которые считают написание кода с нуля трудным или раздражающим и предпочитают искать заранее написанное решение или частичное решение, которое они могут использовать в качестве основы для своей собственной проблемы. решение. [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 */
    }

См. также

[ редактировать ]
  1. ^ Jump up to: а б Ярмиш, Гавриил; Копец, Дэнни (2007). «Возвращение к ошибкам начинающих программистов» . Бюллетень ACM Sigcse . 39 (2). acm.org: 131–137. дои : 10.1145/1272848.1272896 . S2CID   8854303 . Проверено 4 июня 2008 г.
  2. ^ «Динамическое создание веб-страниц ASP.NET с помощью кода программной части» . codeproject.com. 25 апреля 2008 года . Проверено 4 июня 2008 г.
  3. ^ Спинеллис, Диомидис. «Руководство по обнаружению плохого кода» . ИнформИТ.com . Проверено 6 июня 2008 г.
  4. ^ Леваллен, Раймонд. «4 основных принципа объектно-ориентированного программирования» . codebetter.com. Архивировано из оригинала 25 ноября 2010 г. Проверено 4 июня 2008 г.
  5. ^ Эриксен, Лиза. «Повторное использование кода в объектно-ориентированной разработке программного обеспечения» (PDF) . Норвежский университет науки и технологий, факультет компьютерных и информационных наук . Проверено 29 мая 2008 г.
  6. ^ Эшли Марш. «Стандарты кодирования – путь к поддерживаемому коду» . МААН Программное обеспечение, ИНК . Проверено 10 апреля 2018 г.
  7. ^ «Стэнфордский университет, CS 106X («Абстракции программирования»), раздаточный материал курса: «Декомпозиция» » (PDF) . Стэнфордский университет. Архивировано из оригинала (PDF) 16 мая 2008 г. Проверено 4 июня 2008 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fcec596d3bae3406eb59865cab171ca8__1720342680
URL1:https://arc.ask3.ru/arc/aa/fc/a8/fcec596d3bae3406eb59865cab171ca8.html
Заголовок, (Title) документа по адресу, URL1:
Copy-and-paste programming - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)