2026-02-23 19:52:05 +03:00

41 lines
2.8 KiB
Markdown
Raw Permalink 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 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]]