Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git! Привіт! Глянь мій новий курс по Git на GitByBit.com! Привіт! Хочеш класно освіжити Git? Глянь мій новий курс на GitByBit.com!

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

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