Также известен как Replace Delegation with Inheritance

Рефакторинг Замена делегирования наследованием

Проблема

Класс содержит множество простых делегирующих методов ко всем методам другого класса.

Решение

Сделайте класс наследником делегата, после чего делегирующие методы потеряют смысл.
До
Replace Delegation with Inheritance - Before
После
Replace Delegation with Inheritance - After

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

Делегирование является более гибким подходом, чем наследование, т.к. позволяет изменять поведение класса на лету, заменяя объект к которому происходит делегирование. Тем не менее, применение делегирования перестаёт быть выгодным, если вы делегируете действия только одному классу, причём всем его публичным методам.

Если в этом случае заменить делегирование наследованием, вы избавите класс от множества делегирующих методов, а себя от необходимости создавать их для каждого нового метода класса-делегата.

Достоинства

  • Уменьшает количество кода. Вам больше не нужны все эти делегирующие методы.

Когда нельзя применить

  • Не применяйте рефакторинг, если класс содержит делегирование только к части публичных методов класса-делегата. Этим вы нарушите принцип замещения Барбары Лисков.

  • Этот рефакторинг может быть применён только если класс ещё не имеет родителей.

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

  1. Сделайте класс подклассом класса-делегата.

  2. В поле, содержащее ссылку на объект-делегат, поставьте текущий объект.

  3. Один за другим удаляйте методы с простым делегированием. Если у них отличались названия, используйте «переименование метода» (Rename method) чтобы привести все методы к одному названию.

  4. Замените все обращения к полю-делегату обращениями к текущему объекту.

  5. Удалите поле-делегат.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш новый интерактивный курс по рефакторингу. Он более информативный и гораздо более интересный, чем банальный текст.

Узнать больше...

Живой пример

Первый раз здесь? Ничего страшного!

У нас здесь всё просто – интерактивный пример очень похож на видео (но выглядит гораздо круче).

  1. После начала проигрывания, вам показываются разнообразные подсказки и сообщения. Вы продвигаетесь дальше, кликая на них.
  2. Вы можете перематывать шаги, используя стрелки слева.
  3. Кроме того, вы можете посмотреть разницу между первоначальным и получившимся кодом, нажав кнопку с глазом ().
  4. Кнопка компиляции () позвоялет проверить текущий код на наличие ошибок.