Разбиение условного оператора
Проблема
У вас есть сложный условный оператор (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);
}
Причины рефакторинга
Чем длиннее кусок кода, тем сложнее понять, что он делает. Все усложняется ещё больше, когда код щедро приправлен условными операторами:
-
пока вы разберётесь в том, что делает код в
then
, вы забываете, какое условие стояло в операторе; -
пока вы разбираетесь с
else
, вы забываете, что делал код вthen
.
Достоинства
-
Извлекая код условного оператора в методы с понятным названием, вы упрощаете жизнь тому, кто впоследствии будет этот код поддерживать (зачастую вам самим через месяц или два).
-
Кстати, этот рефакторинг применим и для коротких выражений в условиях оператора. Строка
isSalaryDay()
куда наглядней опишет то, что она делает, чем код сравнения дат.
Порядок рефакторинга
-
Выделите условие в отдельный метод с помощью выделения метода.
-
Повторите выделение для
then
иelse
части оператора.