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