51 lines
2.7 KiB
Markdown
51 lines
2.7 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219083944.png]]
|
||
|
||
### **Проблема**
|
||
Поведение, реализованное в суперклассе, используется только одним или несколькими подклассами
|
||
```javascript
|
||
class Employee {
|
||
get quota {...}
|
||
}
|
||
|
||
class Engineer extends Employee {...}
|
||
class Salesman extends Employee {...}
|
||
```
|
||
|
||
### **Решение**
|
||
Переместите это поведение в подклассы
|
||
```javascript
|
||
class Employee {...}
|
||
|
||
class Engineer extends Employee {...}
|
||
class Salesman extends Employee {
|
||
get quota {...}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Метод, который планировали сделать универсальным для всех классов, по факту используется только в одном подклассе. Такая ситуация может возникнуть, когда планируемые фичи так и не были реализованы.
|
||
|
||
Кроме того, такая ситуация может возникнуть после извлечения (или удаления) части функциональности из иерархии классов, после которого метод остался используемым только в одном подклассе.
|
||
|
||
Если вы видите, что метод необходим более чем одному подклассу (но не всем), возможно, стоит создать промежуточный подкласс и переместить метод в него. Это позволит избежать дублирования кода, которое возникло бы при спуске метода во все подклассы.
|
||
|
||
### **Достоинства**
|
||
- Улучшает связность внутри классов. Метод находится там, где вы ожидаете его увидеть
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Объявите метод в подклассе и скопируйте его код из суперкласса
|
||
2. Удалите метод из суперкласса
|
||
3. Найдите все места, где используется метод, и убедитесь, что он вызывается из нужного подкласса
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Подъем метода (Pull Up Method)]]
|
||
|
||
### **Борется с запахом**
|
||
- [[Отказ от наследственности]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/push-down-method
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |