#рефакторинг #методы_рефакторинга ![[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]]