Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Извлечение суперкласса (Extract Superclass).md
2026-02-23 19:52:05 +03:00

2.9 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250219085909.png

Проблема

У вас есть два класса с общими полями и методами.

class Department {
  get totalAnnualCost() {...}
  get name() {...}
  get headCount() {...}
}

class Employee {
  get annualCost() {...}
  get name() {...}
  get id() {...}
}

Решение

Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.

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. Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов).

Борется с запахом

Ссылки