48 lines
4.7 KiB
Markdown
48 lines
4.7 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250204084418.png]]
|
||
|
||
### **Проблема**
|
||
Вы помещаете результат какого-то выражения в локальную переменную, чтобы использовать её далее в коде.
|
||
```typescript
|
||
get discountedTotal() {return this._discountedTotal;}
|
||
set discount(aNumber) {
|
||
const old = this._discount;
|
||
this._discount = aNumber;
|
||
this._discountedTotal += old - aNumber;
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Выделите все выражение в отдельный метод и возвращайте результат из него. Замените использование вашей переменной вызовом метода. Новый метод может быть использован и в других методах.
|
||
```typescript
|
||
get discountedTotal() {return this._baseTotal - this._discount;}
|
||
set discount(aNumber) {this._discount = aNumber;}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Применение данного рефакторинга может быть подготовительным этапом для применения [[Извлечение функции (Extract Function)|выделения метода для какой-то части очень длинного метода]].
|
||
|
||
Кроме того, иногда можно найти это же выражение и в других методах, что заставляет задуматься о создании общего метода для его получения.
|
||
|
||
### **Достоинства**
|
||
- Улучшает читабельность кода. Намного проще понять, что делает метод `getTax()` чем строка `orderPrice() * -2`.
|
||
- Помогает убрать дублирование кода, если заменяемая строка используется более чем в одном методе.
|
||
|
||
### **Вопрос производительности**
|
||
При использовании этого рефакторинга может возникнуть вопрос, не скажется ли результат рефакторинга не лучшим образом на производительности программы. Честный ответ — да, результирующий код может получить дополнительную нагрузку за счёт вызова нового метода. Однако в наше время быстрых процессоров и хороших компиляторов такая нагрузка вряд ли будет заметна. Зато взамен мы получаем лучшую читабельность кода и возможность использовать новый метод в других местах программы.
|
||
|
||
Тем не менее, если ваша временная переменная служит для кеширования результата действительно трудоёмкого выражения, имеет смысл остановить этот рефакторинг после выделения выражения в новый метод.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Убедитесь, что переменной в пределах метода присваивается значение только один раз. Если это не так, используйте [[Расщепление переменной (Split Variable)]] для того, чтобы гарантировать, что переменная будет использована только для хранения результата вашего выражения.
|
||
2. Используйте [[Извлечение функции (Extract Function)]] для того, чтобы переместить интересующее вас выражение в новый метод. Убедитесь, что этот метод только возвращает значение и не меняет состояние объекта. Если он как-то влияет на видимое состояние объекта, используйте [[Отделение запроса от модификатора (Separate Query from Modifier)]].
|
||
3. Замените использование переменной вызовом вашего нового метода
|
||
|
||
### **Борется с запахом**
|
||
- [[Длинная функция]]
|
||
- [[Дублируемый код]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/replace-temp-with-query
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |