#рефакторинг #методы_рефакторинга ![[Pasted image 20250219082742.png]] ### **Проблема** Подклассы имеют методы, которые делают схожую работу ```javascript class Employee {. . .} class Salesman extends Employee { get name() {.♦.} } class Engineer extends Employee { get name() {...} } ``` ### **Решение** В этом случае нужно сделать методы идентичными, а затем переместить их в суперкласс. ```javascript class Employee { get name() (...) } class Salesman extends Employee {...} class Engineer extends Employee {...} ``` ### **Причины рефакторинга** Подклассы развивались независимо друг от друга. Это привело к созданию одинаковых (или очень похожих) полей и методов. ### **Достоинства** - Убирает дублирование кода. Если вам нужно внести изменения в метод, лучше сделать это в одном месте, чем искать все дубликаты этого метода в подклассах. - Также этот рефакторинг можно использовать и в случае, если подкласс зачем-то переопределяет метод суперкласса, но, по сути, делает ту же работу. ### **Порядок рефакторинга** 1. Обследовать похожие методы в суперклассах. Если они не одинаковы, привести их к одному и тому же виду. 2. Если методы используют разный набор параметров, привести эти параметры к тому виду, который вы хотите видеть в суперклассе. 3. Скопируйте метод в суперкласс. Здесь вы можете столкнуться с тем, что код метода использует поля и методы, которые есть только в подклассах, а посему недоступны в суперклассе. Чтобы решить эту проблему, вам нужно: 1. Для полей: либо [[Подъем поля (Pull Up Field)|поднимите нужные поля в суперкласс]], либо используйте самоинкапсуляцию поля для создания геттеров и сеттеров в подклассах, а затем объявите эти геттеры абстрактным методом в суперклассе. 2. Для методов: либо поднимите нужные методы в суперкласс, либо объявите для них абстрактные методы в суперклассе (обратите внимание, ваш класс станет абстрактным, если не был таким до этого). 4. Удалите методы в подклассах 5. Проверьте места, в которых вызывается метод. Возможно, в некоторых из них использование подкласса можно заменить суперклассом ### **Обратный рефакторинг** - [[Опускание метода (Push Down Method)]] ### **Борется с запахом** - [[Дублируемый код]] ### **Ссылки** - https://refactoring.guru/ru/pull-up-method - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]