Глянь мой новый курс по 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);
}

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

Чем длиннее кусок кода, тем сложнее понять, что он делает. Все усложняется ещё больше, когда код щедро приправлен условными операторами:

  • пока вы разберётесь в том, что делает код в then, вы забываете, какое условие стояло в операторе;

  • пока вы разбираетесь с else, вы забываете, что делал код в then.

Достоинства

  • Извлекая код условного оператора в методы с понятным названием, вы упрощаете жизнь тому, кто впоследствии будет этот код поддерживать (зачастую вам самим через месяц или два).

  • Кстати, этот рефакторинг применим и для коротких выражений в условиях оператора. Строка isSalaryDay() куда наглядней опишет то, что она делает, чем код сравнения дат.

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

  1. Выделите условие в отдельный метод с помощью выделения метода.

  2. Повторите выделение для then и else части оператора.