39 lines
2.8 KiB
Markdown
39 lines
2.8 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219090442.png]]
|
||
|
||
### **Проблема**
|
||
У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса.
|
||
```javascript
|
||
class Employee {...}
|
||
class Salesman extends Employee {...}
|
||
```
|
||
|
||
### **Решение**
|
||
Слейте подкласс и суперкласс воедино.
|
||
```javascript
|
||
class Employee {...}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Развитие программы привело к тому, что подкласс и суперкласс стали очень мало отличаться друг от друга. Какая-то фича была убрана из подкласса, какой-то метод «переехал» в суперкласс, и вот вы уже имеете два практически одинаковых класса.
|
||
|
||
### **Достоинства**
|
||
- Уменьшается сложность программы. Меньше классов, меньше вещей, которые нужно держать в голове, меньше «движущихся частей», меньше вероятность сломать что-то при последующих изменениях в коде.
|
||
- Навигация по коду становится проще, когда методы определены только в одном классе. Нужный метод не приходится искать по всей иерархии.
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Выберите, какой класс убрать удобнее: суперкласс или подкласс.
|
||
2. Используйте [[Подъем поля (Pull Up Field)]] и [[Подъем метода (Pull Up Method)]], если вы решили избавиться от подкласса. Используйте [[Опускание поля (Push Down Field)]] и [[Опускание метода (Push Down Method)]], если убран будет суперкласс.
|
||
3. Замените все использования класса, который будет удалён, классом, в который переезжают поля и методы. Зачастую это будет код создания классов, указания типов параметров и переменных, а также документации в комментариях.
|
||
4. Удалите пустой класс
|
||
|
||
|
||
### **Борется с запахом**
|
||
- [[Ленивый элемент]]
|
||
- [[Теоретическая общность]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/collapse-hierarchy
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |