Autumn SALE

Замена делегирования наследованием

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

Проблема

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

Решение

Сделайте класс наследником делегата, после чего делегирующие методы потеряют смысл.

До
Replace Delegation with Inheritance - Before
После
Replace Delegation with Inheritance - After

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

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

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

Достоинства

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

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

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

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

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

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

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

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

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

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