Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Извлечение суперкласса (Extract Superclass).md
2026-02-23 19:52:05 +03:00

56 lines
2.9 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 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]]