Програмування методом копіювання-вставки - поширений антипаттерн. що приводить до появи дубльованого коду, зазвичай великого і складного для сприйняття. Повторювані фрагменти коду розмножують помилку, допущену в оригінальному коді, а багаторазові повтори ускладнюють виправлення цієї помилки в копіях [1] [3].
Програмісти, які часто копіюють чужий програмний код, часто не розуміють його частково або повністю. Як така, проблема виникає більше через їх недосвідченість і відсутність наполегливості, ніж від самого факту копіювання. Скопійований код часто береться від друзів, колег, з інтернет-форумів. від викладачів або з книг з програмування. Результат ризикує бути незв'язним набором стилів і може містити надлишковий код, вирішальний вже неіснуючі проблеми.
Додаткова проблема полягає в тому, що баги також можуть просто включатися з копійованим кодом. Прийоми проектування, використані в різних вихідних кодах. можуть бути не прийнятні в разі їх комбінування в новому середовищі.
Такий код також ненавмисно може стати обфусцірованним. оскільки назви змінних, класів, функцій і т. п. після копіювання зазвичай залишаються незмінними, навіть якщо їх призначення абсолютно відрізняється в новому контексті [4].
Випадково забуті виправлення - одна з найбільш неприємних і поширених проблем при програмуванні методом копіювання-вставки
Використання бібліотек
Програмування методом копіювання-вставки також нерідко застосовується досвідченими програмістами, що мають свої бібліотеки добре протестованих і готових до використання фрагментів і загальних алгоритмів, що пристосовуються до конкретних завдань [2].
Замість створення декількох змінених копій узагальненого алгоритму об'єктно-орієнтований підхід пропонує абстрагування алгоритму в інкапсульований клас, який може бути використаний повторно. Такий клас створюється гнучко, з повною підтримкою успадкування і перевантаження. що дозволяє зухвалому коду взаємодіяти з одним узагальненим кодом, ніж з декількома або багатьма зміненими [9]. У міру розширення необхідної функціональності, бібліотека також збільшується в розмірі (зі збереженням зворотної сумісності). Так, якщо в оригінальний алгоритм вносять виправлення бага, то все програмне забезпечення, що використовує цей алгоритм і бібліотеку, виграє.
Розгалуження є нормальним процесом при розробці програмного забезпечення у великих командах. Він дозволяє здійснювати паралельну розробку на гілках і, отже, скорочувати цикли розробки. Класичне розгалуження має наступні особливості:
- Використовуються технології контролю версій. підтримуючої розгалуження
- Гілки повторно об'єднуються після завершення розробки
Програмування методом копіювати-вставити - це менш формальна альтернатива класичним розгалуження, часто використовувана в разі, якщо передбачається, що гілки будуть розходитися (різниця коду в гілках буде збільшуватися) з часом більше і більше, як у випадку виділення нового програмного продукту з уже існуючого.
Як спосіб відокремлення нового продукту, копипаста має деякі переваги. Оскільки розробка нового продукту не вносить зміни в уже існуючий:
- Немає необхідності регресійного тестування існуючого продукту;
- Економиться час, пов'язане із забезпеченням якості;
- Скорочується час виходу на ринок;
- Відсутній ризик внесення нових помилок в існуючий продукт (що могло б порушити існуючу базу користувачів).
- У разі, якщо новий і вихідний продукти розходяться не так сильно, як очікувалося, є ймовірність зіткнутися з необхідністю підтримки двох баз вихідних кодів (збільшення вартості в два рази), які, по суті, є одним продуктом. Це може привести до витратного рефакторингу й ручному злиття в подальшому;
- Існування двох баз кодів збільшує час, потрібний для здійснення змін, які бажані для обох продуктів, що свого часу збільшує час виходу на ринок. В реальних умовах це може знищити будь-який раніше виграний час.
Ще однією альтернативою CP-підходу є модульний підхід:
- Спочатку в бібліотеки або модулі виноситься код, який буде загальним для обох продуктів;
- Використання створених бібліотек є основою для розробки нового продукту;
- Якщо передбачається існування третьої, четвертої, п'ятої та т. П. Похідної версії продукту, то такий підхід набагато сильніше копіювання-вставки, оскільки різко скорочує цикл розробки будь-якого додаткового продукту після другого [10].
Повторювані завдання або варіації завдання
Одна з найбільш шкідливих форм CP-програмування виражається в появі дубльованого коду. виконує повторювану завдання або варіацію основного завдання, в залежності від деякої змінної. Кожен екземпляр копіює раніше створений з внесенням незначних змін. Викликані ефекти:
Навмисний вибір підходу
Використання ідіом програмування і патернів проектування схоже на підхід копіювати-вставити, оскільки вони теж використовують шаблонний код. В одних випадках це може бути виражено фрагментом. який на вимогу вставляється в код, хоча часто він просто «викликається» з розуму програміста. В інших випадках використання ідіом не може бути зведене до шаблонного коду. У більшості випадків, однак, навіть якщо ідіома може бути зведена до коду, він буде або занадто довгим (що буде виділено в функцію), або занадто коротким (таким, що його можна набрати безпосередньо).
Простим прикладом допустимого застосування підходу може бути цикл for, який може виглядати як for (int i = 0; i! = N; ++ i) <>. Прикладом коду, що використовує такий цикл може бути:
Код циклу може бути згенерований таким сніпетів (визначаючи типи і імена змінних):
Багато програмістів часто використовують підхід через небажання переписувати рядок, що відрізняється від попередньої лише декількома символами (наприклад, виклик однієї функції для двох однотипних об'єктів, імена яких розрізняються незначно). Дублювати попередній рядок (також за допомогою клавіатурних скорочень) виявляється швидше, ніж переписати її заново. Але ймовірність припуститися помилки не зменшується [14]. особливо для останнього рядка [15].
Існує дослідження [16]. спрямоване на «декриміналізацію» програмування методом копіювати-вставити - Subtext programming language. Слід зазначити, що в цій моделі, копипаста - основна модель взаємодії і, отже, не розглядається як антипаттерн.