#рефакторинг #методы_рефакторинга ![[Pasted image 20250219085909.png]] ### **Проблема** У вас есть два класса с общими полями и методами. ```javascript class Department { get totalAnnualCost() {...} get name() {...} get headCount() {...} } class Employee { get annualCost() {...} get name() {...} get id() {...} } ``` ### **Решение** Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы. ```javascript class Party { get name() {...} get annualCost() {...} } class Department extends Party { get annualCost() {...} get headCount() {...} } class Employee extends Party { get annualCost() {...} get id() {...} } ``` ### **Причины рефакторинга** Одним из видов дублирования кода является наличие двух классов, выполняющих сходные задачи одинаковым способом или сходные задачи разными способами. Объекты предоставляют встроенный механизм для упрощения такой ситуации с помощью наследования. Однако часто общность оказывается незамеченной до тех пор, пока не будут созданы какие-то классы, и тогда появляется необходимость создавать структуру наследования позднее. ### **Достоинства** - Убирает дублирование кода. Общие поля и методы теперь «живут» только в одном месте. ### **Порядок рефакторинга** 1. Создайте абстрактный суперкласс 2. Используйте [[Подъем поля (Pull Up Field)]], [[Подъем метода (Pull Up Method)]] и [[Подъем тела конструктора (Pull Up Constructor Body)]] для перемещения общей функциональности в суперкласс. Лучше начинать с полей, так как помимо общих полей, вам нужно будет перенести те из них, которые используются в общих методах. 3. Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов). ### **Борется с запахом** - [[Дублируемый код]] ### **Ссылки** - https://refactoring.guru/ru/extract-superclass - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]