Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Подъем метода (Pull Up Method).md
2026-02-23 19:52:05 +03:00

55 lines
3.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 20250219082742.png]]
### **Проблема**
Подклассы имеют методы, которые делают схожую работу
```javascript
class Employee {. . .}
class Salesman extends Employee {
get name() {..}
}
class Engineer extends Employee {
get name() {...}
}
```
### **Решение**
В этом случае нужно сделать методы идентичными, а затем переместить их в суперкласс.
```javascript
class Employee {
get name() (...)
}
class Salesman extends Employee {...}
class Engineer extends Employee {...}
```
### **Причины рефакторинга**
Подклассы развивались независимо друг от друга. Это привело к созданию одинаковых (или очень похожих) полей и методов.
### **Достоинства**
- Убирает дублирование кода. Если вам нужно внести изменения в метод, лучше сделать это в одном месте, чем искать все дубликаты этого метода в подклассах.
- Также этот рефакторинг можно использовать и в случае, если подкласс зачем-то переопределяет метод суперкласса, но, по сути, делает ту же работу.
### **Порядок рефакторинга**
1. Обследовать похожие методы в суперклассах. Если они не одинаковы, привести их к одному и тому же виду.
2. Если методы используют разный набор параметров, привести эти параметры к тому виду, который вы хотите видеть в суперклассе.
3. Скопируйте метод в суперкласс. Здесь вы можете столкнуться с тем, что код метода использует поля и методы, которые есть только в подклассах, а посему недоступны в суперклассе. Чтобы решить эту проблему, вам нужно:
1. Для полей: либо [[Подъем поля (Pull Up Field)|поднимите нужные поля в суперкласс]], либо используйте самоинкапсуляцию поля для создания геттеров и сеттеров в подклассах, а затем объявите эти геттеры абстрактным методом в суперклассе.
2. Для методов: либо поднимите нужные методы в суперкласс, либо объявите для них абстрактные методы в суперклассе (обратите внимание, ваш класс станет абстрактным, если не был таким до этого).
4. Удалите методы в подклассах
5. Проверьте места, в которых вызывается метод. Возможно, в некоторых из них использование подкласса можно заменить суперклассом
### **Обратный рефакторинг**
- [[Опускание метода (Push Down Method)]]
### **Борется с запахом**
- [[Дублируемый код]]
### **Ссылки**
- https://refactoring.guru/ru/pull-up-method
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]