52 lines
2.1 KiB
Markdown
52 lines
2.1 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219083648.png]]
|
||
|
||
### **Проблема**
|
||
Два класса имеют одно и то же поле
|
||
```javascript
|
||
class Party {...}
|
||
|
||
class Employee extends Party {
|
||
constructor(name, id, monthlyCost) {
|
||
super();
|
||
this._id = id;
|
||
this._name = name;
|
||
this._monthlyCost = monthlyCost;
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Переместите поле в суперкласс, убрав его из подклассов.
|
||
```javascript
|
||
class Party {
|
||
constructor(name){
|
||
this._name = name;
|
||
}
|
||
}
|
||
|
||
class Employee extends Party {
|
||
constructor(name, id, monthlyCost) {
|
||
super(name);
|
||
this._id = id;
|
||
this._monthlyCost = monthlyCost;
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
В большинстве языков программирования конструктор подкласса может иметь свой собственный список параметров, отличный от параметров суперкласса, поэтому вы должны создать конструктор суперкласса только с теми параметрами, которые ему действительно нужны.
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Создайте конструктор в суперклассе
|
||
2. Извлеките общий код из начала конструктора каждого из подклассов в конструктор суперкласса. Перед этим действием стоит попробовать поместить как можно больше общего кода в начало конструктора
|
||
3. Поместите вызов конструктора суперкласса первой строкой в конструкторах подклассов
|
||
|
||
### **Борется с запахом**
|
||
- [[Дублируемый код]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/pull-up-constructor-body
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |