Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Опускание метода (Push Down Method).md
2026-02-23 19:52:05 +03:00

2.7 KiB
Raw Permalink Blame History

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

!Pasted image 20250219083944.png

Проблема

Поведение, реализованное в суперклассе, используется только одним или несколькими подклассами

class Employee {
  get quota {...}
}

class Engineer extends Employee {...}
class Salesman extends Employee {...}

Решение

Переместите это поведение в подклассы

class Employee {...}

class Engineer extends Employee {...}
class Salesman extends Employee {
  get quota {...}  
}

Причины рефакторинга

Метод, который планировали сделать универсальным для всех классов, по факту используется только в одном подклассе. Такая ситуация может возникнуть, когда планируемые фичи так и не были реализованы.

Кроме того, такая ситуация может возникнуть после извлечения (или удаления) части функциональности из иерархии классов, после которого метод остался используемым только в одном подклассе.

Если вы видите, что метод необходим более чем одному подклассу (но не всем), возможно, стоит создать промежуточный подкласс и переместить метод в него. Это позволит избежать дублирования кода, которое возникло бы при спуске метода во все подклассы.

Достоинства

  • Улучшает связность внутри классов. Метод находится там, где вы ожидаете его увидеть

Порядок рефакторинга

  1. Объявите метод в подклассе и скопируйте его код из суперкласса
  2. Удалите метод из суперкласса
  3. Найдите все места, где используется метод, и убедитесь, что он вызывается из нужного подкласса

Обратный рефакторинг

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

Ссылки