Base/Knowledges/IT/Рефакторинг/Запахи кода/Завистливые функции.md
2026-02-23 19:52:05 +03:00

35 lines
2.8 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 20241112224937.png]]
> Когда мы делим программы на модули, мы пытаемся разделить код на такие зоны, чтобы максимизировать взаимодействие внутри зоны и минимизировать взаимодействие между зонами. Классический пример — когда функция в одном модуле тратит больше времени на общение с функциями или данными внутри другого модуля, чем в своем собственном.
> Функция четко хочет быть поближе к данным.
### **Признаки**
- Метод обращается к данным другого объекта чаще, чем к собственным данным
### **Причины появления**
- После перемещения каких-то полей в класс данных. В этом случае операции с данными, возможно, также следует переместить в этот класс.
![[Pasted image 20241112224947.png]]
### **Рефакторинги**
То, что изменяется одновременно, нужно хранить в одном месте. Обычно данные и функции, использующие эти данные, также изменяются вместе (хотя бывают исключения).
- [[Перенос функции (Move Function)]]
- [[Извлечение функции (Extract Function)]]
- [[Перенос функции (Move Function)]]
![[Pasted image 20241112224955.png]]
### **Результат**
- Уменьшение дублирования кода (если код работы с данными переехал в одно общее место)
- Улучшение организации кода (так как методы работы с данными находятся возле этих данных)
### **Не стоит трогать, если...**
- Бывают случаи, когда поведение намеренно отделяется от класса, содержащего данные. Чаще всего это делают для того, чтобы иметь возможность динамически менять это поведение (паттерны **[[Стратегия]]**, **[[Посетитель]]** и т. д.).
### **Ссылки**
- [https://refactoring.guru/ru/smells/feature-envy](https://refactoring.guru/ru/smells/feature-envy)
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]