Які основні моменти ефективної роботи зі спадковим кодексом? [зачинено]


133

Я кілька разів бачив, як книга « Ефективна робота з попереднім кодексом» рекомендована. Які ключові моменти цієї книги?

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



2
Звичайно, сенс - додавати тести, а потім рефактор. Книга багато в чому стосується того, як вам вдається отримати неможливо складений код на тестуванні, і в цьому питанні є багато відкриваючих очей. Скажімо, що Пір’я не бере жодних полонених!
Кіліан Фот

9
Можливо, вам варто просто прочитати книгу
HLGEM

Приємний огляд тут: andreaangella.com/2014/03/…
rohancragg

Відповіді:


157

Основна проблема застарілого коду полягає в тому, що він не має тестів. Тож вам потрібно додати трохи (а потім більше ...).

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

Однак, щоб безпечно переробити фактор, ви повинні провести одиничні тести, щоб переконатися, що ви нічого не порушили зі своїми змінами ... Це привід 22 застарілого коду.

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

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

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

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

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

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


5
Зверніть увагу, коли вищевказана відповідь говорить "одиничні тести", це насправді означає "автоматизовані тести" . Для застарілого додатка велика частка спочатку корисних автоматизованих тестів насправді будуть інтеграційними тестами (де логіка тестування виконує більшу таблицю загального коду і може спричинити збої внаслідок дефектів у багатьох різних місцях), а не справжня одиниця тести (які спрямовані на аналіз лише одного модуля та виконання набагато менших частин коду кожен).
Lutz Prechelt

99

Швидкі способи отримати ключові моменти ефективної роботи зі спадковим кодом


3
MP3-посилання на цій сторінці Hanselminutes порушено, але посилання на hanselminutes.com/165/… не є - s3.amazonaws.com/hanselminutes/hanselminutes_0165.mp3 .
Пітер Мортенсен

Дякуємо Росстону за виправлення PDF-посилання. Схоже, що objectmentor.com пішов - можливо, "дядько Боб" пішов з бізнесу?
MarkJ

Я не впевнений, що сталося з наставником об'єкта, але в наші дні дядько Боб працює на 7-му Світлі.
Жуль

40

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

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

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

Скільки часу вкладається у цю спадкову систему 20-річної мільйони? Скажімо, 20 розробників за 20 років раз 2000 годин / річно (вони працювали досить важко). Давайте тепер підберемо число - у вас є нові комп’ютери та нові інструменти, і ви набагато розумніші за хлопців, які написали цей твір $% ^^ в першу чергу - скажімо, ви варті їх 10. У вас 40 чоловічих років, ну, чи ...?

Тож відповіді на ваше запитання є набагато більше. Наприклад, рутина, що становить 1000 рядків (у мене є декілька, які перевищують 5000), вона надмірно складна і є шматочком спагетті. Лише (ще одне слово з чотирьох літер) знадобиться кілька днів, щоб перерозподілити його на кілька 100 ліній підпрограм та ще кілька помічників на 20 рядків, правда? НЕПРАВИЛО. У цих 1000 рядках приховано 100 виправлень помилок, кожен з яких є недокументованою вимогою користувача або неясним краєм. Це 1000 рядків, тому що оригінальний порядок на 100 рядків не виконав цю роботу.

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

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


2
дякую за поради! Це ваші чи з книги?
Арман

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

7
"Це 1000 ліній, тому що початкові 100-лінійні рутини не зробили цю роботу". Тому дуже рідко це виявляється насправді так. Частіше за все це 1000 рядків просто тому, що оригінальний розробник засунув рукави і почав кодувати, перш ніж шкодувати навіть момент для планування чи дизайну.
Стівен Тузет

3
Ні. Я говорю, що в більшості випадків (я особисто стикався) 1000 рутинних підпрограм є чіткими ознаками того, що люди почали писати код, перш ніж задуматися над тим, як написати належну абстракцію. Тисяча підпрограм практично за визначенням є надто складною - ви хочете сказати, що тисяча рядків із сотнями прихованих, коментованих помилок є ознакою відповідального розробника?
Стівен Тузет

16
Якщо вірити кожній публікації на цьому веб-сайті, кожен має справу з кодом 1000 спагеті, але ще ніхто його не писав. З мого досвіду, 1000 (і 10000) рутинних ліній - це хороший знак розробників, які роблять все можливе, що можуть, з тим, що у них є, щоб доставити те, що вимагає від них начальник, який платить свою зарплату. Мені здається образливим і зухвалим те, що так багато розробників сміливо коментують з кулуарів, не знаючи обставин, при цьому ніколи не потрібно виставляти там власну роботу громаді на критику.
mattnz

19

Є два ключові моменти, які слід забрати з книги.

  1. Старий код - це будь-який код, який не має тестового покриття.
  2. Щоразу, коли вам доведеться змінити застарілий код, слід переконатися, що він має покриття.

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


6
+1 Відмінний момент: "Щоразу, коли вам доведеться внести зміни до застарілого коду, знайдіть час, щоб вилучити його спадковий статус".
Іван

3
Зняття статусу спадщини, отримайте мій голос :)
Рейчел

7

Що стосується оболонки горіха, це правда - додавання тестів і рефакторинг - це все, про що йдеться.

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

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