Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена суперкласса делегатом (Replace Superclass with Delegate).md
2026-02-23 19:52:05 +03:00

1.9 KiB
Raw Blame History

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

!Pasted image 20250220083403.png

Проблема

В интерфейсе стека присутствовали все операции списка, хотя большинство из них к стеку были не применимы.

class List {...}
class Stack extends List {...}

Решение

Превратить список в поле стека и делегировать ему необходимые операции.

class Stack {
  constructor() {
    this._storage = new List();
  }
}
class List {...}

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

Если функции суперкласса не имеют смысла для подкласса, это признак того, что я не должен применять наследование для использования функциональности суперкласса.

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

  1. Создайте в подклассе поле, которое ссылается на объект суперкласса. Инициализируйте эту ссылку делегата новым экземпляром
  2. Для каждого элемента суперкласса создайте в подклассе функцию передачи, которая выполняет передачу созданной ссылке на делегата. Выполните тестирование после реализации передачи для каждой согласованной группы.
  3. Когда все элементы суперкласса окажутся перекрыты передающими функциями, удалите наследование.

Ссылки