Замена делегирования наследованием
Проблема
Класс содержит множество простых делегирующих методов ко всем методам другого класса.
Решение
Сделайте класс наследником делегата, после чего делегирующие методы потеряют смысл.
![Replace Delegation with Inheritance - Before](/images/refactoring/diagrams/Replace Delegation with Inheritance - Before.png?id=b408bcc35ce5a341e675818d6c1124a2)
![Replace Delegation with Inheritance - After](/images/refactoring/diagrams/Replace Delegation with Inheritance - After.png?id=633a1c3ff0e87033e10408df57ac6118)
Причины рефакторинга
Делегирование является более гибким подходом, чем наследование, так как позволяет изменять поведение класса на лету, заменяя объект к которому происходит делегирование. Тем не менее, применение делегирования перестаёт быть выгодным, если вы делегируете действия только одному классу, причём всем его публичным методам.
Если в этом случае заменить делегирование наследованием, вы избавите класс от множества делегирующих методов, а себя от необходимости создавать их для каждого нового метода класса-делегата.
Достоинства
- Уменьшает количество кода. Вам больше не нужны все эти делегирующие методы.
Когда нельзя применить
-
Не применяйте рефакторинг, если класс содержит делегирование только к части публичных методов класса-делегата. Этим вы нарушите принцип замещения Барбары Лисков.
-
Этот рефакторинг может быть применён только если класс ещё не имеет родителей.
Порядок рефакторинга
-
Сделайте класс подклассом класса-делегата.
-
В поле, содержащее ссылку на объект-делегат, поставьте текущий объект.
-
Один за другим удаляйте методы с простым делегированием. Если у них отличались названия, используйте переименование метода чтобы привести все методы к одному названию.
-
Замените все обращения к полю-делегату обращениями к текущему объекту.
-
Удалите поле-делегат.