Як підійти до рефакторингу існуючої веб-програми?


11

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

То як би ви підходили до рефакторингу веб-програми? Які б речі я повинен шукати і в якому порядку? А що з грою браузера та функціональним веб-додатком? Чи буде тоді різниця у підході?


4
Якщо він не зламався, не виправляйте. Витрачайте більше часу на написання тестів і менше часу на внесення зайвих змін.
Macneil

Просто з інтересу. Якою мовою / технологіями ви користувалися для написання заявки? Що це за сайт? Дивіться welie.com/patterns -> Контекст дизайну -> Типи сайтів
JW01

@ JW01 Я використовую PHP для внутрішньої логіки та AJAX для управління переглядами та перевірки форми. Це був би варіант шаблону веб-додатків, але доступний лише в заданому середовищі, оскільки це внутрішній інструмент.
Eldros

У мене в голові була зовсім інша картина вашого додатка, коли я відповідав на питання. У вас набагато більше свободи змінювати API, ніж якби він був у відкритому доступі.
JW01

@ JW01 Я не хотів бути занадто конкретним, оскільки хотів, щоб це питання було корисним і для інших.
Eldros

Відповіді:


6

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

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

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

Редагувати: Тестування інтерфейсу: З попередженням про те, що у мене тут мало досвіду, мій друг робить це: він запускає частину коду, що генерує HTML. Потім він взломає свій код і порівнює новостворений код зі старою версією (використовуючи diff; він не автоматизував весь шлях). Зміни в HTML означають, що ваш рефакторинг зламався.


Як би ви порадили тестувати частину "view" застарілої програми - IE, HTML / JavaScript / CSS / etc частина? Я згоден, тестування одиниць - це шлях, але тестування коду програми здається важким для автоматизації.
Джастін Етьє

при створенні тестів для веб-інтерфейсу - порівняння старого HTML з новим HTML - це своєрідний тендітний спосіб виконання справ. Я схильний визначати семантику веб-сторінки і перевіряти це. Запитайте, наприклад, "Чи змінився веб-відбиток (назва сторінки, заголовок, ключові слова, вихідні посилання, форми)?" не "Чи змінився HTML?".
JW01

Ви можете протестувати веб-програми за допомогою "безголовного браузера" - в основному це бібліотека, яка є одиничним тестом, що таке браузер для QA-хлопця. У світі java є HTMLUnit (чистий java, автономний) та WebDriver (дистанційне управління реальним браузером, таким як FireFox). Мій проект має набір сотень тестів, написаних так.
Том Андерсон

@ JW01 Ви абсолютно праві - це дуже крихко. Він чудово підходить для тестування рефакторингу одноразовим способом: ви можете перевірити, що рефакторинг не змінив вихід, але щоразу, коли ви змінюєте створений HTML, вам потрібно зберегти "новий очікуваний" HTML.
Френк Шірар

10

Про це чудова книга під назвою "Ефективна робота зі спадковим кодом" Майкла Пір'я. Поміркуймо, у всіх нас є застарілий код.

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


3
"Давайте визначимось із цим, все, що ми робимо, - це написання завтрашнього програмного забезпечення завтра". - Мартін Фаулер
Френк Ширар

3
  • Так - Веб-додатки відрізняються від веб-сайтів

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

  • Почніть використовувати контроль над версіями

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

  • Зменшіть нескінченності

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

Ви повинні запитати себе, "даючи URL, яка його нормалізована форма?". Як тільки ви це закріпили. Тоді 50,0000+ URL-адрес на вашому сайті можна зменшити, скажімо, до 2000. що набагато простіше зрозуміти та керувати у своєму розумі.

див .: http://www.sugarrae.com/be-a-normalizer-a-c14n-exterminator/

  • Почніть з моделювання "що є", а не "того, що ви хочете, щоб це було"

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

Дивіться: http://www.joelonsoftware.com/articles/fog0000000069.html

Дивіться: http://www.laputan.org/mud/

  • Піддавати його тестуванню - це гарна ідея.

Створіть тестовий набір / фреймворк і почніть додавати тести. Але досить складно перевірити якийсь спадковий код. Отже, не зациклюйтесь на цьому. Поки у вас є рамки, ви можете додавати тести потроху.

Дивіться: http://www.simpletest.org/en/web_tester_documentation.html

  • Майте сміливість у своїх переконаннях

Більшість літератури про кращі практики розробки програмного забезпечення - це настільний / Enterprise App Centric. Незважаючи на те, що ваш сайт у халаті, ви читаєте ці книги, і можете бути в захваті від мудрості, яка випромінює їх. Але не забувайте, що більшість цієї найкращої практики була накопичена за часів до того, як Інтернет / SEO стали важливими. Ви багато чого знаєте про сучасну Інтернет, більше, ніж згадується в класичних книгах, таких як POEA, Gof тощо. З них можна багато чого взяти, але не відмовляйтеся повністю від власного досвіду та знань.


Я міг би продовжувати. Але це деякі речі, які я вибрав, коли переробляв старий спадковий сайт у блискучий новий.


Хороші довідкові посилання!
Нілеш

2

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

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

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

Навіть із застарілим кодом ви можете робити TDD, якщо вносите доповнення чи зміни. Просто напишіть тести спочатку на очікувані зміни, побачите їх невдачу, а потім внесіть зміни.

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

Зрештою, це багатоетапний процес. Не намагайтеся робити це все одразу, просто потроху.


-2

Якщо це досить некрасиво, щоб розізлити мене, мені досить некрасиво видалити всю річ і написати краплину заміни.

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


2
Я не згоден (хоча я вам не дав -1). joelonsoftware.com/articles/fog0000000069.html
JW01

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

Дуже погана ідея! Мені хотілося б, щоб я прочитав статтю Джоела Спольського, яка @ JW01 посилалася на 2 роки тому, перш ніж я вирішив переписати існуючий додаток PHP за допомогою програми Angular & Bootstrap. Angular & Bootstrap - це чудові технології, але я ВЖЕ намагаюся перетворити це старе додаток через 2 роки. Я повинен був просто змінити існуючий додаток, а не зірвав / замінив.
Зак Макомбер

Я погоджуюсь особливо, якщо враховувати ваш коментар. "сценарій" - це ключова річ, яка визначає рішення. Ви повинні зірвати той величезний API, який обслуговує весь ваш бізнес? Хто знає, є що розглянути. Ви хочете тести, перш ніж тестувати. Стаття, на яку посилається, занадто лінійна, тому що один розмір підходить всім, а як бути, коли щось баггі чи справді старий код? Чи дійсно стаття пропонує нам не переходити від застарілого коду, який новіший легше читати та підтримувати? У світі розробників немає чорно-білого, просто сценарії та рішення
Джеймс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.