Замена делегирования наследованием
Проблема
Класс содержит множество простых делегирующих методов ко всем методам другого класса.
Решение
Сделайте класс наследником делегата, после чего делегирующие методы потеряют смысл.
Причины рефакторинга
Делегирование является более гибким подходом, чем наследование, так как позволяет изменять поведение класса на лету, заменяя объект к которому происходит делегирование. Тем не менее, применение делегирования перестаёт быть выгодным, если вы делегируете действия только одному классу, причём всем его публичным методам.
Если в этом случае заменить делегирование наследованием, вы избавите класс от множества делегирующих методов, а себя от необходимости создавать их для каждого нового метода класса-делегата.
Достоинства
- Уменьшает количество кода. Вам больше не нужны все эти делегирующие методы.
Когда нельзя применить
-
Не применяйте рефакторинг, если класс содержит делегирование только к части публичных методов класса-делегата. Этим вы нарушите принцип замещения Барбары Лисков.
-
Этот рефакторинг может быть применён только если класс ещё не имеет родителей.
Порядок рефакторинга
-
Сделайте класс подклассом класса-делегата.
-
В поле, содержащее ссылку на объект-делегат, поставьте текущий объект.
-
Один за другим удаляйте методы с простым делегированием. Если у них отличались названия, используйте переименование метода чтобы привести все методы к одному названию.
-
Замените все обращения к полю-делегату обращениями к текущему объекту.
-
Удалите поле-делегат.