Рефакторинг: Це не просто фантазійне слово для очищення коду? [зачинено]


21

Перш ніж вийшла книга Мартіна Фаулера "Рефакторинг: вдосконалення дизайну існуючого коду", ми називали основні зміни коду "архітектури" та незначні зміни "очищення". IMO, методи рефакторингу - це все здоровий глузд / очевидні речі, якими ми займаємось назавжди.

Як ви думаєте, рефакторинг колись був чимось новим? Можливо, просто спосіб навести хитрість управління на виділення часу на очищення коду?


Коли ви говорите «до того, як вийшла книга», я припускаю, що ви посилаєтесь на книгу Мартіна Фолвер, чи правильно це?
AlexC

-1: У чому корисність цього питання?
Джим Г.

Так, книга Фаулера.
Чак Стефанський

Відповіді:


43

Рефакторинг старший за пагорби, так що ні, це не щось нове.

І рефакторинг не прибирає. Добре, що може бути, але прибирання не обмежується.

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

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

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

Це незважаючи на те, які зміни в коді внесені, завжди слід проводити свої тести ... про всяк випадок.


1
Ньютопієць: це життєво важливий момент. Якщо ви не виконували свої тести, ви не знаєте, ви щось випадково зламали чи насправді реконструювали . (І звичайно, вам потрібен адекватний набір тестів!)
Френк Шірар

9

Це просто прибирання коду. По суті, програмісти (особливо Мартін Фаулер) зауважили, що вони, як правило, виконують одні й ті ж завдання щоразу, коли прибирають код. Вони визначили та позначали методи прибирання та пов'язані з цим проблеми коду та престо! Народився рефакторинг.

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

Немає ніякої магії рефакторингу; це лише новий набір жаргону для опису старої практики.


Вільям Опдіке, 1992: Рефакторинг об'єктно-орієнтованих рамок . Фаулер та Бек та друзі популяризували рефакторинг. Джон Брант та Дон Робертс впровадили перший автоматизований інструмент за деякий час до 1999 року. Тому "новий набір жаргону" не дуже точний.
Френк Ширар

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

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

Дійсно, я згадав, що це був новий жаргон ... відносно числення лямбда.
Френк Ширар

@ Чак, ти читав книгу, Рефакторинг? Якщо так, я був би дуже здивований, якби ви не дізналися з нього чогось нового.
Марсі

7

Ми робимо три окремі речі в нашій компанії, виділивши час для трьох:

  • Рефакторинг: полягає у зміні структури коду, зберігаючи таким чином поведінку.

Приклад: розділення некрасивого та нечитабельного методу на 100 рядків, який робить чотири речі на чотири способи багаторазового використання, по 25 рядків.

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

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

  • Забезпечення правил StyleCop / FxCop: полягає у перевірці, чи відповідає код набору за замовчуванням правилам StyleCop або FxCop, а якщо ні, то змініть його, щоб відповідати цим правилам.

Приклад: додавання Culture.Invariantв string.Format(або іншу культуру , яка є більш підходящим).

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


4
Хоча я згоден з тим, що між очищенням та повторним фактором є принципова різниця, є багато випадків, коли ця лінія розмивається досить сильно. Видалення мертвого класу та «очищення» всіх посилань на нього з підписів методів чи інших асоціацій вважатиметься чищенням чи рефакторингом? Я також категорично не погоджуюся з тим, що виконання тестів одиниці не є обов'язковим. Ви поняття не маєте, як все може зламатися. Я бачив зміни в рядку повідомлень про код розриву винятку, тому що хтось вважав, що це було б гарною ідеєю проаналізувати його, щоб діяти на деякі помилки.
Ньютопський

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

Ви завжди повинні робити повноцінну збірку після будь-якого очищення - навіть якщо це просто пробіл та зміни коментарів. Запитайте будь-яких авторів Python або Makefile про це.
JBRWilkinson

3

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

Сподіваємось, що багато кращих кроків - малих та великих - дають кращу програму.


3

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

"Очищення" може означати що завгодно - від "переформатування трохи" до "переписування великих шматок".

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

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


2

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


1
Це цікавий спосіб на це подивитися. Можливо, це походить з моєї бази даних, але є щось, що дратує мене від стресу щодо рефакторингу, і ви допомогли мені покласти на це палець. Це те, що в базі даних те, що ви не виправляєте в дизайні, потребує 10 разів більше часу, щоб виправити тестування і, ймовірно, на 1000 разів довше у виробництві. Тож хороший DBA є анальним щодо того, щоб виправити речі на якомога більш ранній стадії. Моє відчуття кишки полягає в тому, що занадто багато часу на рефакторинг на пізніх стадіях свідчить про занадто мало часу, витраченого на проектування.
користувач21007

@ user21007: Код набагато складніше, ніж схема бази даних, але набагато простіше змінити та розгорнути.
кевін клайн

1

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

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

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


0

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

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


1
перейменування - це стандартна техніка рефакторингу!
Чак Стефанський

0

Я б сказав, що ні.

У процесі рефакторингу може бути очищення, але це не суть.

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

DRY - ключовий привід рефакторингу.

При додаванні нових кодів до існуючої бази кодів рефакторинг проводиться природним шляхом за принципом DRY.

Всього мої 0,02


0

Прибирання коду - це як прибирання будинку, реконструкція - це те, як зірвати стіну і, можливо, поставити її десь в іншому місці


0

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


Я не фанатик модного слова, але іноді загальні завдання потрібно маркувати та формалізувати, щоб усі знали, про що ти говориш. Клієнт повідомляє про помилку, а менеджер кричить: "Іди чисти свій код!" ви знаєте, що вони не говорять про рефакторинг.
JeffO

0

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


-1

Ні. Рефакторинг - це поліпшення структури без зміни поведінки. Рефакторинг у строгому сенсі тягне за собою добру випробувальну дисципліну. Це не обов'язково, коли ви "прибираєте речі".


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

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

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

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

-1

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


-2

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

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