Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена вложенных условных конструкций граничным оператором (Replace Nested Conditional with Guard Clauses).md
2026-02-23 19:52:05 +03:00

3.8 KiB
Raw Blame History

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

!Pasted image 20250207085130.png

Проблема

У вас есть группа вложенных условных операторов, среди которых сложно выделить нормальный ход выполнения кода.

getPayAmount(): number {
  let result: number;
  if (isDead){
    result = deadAmount();
  }
  else {
    if (isSeparated){
      result = separatedAmount();
    }
    else {
      if (isRetired){
        result = retiredAmount();
      }
      else{
        result = normalPayAmount();
      }
    }
  }
  return result;
}

Решение

Выделите все проверки специальных или граничных случаев выполнения в отдельные условия и поместите их перед основными проверками. В идеале, вы должны получить «плоский» список условных операторов, идущих один за другим.

getPayAmount(): number {
  if (isDead){
    return deadAmount();
  }
  if (isSeparated){
    return separatedAmount();
  }
  if (isRetired){
    return retiredAmount();
  }
  return normalPayAmount();
}

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

Отступы каждого из уровней вложенности формируют в нем отчётливую стрелку, указывающую вправо. Разобраться в том, что и как делает такой оператор довольно сложно, так как «нормальный» ход выполнения в нем не очевиден. Такие операторы появляются эволюционным путём, когда каждое из условий добавляется в разные промежутки времени без мыслей об оптимизации остальных условий. Чтобы упростить такой оператор, нужно выделить все особые случаи в отдельные условные операторы, которые бы при наступлении граничных условий, сразу заканчивали выполнение и возвращали нужное значение. По сути, ваша цель — сделать такой оператор плоским.

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

Постарайтесь избавиться от «побочных эффектов» в условиях операторов. Отделение запроса от модификатора (Separate Query from Modifier) может в этом помочь. Такое решение понадобится для дальнейших перестановок условий.

  1. Выделите граничные условия, которые приводят к вызову исключения или немедленному возвращению значения из метода. Переместите эти условия в начало метода.
  2. После того как с переносами покончено, и все тесты стали проходить, проверьте, можно ли использовать Объединение условного выражения (Consolidate Conditional Expression) для граничных условных операторов, ведущих к одинаковым исключениям или возвращаемым значениям.

Ссылки