#рефакторинг #методы_рефакторинга ![[Pasted image 20250219090442.png]] ### **Проблема** У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса. ```javascript class Employee {...} class Salesman extends Employee {...} ``` ### **Решение** Слейте подкласс и суперкласс воедино. ```javascript class Employee {...} ``` ### **Причины рефакторинга** Развитие программы привело к тому, что подкласс и суперкласс стали очень мало отличаться друг от друга. Какая-то фича была убрана из подкласса, какой-то метод «переехал» в суперкласс, и вот вы уже имеете два практически одинаковых класса. ### **Достоинства** - Уменьшается сложность программы. Меньше классов, меньше вещей, которые нужно держать в голове, меньше «движущихся частей», меньше вероятность сломать что-то при последующих изменениях в коде. - Навигация по коду становится проще, когда методы определены только в одном классе. Нужный метод не приходится искать по всей иерархии. ### **Порядок рефакторинга** 1. Выберите, какой класс убрать удобнее: суперкласс или подкласс. 2. Используйте [[Подъем поля (Pull Up Field)]] и [[Подъем метода (Pull Up Method)]], если вы решили избавиться от подкласса. Используйте [[Опускание поля (Push Down Field)]] и [[Опускание метода (Push Down Method)]], если убран будет суперкласс. 3. Замените все использования класса, который будет удалён, классом, в который переезжают поля и методы. Зачастую это будет код создания классов, указания типов параметров и переменных, а также документации в комментариях. 4. Удалите пустой класс ### **Борется с запахом** - [[Ленивый элемент]] - [[Теоретическая общность]] ### **Ссылки** - https://refactoring.guru/ru/collapse-hierarchy - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]