Autumn SALE

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

Також відомий як: 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 (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}
До
if (date < SUMMER_START || date > SUMMER_END) 
{
  charge = quantity * winterRate + winterServiceCharge;
}
else 
{
  charge = quantity * summerRate;
}
Після
if (isSummer(date))
{
  charge = SummerCharge(quantity);
}
else 
{
  charge = WinterCharge(quantity);
}
До
if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
  $charge = $quantity * $winterRate + $winterServiceCharge;
} else {
  $charge = $quantity * $summerRate;
}
Після
if (isSummer($date)) {
  $charge = summerCharge($quantity);
} else {
  $charge = winterCharge($quantity);
}
До
if date.before(SUMMER_START) or date.after(SUMMER_END):
    charge = quantity * winterRate + winterServiceCharge
else:
    charge = quantity * summerRate
Після
if isSummer(date):
    charge = summerCharge(quantity)
else:
    charge = winterCharge(quantity)
До
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}
Після
if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}

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

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

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

  • доки ви розбираєтеся з else, ви забуваєте, що робив код в this.

Переваги

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

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

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

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

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