Коли робити рефактор


32

Я прочитав більшу частину книги Фаулера "Рефакторинг" і відремонтував багато застосунків у минулому великому і малому.

Одна з найскладніших речей, яку я можу навчити, - це "коли" для рефактора. Я схильний робити це на основі відчуття кишки, яке мені чудово служило в минулому. Однак, коли вступати в дискусії з людьми про те, чи слід частину коду залишити в спокої чи відреставрувати зараз, важко стояти за «перевірку кишок».

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

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


2
По суті, ви запитуєте те саме, що і це: programmers.stackexchange.com/questions/6268/… . За винятком того, що ваш поріг вжиття заходів нижчий, оскільки вартість та ризик нижчі, правда?
S.Lott

Відповіді:


22

Рефактор, коли вартість рефакторингу менша за вартість не рефакторингу.

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


коротка форма та досконала
ZJR

8
Іншими словами: "варто рефакторировать, коли варто рефактор". Дух. Ну, це насправді не відповідь, це :) Measure "cost" however you can.- Гаразд, як? Чи не в цьому суть питання? Яку перспективу слід застосовувати при вимірюванні цієї вартості?
Конрад Моравський

2
@Morawski: ні, це неправильна парафраза. Я сказав, що варто рефакторингу, якщо значення, отримане від рефакторингу, перевищує вартість рефакторингу. Це не те саме, що говорити "варто його переробляти, коли воно коштує рефактор". Розрахуйте вартість рефакторингу. Розрахуйте вартість не рефакторингу. Який більший?
Брайан Оуклі

@BryanOakley: Проблема в тому, що ви не можете "розрахувати" ці витрати. Ви можете в кращому випадку оцінити їх, що насправді важко зробити, якщо мова йде про вартість не рефакторингу . Який мультиплікатор витрат на технічне обслуговування ви застосовуєте до нефабрикованої версії та відновленої версії? Звідки ви знаєте, чи потрібно взагалі підтримувати чи змінювати відповідний код? Як ви оцінюєте кількість помилок, які він буде генерувати? Зрештою, я гадаю, що всі ми підсвідомо робимо такі оцінки як частину нашого процесу прийняття рішень, коли ми думаємо про рефакторинг, але точності від цього не можна очікувати.
guillaume31

1
@ ian31: правда, ви не можете обчислити значення, і найкраще, що ви можете зробити, це оцінити. Але це єдиний дійсно дійсний спосіб вирішити, чи потрібно рефактор чи ні, якщо у вас є обмежений час та ресурси. Потрібно вирішити, чи варто рефактор того. Як ви визначаєте "варто" - це дуже неточна наука. Справа в тому, що ви не повинні рефакторировать почуття кишки - має бути вагома причина для того, щоб робити рефакторинг, крім "я хочу, щоб код був гарнішим".
Брайан Оуклі

12

  1. Чи цикломатична складність функції нижче 5?
  2. Ви повністю зрозуміли, що таке цикломатична складність, не перейшовши на це посилання?
  3. Чи є у вас автоматизований тест або документально підтверджений тестовий випадок для кожного шляху через функцію?
  4. Чи проходять усі існуючі тестові справи?
  5. Чи можете ви пояснити цю функцію, і все це стосується кращих випадків мені менше ніж за 1 хвилину?
  6. Якщо ні, то як приблизно 5 хвилин?
  7. 10 хвилин?
  8. Чи є у функції менше 100 рядків коду (включаючи коментарі)?
  9. Чи можете ви знайти двох інших розробників, які погоджуються з цим кодом, помилковим є лише візуальний огляд?
  10. Чи використовується ця функція лише в одному місці?
  11. Чи відповідає функція цілям продуктивності (Час / Пам'ять / ЦП)?

Оцінка балів

Додайте відповіді "ні" вище:

  • 0-1 - Чому ви б навіть подумали про те, як це рефакторинг? Напевно, ви просто хочете перейменувати змінні, тому що вам не подобається попереднє правило іменування розробника
  • 2-5 - Це може знадобитися трохи переробити, але я б не затримав випуск продукції для чогось із цього діапазону
  • 6-8 - Гаразд, нам, мабуть, потрібно це виправити ... Ймовірно, ми будемо продовжувати переглядати це та / або насправді не знаємо, що це робить. Ще на огорожі, але це дуже підозріло
  • 9+ - Це головний кандидат на рефакторинг. (Зауважте, написання тестових випадків - це форма рефакторингу)

http://mikemainguy.blogspot.com/2013/05/when-to-refactor-code.html


4
# 2 звучить дуже снобізмом і насправді марно для оцінки коду . №3 та №4 не кожна компанія використовує одиничні тести. # 8 Уникайте коментарів, де це можливо, і 100 рядків є надто високими. У мене є 1 великий широкоекранний монітор у портретному режимі, і я ледве зможу побачити всю функцію одразу. Якщо фактичного коду більше 15 рядків, то вже має бути вагома причина, чому ви зберігаєте його таким чином. Приємний, практичний підхід - мати контрольний список, але занадто багато балів тут просто складаються або використовують випадкові значення без будь-яких міркувань.
Р. Шмітц

8

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

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

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

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

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

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


2

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

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

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

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


2

"Коли робити рефактор?"

Коротка відповідь: кожен раз, коли ви стикаєтеся з кодом, який погано пахне або його можна вдосконалити ( Правила хлопців-скаутів )

Практично це відбувається:

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

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

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

1

Коли я вперше дізнався про рефакторинг, мій наставник сказав мені: "Зробіть це двічі, затримайте ніс. Зробіть це тричі. Рефактор". (Спасибі, Джош!) Якщо бути конкретним, то, що він говорив, було те, що коли ти збираєшся втретє написати той же блок коду (або навіть подібний зразок коду), це час для рефактора. Я дотримувався цього протягом останніх 10 років і виявив, що це досить звукове правило.

Використання Eclipse або подібної IDE, яка має потужну підтримку рефакторингу, зменшує зусилля для рефакторингу. Підтримка IDE робить більш ймовірним, що ви зробите рефакторинг, як тільки натиснете "третій раз" (або побачите потребу), замість того, щоб побачити це як додаткові зусилля.

Також TDD - це велика допомога і тут, оскільки ви можете продовжувати виконувати свої тести як рефактор і знати, що ви нічого не зламали.


1

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

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


1

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

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

Після того, як ви впевнені в собі, ви можете змінити цей режим.


1

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

Щодо технічних причин, то їх декілька.

  • Якщо у вас є помилка в коді, це означає, що це місце неправильно зрозуміло, і це ДУЖЕ ймовірно, що тут може бути приховано більше помилок, і, безумовно, виникнуть великі проблеми при будь-якій спробі розробити пов'язані частини коду. Отже, це місце слід перевірити на предмет можливого рефакторингу.
  • Ще одна причина, коли ви додаєте або змінюєте функцію, і старий код дуже незручний для зміни / додавання, і більш пізні зміни / доповнення дуже можливі. Звичайно, варто збалансувати витрати.
  • Можливо, найсерйозніша причина - це коли ви змінюєте код, і він невідчутний.

Як майстер scrum, у нас був розробник, який постійно стверджував, що кожна історія розміру команди є більшим, ніж те, що думала команда, і зрозумів, що хоче переробити кожен фрагмент коду, який він натрапив. Таким чином, 3-бальна історія завжди була для нього 8. Зрозуміло, що це накручувало доставку вартості. Тож якимось чином має бути певне розуміння того, коли потрібно робити рефактор, і як слід приймати рішення. Просто моя думка, з цього (та кількох інших) досвіду.
Кертіс Рід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.