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

60 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[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]]