Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

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

Проблема

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

Решение

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

##Пример

До
class Employee {
  private Person person = new Person();

  String getName() { return person.getName(); }
  void setName(String arg) { person.setName(arg); }
}
После
class Employee extends Person {
}

##Зачем делать рефакторинг

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

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

##Преимущества

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

##Как делать рефакторинг

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

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

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

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

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