50 lines
2.4 KiB
Markdown
50 lines
2.4 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250219084214.png]]
|
||
|
||
### **Проблема**
|
||
Поле используется только в некоторых подклассах
|
||
```javascript
|
||
class Employee { // Java
|
||
private String quota;
|
||
}
|
||
|
||
class Engineer extends Employee {...}
|
||
class Salesman extends Employee {...}
|
||
```
|
||
|
||
### **Решение**
|
||
Переместите поле в эти подклассы
|
||
```javascript
|
||
class Employee {...}
|
||
class Engineer extends Employee {...}
|
||
|
||
class Salesman extends Employee {
|
||
protected String quota;
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Поле, которое планировали сделать универсальным для всех классов, по факту используется только в некоторых подклассах. Такая ситуация может возникнуть, когда планируемые фичи так и не были реализованы.
|
||
|
||
Кроме того, такая ситуация может возникнуть после извлечения (или удаления) части функциональности из иерархии классов.
|
||
|
||
|
||
### **Достоинства**
|
||
- Улучшает связность внутри классов. Поле находится там, где оно реально используется
|
||
- При перемещении в несколько подклассов одновременно, появляется возможность развивать поля независимо друг от друга. Правда, такое действие создаёт дублирование кода, поэтому стоит спускать поля, только если вы действительно намерены использовать их по-разному
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Объявите поле во всех необходимых подклассах
|
||
2. Удалите поле из суперкласса
|
||
|
||
### **Обратный рефакторинг**
|
||
- [[Подъем поля (Pull Up Field)]]
|
||
|
||
### **Борется с запахом**
|
||
- [[Отказ от наследственности]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/push-down-field
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |