Також відомий як Decompose Conditional

Рефакторинг Розподіл умовного оператора

Проблема

У вас є складний умовний оператор (`if - then`/`else` або `switch`).

Рішення

Виділіть в окремі методи усі складні частини оператора: умова, `then` і `else`.
До
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}
Після
if (notSummer(date)) {
  charge = winterCharge(quantity);
}
else {
  charge = summerCharge(quantity);
}
До
if (date < SUMMER_START || date > SUMMER_END) 
{
  charge = quantity * winterRate + winterServiceCharge;
}
else 
{
  charge = quantity * summerRate;
}
Після
if (NotSummer(date)) 
{
  charge = WinterCharge(quantity);
}
else 
{
  charge = SummerCharge(quantity);
}
До
if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
  $charge = $quantity * $winterRate + $winterServiceCharge;
}
else {
  $charge = $quantity * $summerRate;
}
Після
if (notSummer($date)) {
  $charge = winterCharge($quantity);
}
else {
  $charge = summerCharge($quantity);
}
До
if date.before(SUMMER_START) or date.after(SUMMER_END):
    charge = quantity * winterRate + winterServiceCharge
else:
    charge = quantity * summerRate
Після
if notSummer(date):
    charge = winterCharge(quantity)
else:
    charge = summerCharge(quantity)

Причини рефакторингу

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

  • доки ви зрозумієте, що робить код в this, ви можете забути, що за умова була в операторі;
  • доки ви розбираєтеся з else, ви забуваєте, що робив код в this.

Переваги

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

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

Порядок рефакторингу

  1. Виділіть умову в окремий метод за допомогою відокремлення методу.

  2. Повторіть видокремлення для частин оператора then і else.

Замучились читати?

Збігайте за подушкою, в нас тут контенту приблизно на 7 годин читання.

Або спробуйте наш новий інтерактивний курс з рефакторингу. Він більш інформативний та набагато цікавіший за банальний тест.

Дізнатися більше...

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.