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