Розподіл умовного оператора
Проблема
У вас є складний умовний оператор (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()
набагато наочніше опише те, що вона робить, ніж код порівняння дат.
Порядок рефакторингу
-
Виділіть умову в окремий метод за допомогою відокремлення методу.
-
Повторіть видокремлення для частин оператора then і else.