45 lines
3.3 KiB
Markdown
45 lines
3.3 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250212084935.png]]
|
||
|
||
### **Проблема**
|
||
Вы получаете несколько значений из объекта, а затем передаёте их в метод как параметры.
|
||
```typescript
|
||
let low = daysTempRange.getLow();
|
||
let high = daysTempRange.getHigh();
|
||
let withinPlan = plan.withinRange(low, high);
|
||
```
|
||
|
||
### **Решение**
|
||
Вместо этого передавайте весь объект.
|
||
```typescript
|
||
let withinPlan = plan.withinRange(daysTempRange);
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Проблема заключается в том, что перед вызовом вашего метода нужно каждый раз вызывать методы будущего объекта-параметра. Если способ вызова этих методов либо количество данных, получаемых для метода, поменяется, то изменения придётся искать и вносить в дюжину мест по всей программе.
|
||
|
||
Вместо этого код получения всех нужных данных может храниться одном месте — в самом методе.
|
||
|
||
### **Достоинства**
|
||
- Вместо пачки разнообразных параметров вы видите один объект с понятным названием
|
||
- Если методу понадобятся ещё какие-то данные из объекта, не нужно будет переписывать все места, где вызывается этот метод, а только лишь внутренности самого метода
|
||
|
||
### **Недостатки**
|
||
В некоторых случаях после такого преобразования метод теряет в универсальности, так как он мог получать данные из множества разных источников, а в результате рефакторинга мы ограничиваем круг его применения только для объектов с определённым интерфейсом.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Создайте параметр в методе для объекта, из которого можно получить нужные значения
|
||
2. Теперь начинайте по одному удалять старые параметры из метода, заменяя их в коде вызовами соответствующих методов объекта-параметра. Тестируйте программу после каждой замены параметра.
|
||
3. Удалите код получения значений из объекта-параметра, который стоял перед вызовом метода.
|
||
|
||
### **Борется с запахом**
|
||
- [[Одержимость примитивами]]
|
||
- [[Длинный список параметров]]
|
||
- [[Длинная функция]]
|
||
- [[Группы данных]]
|
||
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/preserve-whole-object
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |