Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Опускание метода (Push Down Method).md
2026-02-23 19:52:05 +03:00

51 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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