Friend spotlight!
Whimsical Animations course
Friend spotlight!
NEW Whimsical Animations course
Friend spotlight! NEW Whimsical Animations course
huge discount only this week
Friend spotlight! Want to make your project stand out? NEW Whimsical Animations course huge discount only this week

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

Також відомий як: 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.