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

45 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 20250207084312.png]]
### **Проблема**
У вас есть сложный условный оператор (`if-then`/`else` или `switch`).
```typescript
if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
charge = quantity * winterRate + winterServiceCharge;
}
else {
charge = quantity * summerRate;
}
```
### **Решение**
Выделите в отдельные методы все сложные части оператора: условие, `then` и `else`.
```typescript
if (isSummer(date)) {
charge = summerCharge(quantity);
}
else {
charge = winterCharge(quantity);
}
```
### **Причины рефакторинга**
Чем длиннее кусок кода, тем сложнее понять, что он делает. Все усложняется ещё больше, когда код щедро приправлен условными операторами:
- пока вы разберётесь в том, что делает код в then, вы забываете, какое условие стояло в операторе;
- пока вы разбираетесь с else, вы забываете, что делал код в then.
### **Достоинства**
- Извлекая код условного оператора в методы с понятным названием, вы упрощаете жизнь тому, кто впоследствии будет этот код поддерживать (зачастую вам самим через месяц или два).
- Рефакторинг применим и для коротких выражений в условиях оператора. Строка `isSalaryDay()` куда наглядней опишет то, что она делает, чем код сравнения дат.
### **Порядок рефакторинга**
1. Выделите условие в отдельный метод с помощью [[Извлечение функции (Extract Function)]].
2. Повторите выделение для `then` и `else` части оператора.
### **Борется с запахом**
- [[Длинная функция]]
### **Ссылки**
- https://refactoring.guru/ru/decompose-conditional
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]