56 lines
2.9 KiB
Markdown
56 lines
2.9 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219085909.png]]
|
||
|
||
### **Проблема**
|
||
У вас есть два класса с общими полями и методами.
|
||
```javascript
|
||
class Department {
|
||
get totalAnnualCost() {...}
|
||
get name() {...}
|
||
get headCount() {...}
|
||
}
|
||
|
||
class Employee {
|
||
get annualCost() {...}
|
||
get name() {...}
|
||
get id() {...}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.
|
||
```javascript
|
||
class Party {
|
||
get name() {...}
|
||
get annualCost() {...}
|
||
}
|
||
|
||
class Department extends Party {
|
||
get annualCost() {...}
|
||
get headCount() {...}
|
||
}
|
||
|
||
class Employee extends Party {
|
||
get annualCost() {...}
|
||
get id() {...}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Одним из видов дублирования кода является наличие двух классов, выполняющих сходные задачи одинаковым способом или сходные задачи разными способами. Объекты предоставляют встроенный механизм для упрощения такой ситуации с помощью наследования. Однако часто общность оказывается незамеченной до тех пор, пока не будут созданы какие-то классы, и тогда появляется необходимость создавать структуру наследования позднее.
|
||
|
||
### **Достоинства**
|
||
- Убирает дублирование кода. Общие поля и методы теперь «живут» только в одном месте.
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Создайте абстрактный суперкласс
|
||
2. Используйте [[Подъем поля (Pull Up Field)]], [[Подъем метода (Pull Up Method)]] и [[Подъем тела конструктора (Pull Up Constructor Body)]] для перемещения общей функциональности в суперкласс. Лучше начинать с полей, так как помимо общих полей, вам нужно будет перенести те из них, которые используются в общих методах.
|
||
3. Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов).
|
||
|
||
### **Борется с запахом**
|
||
- [[Дублируемый код]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/extract-superclass
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |