Які підходи я можу застосувати, щоб зменшити шанси введення нових помилок у складний застарілий додаток?


10

Там, де я працюю, мені часто доводиться розробляти (і виправляти помилки) в старій системі (.NET 1), чий код - це повні спагеті - з невеликою думкою, приділеною іменам змінних, структурі програми та коментарям.

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

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


Відповіді:


16

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

  1. Напишіть тести на частину, яку ви збираєтесь змінити. Це також допоможе вам зрозуміти, як поводиться існуючий код.
    • Код Refactor для підтримки тестування, якщо потрібно, але ви, можливо, захочете написати невіддільні тести, якщо часу не вистачає.
  2. Запустіть тести, щоб переконатися, що все працює так, як ви очікували.
  3. Внесіть зміни. Рефактор, якщо це потрібно в дусі постійного вдосконалення коду, але не захоплюйтеся.
  4. Перезапустіть свої тести, щоб переконатися, що ви підтримували таку ж функціональність.

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

Можливо, вам також буде корисна робота з попереднім кодом Майкла Пірса.


1
+1 для "... але ви, можливо, захочете написати невіддільні тести, якщо часу не вистачає."!
Марсі

1
Хороша відповідь. @ m.edmondson Ви також можете виявляти, що певні частини коду є "величезними", оскільки скрізь є дублювання, і що при рефакторі він стає меншим і простішим.
Альб

6

Я хотів би слідувати Дядя Боб Мартін «s Boy у відповіді Scout Rule :

"Коли у вас є велика безладна спадщина, що вам потрібно зробити, це ... Що вам потрібно зробити, це перестати робити меси і почати їх прибирати.

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

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


2

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

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


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

@ m.edmondson: Ага. Добре, якби у них був вичерпний набір тестових одиниць, тоді просто запущений, який би перевірив, чи хороший рефактор чи ні. Як це не звучить, у них цього немає, тому вам доведеться писати одиничні тести самостійно. Я знаю, що це непросто, і немає реальної остаточної відповіді на цю проблему (принаймні, не одну, яку я знайшов, хоча я буду дивитись, що пропонують інші люди, як я теж був там).
FrustratedWithFormsDesigner

2

Вам справді потрібно витратити місяці на рефакторинг коду? Або ви можете змінити код, коли вносите зміни. Так, наприклад, якщо ви визначите, що метод Foo потребує модифікації, ви можете скористатися можливістю повторно змінити метод Foo. І якщо вам доведеться переглянути десяток інших методів, щоб зрозуміти, що Фоо - це проблема, ви можете залишити коментарі до цих методів, щоб ви чи хтось у майбутньому знав, що повинен робити код. Звичайно, це означає, що ще є купа коду спагетті, але ви можете принаймні перемістити базу коду в правильному напрямку і полегшити себе вниз по лінії. Отримати декілька місяців часу на код рефактора буде великим продажем, тому що це означає, що ви протягом цього часу не доставляєте нічого, що бажає кінцевий користувач.

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


0

Ще одна порада. Коли клопи виявляться і після накладення пов’язки не зупиняйтесь на цьому!

Запитайте п’ять вітрів, візьміть червону таблетку і подивіться, наскільки глибоко йде кроляча нора, і зафіксуйте першопричину (і шлях донизу).

Ви багато дізнаєтесь про систему. Це допомагає визначити пріоритет, що виправити та рефактор. А після кількох таких поїздок у вас є міцні «опорні балки», щоб зміцнити монолітну купу спагетті.


0

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

// old code
...

if (!File.ReadAllText("c:\patch_control.txt").Contains("StrangeUIBugFix=0"))
{
    // new code goes here
    ...
}

// old + new code
int someValue = 
    IsEnabled("StrangeUIBugFix") ? a + b :  // new code
    a * b; // old code

0

Одна річ: Never change any existing code if you are not sure what effect change would have on complete application.

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