54 lines
2.2 KiB
Markdown
54 lines
2.2 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219083328.png]]
|
||
|
||
### **Проблема**
|
||
Два класса имеют одно и то же поле
|
||
```javascript
|
||
class Employee {...} // Java
|
||
|
||
class Salesman extends Employee {
|
||
private String name;
|
||
}
|
||
|
||
class Engineer extends Employee {
|
||
private String name;
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Переместите поле в суперкласс, убрав его из подклассов.
|
||
```javascript
|
||
class Employee {
|
||
protected String name;
|
||
}
|
||
|
||
class Salesman extends Employee {...}
|
||
class Engineer extends Employee {...}
|
||
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Подклассы развивались независимо друг от друга. Это привело к созданию одинаковых (или очень похожих) полей и методов.
|
||
|
||
### **Достоинства**
|
||
|
||
- Убивает дублирование полей в подклассах
|
||
- Облегчает дальнейший перенос дублирующих методов из подклассов в суперкласс, если они есть
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Проверьте, что оба поля используются для одинаковых нужд в подклассах.
|
||
2. Если поля имеют разные названия, дайте им общее имя и замените все обращения к полям в существующем коде.
|
||
3. Создайте поле с таким же именем в суперклассе. Обратите внимание на то, что если поля были приватные (private), поле в суперклассе должно быть защищённым (protected).
|
||
4. Удалите поля из подклассов
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Опускание поля (Push Down Field)]]
|
||
|
||
### **Борется с запахом**
|
||
- [[Дублируемый код]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/pull-up-field
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |