55 lines
3.4 KiB
Markdown
55 lines
3.4 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250127093832.png]]
|
||
|
||
### **Проблема**
|
||
Вы помещаете результат какого-то выражения в локальную переменную, чтобы использовать её далее в коде.
|
||
```typescript
|
||
calculateTotal(): number {
|
||
let basePrice = quantity * itemPrice;
|
||
if (basePrice > 1000) {
|
||
return basePrice * 0.95;
|
||
}
|
||
else {
|
||
return basePrice * 0.98;
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Выделите все выражение в отдельный метод и возвращайте результат из него. Замените использование вашей переменной вызовом метода. Новый метод может быть использован и в других методах.
|
||
```typescript
|
||
calculateTotal(): number {
|
||
if (basePrice() > 1000) {
|
||
return basePrice() * 0.95;
|
||
}
|
||
else {
|
||
return basePrice() * 0.98;
|
||
}
|
||
}
|
||
basePrice(): number {
|
||
return quantity * itemPrice;
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Применение данного рефакторинга может быть подготовительным этапом для применения [[Извлечение функции (Extract Function)]] для какой-то части очень длинного метода.
|
||
|
||
Кроме того, иногда можно найти это же выражение и в других методах, что заставляет задуматься о создании общего метода для его получения.
|
||
|
||
### **Достоинства**
|
||
- Улучшает читабельность кода. Намного проще понять, что делает метод `getTax()` чем строка `orderPrice() * -2`.
|
||
- Помогает убрать дублирование кода, если заменяемая строка используется более чем в одном методе.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Убедитесь, что переменной в пределах метода присваивается значение только один раз. Если это не так, используйте расщепление переменной для того, чтобы гарантировать, что переменная будет использована только для хранения результата вашего выражения.
|
||
2. Используйте [[Извлечение функции (Extract Function)]] для того, чтобы переместить интересующее вас выражение в новый метод. Убедитесь, что этот метод только возвращает значение и не меняет состояние объекта. Если он как-то влияет на видимое состояние объекта, используйте разделение запроса и модификатора.
|
||
3. Замените использование переменной вызовом вашего нового метода
|
||
|
||
### **Борется с запахом**
|
||
- [[Длинная функция]]
|
||
- [[Дублируемый код]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/replace-temp-with-query
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |