Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Декомпозиция условной инструкции (Decompose Conditional).md
2026-02-23 19:52:05 +03:00

2.4 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250207084312.png

Проблема

У вас есть сложный условный оператор (if-then/else или switch).

if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}

Решение

Выделите в отдельные методы все сложные части оператора: условие, then и else.

if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}

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

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

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

Достоинства

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

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

  1. Выделите условие в отдельный метод с помощью Извлечение функции (Extract Function).
  2. Повторите выделение для then и else части оператора.

Борется с запахом

Ссылки