Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Опускание поля (Push Down Field).md
2026-02-23 19:52:05 +03:00

50 lines
2.4 KiB
Markdown
Raw 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 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]]