Чому "копіювати та вставляти" код небезпечно? [зачинено]


130

Іноді мій начальник скаржиться на нас:

Чому нам потрібен такий довгий час, щоб реалізувати функцію?

Власне, ця функція вже була реалізована в іншій програмі, вам просто потрібно скопіювати та вставити звідти коди. Вартість повинна бути низькою.

Це справді важке запитання, оскільки копіювати та вставляти коди - це не така проста річ, на мій погляд.

Чи є у вас якісь вагомі причини пояснити це своєму нетехнічному начальнику?


19
це начебто звучить як замість копіювання та вставлення коду з попередніх додатків у новий, ви переписуєте ту саму функціональність знову і знову. Я думаю, що принцип DRY орієнтований більше на те, щоб не дублювати однакову функціональність у всій системі, але повторне використання коду з інших додатків краще, ніж повторне його написання.
Карсон Майєрс

5
Тому що кожного разу, коли ви копіюєте та вставляєте код, дитяча печатка вбивається.
DeadlyChambers

@CarsonMyers Тільки якщо компонент багаторазовий. І це покликане відповідати поточному контексту.
Sreekanth Karumanaghat

Відповіді:


171

Якщо ви знайдете помилку у своєму коді копію-вставки, вам потрібно буде виправити це в кожному місці, яке ви зробили, і сподіваєтесь, що ви зможете запам'ятати їх усіх (це також стосується змінених вимог).

Якщо ви зберігаєте логіку в одному місці, її легше змінити, коли потрібно (тому якщо ви вирішите, що додаток потребує оновлення, ви робите це лише в одному місці).

Попросіть свого начальника прочитати про принцип DRY (не повторюйте себе).

Те, що ви описуєте, звучить як ідеальне використання для бібліотек , де ви ділитесь кодом і зберігаєте його лише в одному місці.

Я б коли-небудь копіював і вставляв код, якщо я мав намір перефактурувати його незабаром після цього - переконуюсь, що пізніше я витягнув загальний код, щоб я міг повторно використовувати якомога більше логіки. І незабаром я маю на увазі хвилини та години пізніше, а не дні та тижні.


41
+1. Справа в тому, що копіювати та вставляти дешево для вирішення негайної проблеми. Справжня проблема полягає в тому, що в середньо / довгостроковій перспективі підтримання дубльованого коду набагато вище, ніж добре обгрунтований код
Паоло

7
Це не лише проблема помилок; вимоги до програми можуть змінюватися. Я змінив чотири з п’яти місць, де раніше щось потрібно було змінити.
Девід Торнлі

1
Якщо ви можете скопіювати-n-вставити на вимогу та відстежити, де дублікати легко або пізніше їх абстрагувати, або оновити, то скопіювати та вставити - це не погано. Дивіться дискусію про виявлення клонів на веб-сайті www.semanticdesigns.com/Products/Clone, щоб отримати детальнішу інформацію та інструменти, ніж це можна зробити.
Іра Бакстер

4
Тут багато ifs, і більшість інструментів не підтримують виявлення клонів на даний момент.
Одід

2
Колись там був програміст, який працює в ESA . Він працював над програмним забезпеченням для ракети "Аріан-5" і використовував метод копіювання-вставки. Тоді s ... буває
Hauleth

25

Ви б набагато краще поділитися кодом, створивши бібліотеку, а не копіюючи код за допомогою копіювання та вставки.

Ви все одно отримаєте перевагу в швидкості від переписування (шукайте DRY), але у вас буде лише одне місце для підтримки коду.


1
Мені просто цікаво, чому б ви "вирізали" код, якщо все, що вам потрібно зробити, це дублювати його?
dpp

Хороший пункт дпп. Відредаговано!
CResults

12

Очевидною причиною є те, що ви берете на себе «борг» на майбутнє: будь-які зміни, які вам коли-небудь потрібно буде внести в код (не лише виправлення помилок, будь-які зміни), тепер будуть вдвічі дорожчими, оскільки вам доведеться оновити два місця - і більш ризиковано, оскільки ви з часом забудете одну з них. Іншими словами, прискорення роботи зараз зробить вашу роботу ще повільнішою в майбутньому, що може бути корисним для бізнесу, але зазвичай це не так.

Але більш важлива причина полягає в тому, що припущення "це те саме, що" є частіше, ніж непомітно помилковим. Кожного разу, коли ваш код залежить від правильності невисловлених припущень, його копіювання в інше місце призводить до помилок, якщо ці припущення також не містяться на новому місці. Тому вставлений код часто помиляється з самого початку, а не тільки після наступної зміни.


11

Копійований на копіювання код, безумовно, - це катастрофа, яка може спричинити багато проблем у майбутньому. Але ви питаєте , чому це займе у вас багато роботи прямо зараз , відповідь: тому , що він ніколи не просто копіювати і вставляти.

Якщо оригінальний код був написаний з метою повторного використання, як досить незалежної бібліотеки, з урахуванням гнучкості та використання клієнтів - то чудово, але це не копіювання-вставка, це використання бібліотеки коду. Копіювання справжнього коду зазвичай йде приблизно так:

  • "Звичайно, у мене вже є код, який робить саме це!"
  • "Зачекайте, яку з цих п'яти версій коду я хочу використовувати як джерело?"
  • "Гммм, що роблять усі ці функції 'util_func_023'? Не я їх документував? Яка з них мені зараз потрібна?"
  • "О, так, цей код використовує Code Base Y. Зрозуміло, мені потрібно [ вибрати один: скопіювати всю базу коду Y у мій новий проект / провести день, вилучаючи одну функцію, яку я хочу з бази коду Y / витратити тиждень на видобуток одну функцію, яку я хочу отримати з бази коду Y]. "
  • "Я все скопіював, так!"
  • "Чому це не працює?"
  • Це момент, коли ви проводите години / дні / тижні, налагоджуючи існуючий код, подібний до того, що ви хочете, замість того, щоб писати код, який ви насправді хочете почати.

Підсумовуючи це, існуючий код, який неможливо використати безпосередньо, в кращому випадку може слугувати хорошою орієнтиром для написання подібного коду. Це, звичайно, не може бути знято цілим і, як очікується, працюватиме в зовсім іншій системі. Взагалі, це безпечне припущення, що будь-який код, написаний та завершений, повинен бути змішений якомога менше - навіть коли це копія, а не сам оригінал.

Якщо ви хочете базувати свій проект на копіюванні, вам слід розпочати кодування таким чином, що дозволить легко використовувати повторно, не копіюючи цей оригінальний код і не возившись з ним. Це варто зробити, і якщо це очікує ваш начальник, то вам обом потрібно переконатися, що саме так ви проектуєте та працюєте.


9

копіювання та вклеювання - це лихо, яке чекає, що трапиться Ваш начальник повинен оцінити ціну доставки на ранніх термінах стосовно ціни на зламаний код, який буде доставлений кінцевому користувачеві дуже скоро.


9

Якщо ви вже реалізували функції та вам потрібно скопіювати та вставити, щоб повторно їх використовувати, це здається, що ви зробили щось не так. Ви не можете помістити ці функції в бібліотеку, щоб ви могли повторно їх використовувати без копіювання / вставки?


8

Принцип DRY (не повторюй себе): DRY на wikipedia .

"Кожна частина знань повинна мати єдине, однозначне, авторитетне представлення в системі".

інше посилання .


Це як сказати: "ніколи не впирайте ніж у горло чоловікові", що звучить як дуже хороше правило. Поки ви не зрозумієте, що лікар ПОВИНЕН порушити це правило, щоб виконати трахіотомію, щоб врятувати життя чоловіку (якщо він не може дихати, можливо, через анафілаксію, надзвичайну алергічну реакцію). Кожне правило має виняток (за винятком, мабуть, для цього - що кожне правило має виняток). Тому кожне правило повинно мати список причин, коли, коли і виключень, і все це додається, для справжньої "інженерної" реальності, на яку відповідає справжня відповідь, це залежить ...
MicroservicesOnDDD

Отже ... коли ви НЕ слідуєте СУХОМ? Я постійно борюся з цим на своїй теперішній роботі, яка пов'язана з прошивкою, і відповідь полягає в тому, що ми "розкручуємо петлі" і робимо інші речі, тому що це "покращує продуктивність". У нас дуже неглибока ієрархія успадкування, і ми використовуємо більшість класів безпосередньо, а не підкласифікувати їх, і ... ... ми багато використовуємо копіювати та вставляти. І я ненавиджу це, оскільки це робить нашу базу коду важче зрозуміти і важче підтримувати. Але у нас є свої причини, і вони є прийнятними причинами. Ми не єдині зацікавлені сторони. І знайти правильний баланс - це більше мистецтво.
MicroservicesOnDDD

7

Мені здається, що найгірше помилкове уявлення вашого начальника, яке не є технічним, - це те, що ваша робота переважно набирає текст. Вони думають, що ви можете заощадити багато часу, усунувши набравши текст.

Я думаю, що найкраща освіта, яку ви могли б дати цій людині, - це вказати на всю роботу, яку ви робите, а не набравши текст. Навіть якщо більша частина цієї роботи зазвичай відбувається непомітно, в голові, одночасно з набором тексту.

Звичайно, усунення введення тексту дозволить заощадити деякий час. Але тоді значно більша частина, яка не набирає текст, частина вашої роботи стає більшою і з'їдає будь-яку економію часу та більше того.


4

Ви впевнені, що ваш начальник хоче дізнатися про принципи DRY, помилки та інші технічні речі?

Такі коментарі ви зазвичай чуєте, коли ваш начальник чи компанія занижували час, необхідний для завершення якогось проекту. І на підставі неправильної оцінки був підписаний контракт тощо. У більшості випадків програмісти не брали участь в оцінках.

Чому це відбувається? Іноді спонсор проекту має занадто малий бюджет. Можливо, бізнес-процес, який ви автоматизуєте за допомогою програмного забезпечення, не варти зусиль вашої команди. Як правило, менеджери, як правило, дуже закриті для поганих новин у таких випадках. На початку проекту є бажане мислення. Тоді менеджери намагаються звинувачувати програмістів. У вашому випадку непрямим способом скопіюйте та вставте. У крайньому випадку це називається маршем смерті .


3

Копіювання та вставлення коду зазвичай призводить до програмування за допомогою співпадіння


Я вважаю цю статтю винятково погано написаною. Оповідання залишається абстрактним, таким чином, не вдається пролити світло на випадок поза тим, що Фред працює ітеративно. Однією з очевидних проблем у Фреда є те, що він не має гарного уявлення про загальну архітектуру. На жаль, це дуже часто трапляється, коли ми працюємо з недокументованим застарілим кодом, де втрачаються ноу-хау. Посилання на дизайн за допомогою контрактного та асертивного програмування досить хороші, але, на жаль, навіть після них приклади / вправи залишаються незрозумілими.
mapto

3

Я думаю, що " інша програма " є ключовою тут, якщо інша програма вже перевірена та використовується, її не слід змінювати, щоб використовувати загальну бібліотеку, тому ви не можете поділитися кодом з нею.

У тому ж додатку «копіювати та вставляти» погано, але між кодовими базами, розробленими різними командами або з різними циклами випуску, «скопіювати та вставити» може бути найкращим варіантом.


Хоча я бачу, що випускати оновлення для іншого додатка мало лише для використання бібліотеки, напевно, було б хорошою ідеєю принаймні зробити вказівку при необхідних змінах у галузі функції. Це дасть вам певну впевненість, що інтерфейс бібліотеки був достатньо загальним для принаймні двох розглянутих додатків, і дозволить вам об'єднати зміни у відповідний момент циклу випуску.
СамБ

2

Я працював у подібній компанії. Будучи стажистом, я тоді не знав кращого, тому, коли я розпочав новий проект, мій начальник також запропонував вставити код з іншого місця. Ну, як ви можете подумати, все програмне забезпечення було досить безладним, аж до того, що, коли ви намагалися виправити помилку, з’явились дві нові помилки.


2

Навіть якщо інша програма вже має необхідну вам функцію, код для цієї функції може просто не вписатись у вашу поточну програму без капітального перезапису. Це як взяти мотор Ford і намагатися помістити його в Toyota. Як правило, існує правило, що якщо вам доведеться змінити більше 25% коду, який ви копіюєте, краще (дешевше) переписати його з нуля.

Витягнення коду, про який йде мова, звучить в бібліотеці, але це може бути складніше, ніж це звучить, залежно від того, як побудована інша система. Наприклад, код для цієї функції може бути важко дістати, оскільки він інтерфейсує безліч інших кодів нечистими способами (наприклад, шляхом доступу до безлічі глобальних змінних тощо)


1

Скажіть своєму начальникові, що частина імені кожної змінної включає в себе назву старого проекту, і тепер ви повинні змінити їх усі вручну. Якщо ваш начальник не знає (або хоче знати), чому копіювати / вставляти це погано, він / вона може так само повірити :)


1

Так, найбільша проблема полягає в тому, що це не просто скопіювати та вставити - його копію потім вставити, а потім трохи змінити.

Потім, коли один із вставлених варіантів має проблему, він змінюється. Потім згодом змінюється інший варіант.

Потім ви дізнаєтесь, що всі варіанти повинні змінитися, оскільки в оригінальній копії були помилки. Тепер ви добре і по-справжньому викручені, тому що всі обклеєні ділянки тепер не однакові.

І хіба ви цього не знаєте, таке шалене кодування зазвичай майже повністю втрачає коментарі.

Для мене різниця полягає в тому, що коли у вас є кілька копій коду, які роблять те саме, у вас є купа коду. Коли у вас є лише один фрагмент коду, який робить кожну конкретну річ, тоді у вас є система.

Поведінки системи можна змінити за допомогою одноточкових модифікацій досить легко - зміна поведінки купи коду вимагає купового коду.

Мені подобаються системи, а не купа коду.


1

Існують компроміси між швидкістю розвитку безпосередньої функціональності перед вами (особливо, коли додаток невеликий), і більш тривалими витратами на обслуговування по мірі зростання програми.

Копіювання та вставка швидше для негайного функціонування, але дорого коштуватиме вам, оскільки додаток збільшується в розмірі, з точки зору виправлення помилок та внесення змін у систему та підтримання робочих процесів між різними компонентами програми.

Це аргумент, який потрібно почути власникам бізнесу. Це схоже з прийнятими витратами на утримання парку транспортних засобів, однак, із програмним забезпеченням, порушені аспекти архітектури програмного забезпечення, як правило, приховані до ділової сторони, і їх можуть бачити лише розробники.


0

Він правий, що якщо команда раніше застосувала подібну функціональність, повторити це буде набагато простіше вдруге.

Однак, напевно, слід пояснити, що кожна програма є різною. Тільки тому, що ви встановили двері в одному будинку, це не означає, що ви можете встановити іншу двері в іншому будинку за короткий час - ви будете швидшими через досвід (# двері встановлено), але все одно знадобиться час, щоб отримати обладнання , встановіть дверцята, переконайтесь, що вона стоїть, і вкрутіть її в раму.


0

у моїй компанії ми завжди працюємо з класами та методами та робимо для них технічну документацію. Я думаю, що це найкраща практика, якщо ви можете використовувати власні додатки пошуку svn з хорошими клавішами, щоб знайти клас методів, що використовувався раніше :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.