Ви маєте рацію - copy-paste працює чудово, і DRY не має жодного сенсу, коли ваше завдання - створити програму, для якої або скопійований шаблон, або копія не потрібно буде підтримувати або розвиватися в майбутньому. Коли ці два програмні компоненти мають зовсім інший життєвий цикл, то з'єднання їх між собою шляхом рефакторингу загального коду в загальну область, яка сама по собі знаходиться під серйозною розробкою, дійсно може мати непередбачувані наслідки для зусиль. З іншого боку, при копіюванні кодових розділів всередині однієї програми чи програмної системи всі ці частини, як правило, мають однаковий життєвий цикл. Нижче я проілюструю, що це означає DRY та управління проектами.
Серйозно, таких програм багато: наприклад, індустрія комп'ютерних ігор виробляє безліч програм, які потрібно підтримувати максимум протягом декількох місяців або року, а коли цей час закінчиться, скопіюйте копіювання. старий код з попередньої гри, в якому перевищено термін обслуговування, в нову базу коду гри ідеально чудово і може прискорити роботу.
На жаль, життєвий цикл більшості програм, з якими мені доводилося стикатися за останні роки, сильно відрізняється від цього. 98% вимог або запитів на виправлення помилок, які надійшли до мене, були запитами на змінудля існуючих програм. І щоразу, коли вам потрібно щось змінити в існуючому фрагменті програмного забезпечення, "управління проектами" або планування працює найкраще, коли ваші зусилля з тестування та налагодження досить низькі - це буде не в тому випадку, якщо ви щось зміните в одному місці, але завдяки копії -закріплена бізнес-логіка, яку ви легко забудете, вам потрібно змінити і десяток інших місць у кодовій базі. І навіть якщо вам вдасться знайти всі ці місця, час, щоб змінити їх усі (і протестувати зміни), напевно, набагато більше, як якщо б у вас є лише одне місце для зміни. Тож навіть ви можете зробити точну оцінку змін, оскільки витрати в десятки разів перевищують її, можна легко зіткнутися з бюджетом проекту.
TLDR - щоразу, коли ви розробляєте програму, де немає необхідності та не несе відповідальності за виправлення помилок та обслуговування оригіналу чи копії, сміливо копіюйте. Але якщо ви, ваша команда або ваша компанія несете відповідальність за них, застосовуйте DRY, коли зможете.
Приклад
Як додаток, дозвольте мені пояснити, що означає "виправлення помилок та технічне обслуговування", і як це призводить до непередбачуваності планування, особливо всередині одного продукту, на прикладі реального світу. Я дійсно бачив, як подібні речі відбуваються насправді, ймовірно, не зі 100 примірників, але проблеми можуть початися навіть тоді, коли у вас є лише один дублікат.
Завдання: створити 100 різних звітів для програми, кожен звіт виглядає дуже схожим, деякі відмінності в вимогах між звітами, якась інша логіка, але в цілому не багато відмінностей.
Розробник, який отримує це завдання, створює перше (скажімо, це займає 3 дні), після деяких змін або незначних виправлень помилок через QA та перевірку клієнтів закінчено, здається, він працює добре. Потім він почав створювати наступний звіт шляхом копіювання та внесення змін до всього, потім наступного, і для кожного нового звіту йому в середньому потрібно ~ 1 день. Дуже передбачувано, на перший погляд ...
Тепер, після того, як 100 звітів будуть "готові", програма переходить до реального виробництва, і виникають деякі проблеми, які були пропущені під час QA. Можливо, є проблеми з роботою, можливо, звіти регулярно виходять з ладу, можливо, інші речі не працюють за призначенням. Тепер, коли було застосовано принцип DRY, 90% цих проблем можна було вирішити, змінивши базу коду в одному місці. Але завдяки підходу копіювати-вставити проблему доводиться вирішувати 100 разів, а не один раз. І через зміни, які вже застосовуються з одного звіту в інший, розробник не може швидко скопіювати і вставити виправлення першого звіту в інший 99. Він повинен переглянути всі 100 звітів, прочитати їх, перекласти зміну на змінені повідомити, протестувати його та, можливо, налагодити кожен окремо. Для прем'єр-міністра це починає ставати дуже важко - він, звичайно, може зайняти час для "звичайного" виправлення помилок (скажімо, 3 години) і помножити це на 100, але насправді це, мабуть, неправильна оцінка, деякі з виправлень можуть бути легше зробити, ніж інші, іншим може бути складніше. І навіть якщо ця оцінка правильна, наявність налагодження коштує в 100 разів вище, ніж потрібно, коштуватиме вашій компанії чималі гроші.
Це станеться наступного разу, коли замовник попросить змінити колір емблеми своєї компанії у всіх цих звітах, щоб зробити розмір сторінки настроюваною або якоюсь іншою новою вимогою, яка впливає на всі звіти аналогічним чином. Тож якщо це трапиться, ви можете зробити оцінку витрат і розрахувати клієнта в 100 разів більше ціни, яку він повинен був би заплатити, коли код був ДУХИМ. Однак спробуйте це кілька разів, і тоді замовник скасує проект, оскільки він, ймовірно, не буде готовий платити ваші непомітні витрати на розвиток. І, можливо, в цей момент хтось задасть питання, чому це сталося, і вкаже пальцем на людину, яка прийняла рішення для цього програму копіювання-вставки.
Моя думка: коли ви виробляєте програмне забезпечення для інших, ви завжди принаймні на короткий проміжок часу несете відповідальність за те, щоб річ працювала, виправляла помилки, адаптувала програму під мінливі вимоги тощо. Навіть у проекті із зеленого поля ці деталі можуть швидко додати набагато більше, ніж спочатку заплановані зусилля по розробці. І особливо, коли весь ваш вставлений код копії знаходиться в одному продукті, період відповідальності є для всіх частин однаковим, що сильно відрізняється від ситуації, коли ви копіюєте вставлений старий код із мертвого проекту, якого більше немає. під активним обслуговуванням.