Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Перенос функции (Move Function).md
2026-02-23 19:52:05 +03:00

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