45 lines
4.7 KiB
Markdown
45 lines
4.7 KiB
Markdown
#рефакторинг #методы_рефакторинга
|
||
|
||
![[Pasted image 20250131083349.png]]
|
||
|
||
### **Проблема**
|
||
Метод используется в другом классе больше, чем в собственном.
|
||
```javascript
|
||
class Account {
|
||
get overdraftCharge() {...}
|
||
}
|
||
```
|
||
|
||
### **Решение**
|
||
Создайте новый метод в классе, который использует его больше других, и перенесите туда код из старого метода. Код оригинального метода превратите в обращение к новому методу в другом классе либо уберите его вообще.
|
||
```javascript
|
||
class AccountType {
|
||
get overdraftCharge() {...}
|
||
}
|
||
```
|
||
|
||
### **Причины рефакторинга**
|
||
- Вы хотите переместить метод в класс, который содержит данные, с которыми, в основном, работает этот метод. Этим вы увеличиваете связность внутри классов.
|
||
- Вы хотите переместить метод, чтобы убрать или уменьшить зависимость класса, вызывающего этот метод, от класса, в котором он находился. Это может быть полезно, если вызывающий класс уже имеет зависимость от класса, куда вы планируете перенести метод. Таким образом, вы уменьшаете связанность между классами.
|
||
|
||
|
||
### **Порядок рефакторинга**
|
||
1. Проверьте все фичи, используемые старым методом в его же классе. Возможно, их тоже следует переместить. Руководствуйтесь таким правилом — если фича используется только интересующим вас методом, её точно следует переносить. Если фича используется и другими методами, возможно, следует перенести и эти методы. Иногда гораздо проще перенести пачку методов, чем настраивать взаимодействие между ними в разных классах.
|
||
Проверьте, не определён ли метод в суперклассах и подклассах приемника. Если это так, вам придётся либо отказаться от идеи переноса, либо реализовать в классе-получателе подобие полиморфизма, чтобы обеспечить различную функциональность метода, которая была разнесена по классам-донорам.
|
||
2. Объявите новый метод в классе-приёмнике. Возможно, следует придумать для метода новое имя, которое в новом классе будет подходить ему больше.
|
||
3. Определите, как вы будете обращаться к классу-получателю. Вполне возможно, у вас уже есть поле или метод, которые возвращают подходящий объект, но если нет, нужно будет написать новый метод или поле, в котором бы хранился объект класса-получателя.
|
||
Теперь у вас есть способ обратиться к объекту-получателю и новый метод в его классе. С этим всем вы уже можете превратить старый метод в обращение к новому методу
|
||
4. Оцените, есть ли возможность удалить старый метод вообще? При этом нужно будет во всех местах, где используется этот метод, поставить обращение к новому.
|
||
|
||
### **Борется с запахом**
|
||
- [[Стрельба дробью]]
|
||
- [[Завистливые функции]]
|
||
- [[Повторяющиеся switch]]
|
||
- [[Параллельные иерархии наследования]]
|
||
- [[Цепочки сообщений]]
|
||
- [[Неуместная близость]]
|
||
- [[Классы данных]]
|
||
|
||
### **Ссылки**
|
||
- https://refactoring.guru/ru/move-method
|
||
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]] |