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