Я кілька разів бачив, як книга « Ефективна робота з попереднім кодексом» рекомендована. Які ключові моменти цієї книги?
Чи набагато більше стосунків зі застарілим кодом, ніж додавання тестів на одиницю / інтеграцію, а потім рефакторинг?
Я кілька разів бачив, як книга « Ефективна робота з попереднім кодексом» рекомендована. Які ключові моменти цієї книги?
Чи набагато більше стосунків зі застарілим кодом, ніж додавання тестів на одиницю / інтеграцію, а потім рефакторинг?
Відповіді:
Основна проблема застарілого коду полягає в тому, що він не має тестів. Тож вам потрібно додати трохи (а потім більше ...).
Це само по собі зайняло б багато роботи, як зазначав @mattnz. Але особливою проблемою застарілого коду є те, що він ніколи не був розроблений для перевірки . Тому зазвичай це величезна суперечливість коду спагетті, де дуже важко або прямо неможливо виділити дрібні деталі, які підлягають випробуванню. Тому перед тестуванням одиниці потрібно перефактурувати код, щоб зробити його більш зрозумілим.
Однак, щоб безпечно переробити фактор, ви повинні провести одиничні тести, щоб переконатися, що ви нічого не порушили зі своїми змінами ... Це привід 22 застарілого коду.
Книга вчить, як вийти з цього улову, вносячи абсолютні мінімальні, найбезпечніші зміни в коді лише для того, щоб увімкнути тести першого блоку. Вони не призначені для того, щоб зробити дизайн приємнішим - лише для того, щоб увімкнути одиничні тести. Насправді іноді вони роблять дизайн більш потворним або складнішим. Однак вони дозволяють писати тести - і, як тільки ви встановите одиничні тести, ви можете зробити дизайн краще.
Існує маса хитрощів, щоб зробити код перевіряючим - деякі начебто очевидні, а інші - зовсім. Є методи, про які б я ніколи не думав про себе, не читаючи книги. Але що ще важливіше, це те, що Пір'я пояснює, що саме робить блок коду перевірити. Вам потрібно скоротити залежності та ввести бар'єри у свій код, але з двох різних причин:
Вирізати залежності безпечно може бути складним. Представлення інтерфейсів, макетів та залежних ін'єкцій є чистою та приємною метою, просто не обов'язково безпечною для цього. Тому іноді доводиться вдаватися до підкласи випробовуваного класу, щоб перекрити якийсь метод, який, як правило, наприклад, запустив прямий запит до БД. В іншому випадку нам може знадобитися навіть замінити клас залежності / банку на підроблений у тестовому середовищі ...
Для мене найважливіша концепція, яку принесли Пір'я, - це шви . Шов - це місце в коді, де ви можете змінити поведінку своєї програми, не змінюючи сам код . Побудова швів у вашому коді дозволяє відокремити фрагмент коду, що перевіряється, але він також дозволяє відчути поведінку тестового коду, навіть якщо це важко або неможливо зробити безпосередньо (наприклад, через те, що виклик вносить зміни в інший об'єкт або підсистему , стан якого неможливо запитувати безпосередньо з методу тестування).
Ці знання дозволяють помітити насіння доказовості у найгустішій купі коду та знайти мінімальні, найменш руйнівні, найбезпечніші зміни, щоб потрапити туди. Іншими словами, щоб уникнути «очевидні» рефакторінга , які мають ризик злому коду без вас помітити , - тому що ви не ще є юніт - тести , щоб визначити , що.
Швидкі способи отримати ключові моменти ефективної роботи зі спадковим кодом
Я працюю над кодовою базою мільйонів рядків коду, деякі починаються з 1980-х. Це просто програмне забезпечення, тому лише питання написання декількох одиничних тестів, тож ви можете перейти і просто переробляти його, і зробити його набагато кращим.
Ключове слово тут якраз - це чотирибуквене слово, яке не належить до жодної лексики програміста, не кажучи вже про те, хто працює над застарілими системами.
Як довго, на вашу думку, потрібно пройти тест на одиницю, щоб перевірити одну годину зусиль на розробку? Для обговорення скажімо ще годину.
Скільки часу вкладається у цю спадкову систему 20-річної мільйони? Скажімо, 20 розробників за 20 років раз 2000 годин / річно (вони працювали досить важко). Давайте тепер підберемо число - у вас є нові комп’ютери та нові інструменти, і ви набагато розумніші за хлопців, які написали цей твір $% ^^ в першу чергу - скажімо, ви варті їх 10. У вас 40 чоловічих років, ну, чи ...?
Тож відповіді на ваше запитання є набагато більше. Наприклад, рутина, що становить 1000 рядків (у мене є декілька, які перевищують 5000), вона надмірно складна і є шматочком спагетті. Лише (ще одне слово з чотирьох літер) знадобиться кілька днів, щоб перерозподілити його на кілька 100 ліній підпрограм та ще кілька помічників на 20 рядків, правда? НЕПРАВИЛО. У цих 1000 рядках приховано 100 виправлень помилок, кожен з яких є недокументованою вимогою користувача або неясним краєм. Це 1000 рядків, тому що оригінальний порядок на 100 рядків не виконав цю роботу.
Вам потрібно працювати з розумовим набором, " якщо він не зламався, не виправляйте ". Коли він зламаний, вам потрібно бути дуже обережним, коли ви виправляєте його - як ви зробите це краще, щоб ви випадково не змінили щось інше. Зауважте, що "зламаний" може містити код, який неможливо досягти, але працює правильно, що залежить від системи та її використання. Запитайте: «що станеться, якщо я це накручу і зроблю ще гірше», бо одного дня ти будеш, і тобі доведеться сказати начальникові начальника, чому ти вирішив це зробити.
Ці системи завжди можна зробити кращими. У вас буде бюджет, на який ви зможете працювати, терміни, будь-що. Якщо ви цього не зробите - ідіть і зробіть її. Перестаньте робити це краще, коли гроші / час закінчуються. Додайте функцію, приділіть собі час, щоб зробити її трохи кращою. Виправити помилку - знову ж таки, приділіть трохи додаткового часу та покрасьте її. Ніколи не доставляйте його гірше, ніж було, коли ви починали.
Є два ключові моменти, які слід забрати з книги.
Як вказували інші респонденти, спроба попередньо оновити існуючий застарілий код - це дурень . Натомість, щоразу, коли вам доведеться внести зміни до застарілого коду (для нової функції або виправлення помилки), знайдіть час, щоб видалити його спадщину.