Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Cacher le délégué.

Problème

Le client obtient l'objet B à partir d'un champ ou d'une méthode de l'objet A. Le client appelle ensuite une méthode de l'objet B.

Solution

Créez une nouvelle méthode dans la classe A qui délègue l'appel à l'objet B. Désormais, le client ne connaît plus la classe B et n'en dépend plus.

##Exemple

Avant
manager = person.getDepartment().getManager();
Après
manager = person.getManager();

class Person {
  Department getDepartment() { return department; }
  Person getManager() { return department.getManager(); }
}

##Pourquoi refactoriser

Commençons par la terminologie :

  • Le serveur est l'objet auquel le client a directement accès.

  • Le délégué est l'objet final qui contient les fonctionnalités dont le client a besoin.

Une chaîne d'appels apparaît lorsqu'un client demande un objet à un autre objet, puis que ce second objet en demande un autre, et ainsi de suite. Ces séquences d'appels obligent le client à naviguer dans la structure des classes. Tout changement dans ces relations imposera des modifications du côté client.

##Avantages

  • Masque la délégation au client. Moins le code client a besoin de connaître les détails des relations entre les objets, plus il est facile d'apporter des modifications à votre programme.

##Comment refactoriser

  1. Pour chaque méthode de la classe déléguée appelée par le client, créez une méthode dans la classe serveur qui délègue l'appel à la classe déléguée.

  2. Modifiez le code client afin qu'il appelle les méthodes de la classe serveur.

  3. Si vos modifications libèrent le client de toute dépendance à la classe déléguée, vous pouvez supprimer de la classe serveur la méthode d'accès à la classe déléguée (la méthode initialement utilisée pour obtenir la classe déléguée).