41 lines
2.8 KiB
Markdown
41 lines
2.8 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250131084410.png]]
|
||
|
||
### **Проблема**
|
||
Поле используется в другом классе больше, чем в собственном.
|
||
```javascript
|
||
class Customer {
|
||
get plan() {return this._plan;}
|
||
get discountRate() {return this._discountRate;}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Создайте поле в новом классе и перенаправьте к нему всех пользователей старого поля.
|
||
```javascript
|
||
class Customer {
|
||
get plan() {return this._plan;}
|
||
get discountRate() {return this.plan.discountRate;}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
Зачастую поля переносятся как часть [[Извлечение класса (Extract Class)|извлечение одного класса из другого]]. Решить, в каком из классов должно остаться поле, бывает непросто. Поле должно быть там, где находятся методы, которые его используют (либо там, где этих методов больше).
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Если поле публичное, вам будет намного проще совершить рефакторинг, если вы сделаете его приватным и предоставите публичные методы доступа (для этого можно использовать рефакторинг инкапсуляция поля).
|
||
2. Создайте такое же поле с методами доступа в классе-приёмнике
|
||
3. Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект. Если нет — нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя.
|
||
4. Замените все обращения к старому полю на соответствующие вызовы методов в классе-получателе. Если поле не приватное, проделайте это и в суперклассе, и в подклассах.
|
||
5. Удалите поле в исходном классе
|
||
|
||
|
||
### **Борется с запахом**
|
||
- [[Стрельба дробью]]
|
||
- [[Параллельные иерархии наследования]]
|
||
- [[Неуместная близость]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/move-field
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |