#рефакторинг #методы_рефакторинга ![[Pasted image 20250207085130.png]] ### **Проблема** У вас есть группа вложенных условных операторов, среди которых сложно выделить нормальный ход выполнения кода. ```typescript getPayAmount(): number { let result: number; if (isDead){ result = deadAmount(); } else { if (isSeparated){ result = separatedAmount(); } else { if (isRetired){ result = retiredAmount(); } else{ result = normalPayAmount(); } } } return result; } ``` ### **Решение** Выделите все проверки специальных или граничных случаев выполнения в отдельные условия и поместите их перед основными проверками. В идеале, вы должны получить «плоский» список условных операторов, идущих один за другим. ```typescript 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)]] для граничных условных операторов, ведущих к одинаковым исключениям или возвращаемым значениям. ### **Ссылки** - https://refactoring.guru/ru/replace-nested-conditional-with-guard-clauses - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]