Dupliquer les données observées.
Des données métier sont-elles stockées dans des classes responsables de l’interface graphique ?
Il est alors judicieux de séparer les données dans des classes distinctes, en assurant la liaison et la synchronisation entre la classe métier et l’interface graphique.
##Example
##Why Refactor
Vous souhaitez disposer de plusieurs vues d’interface pour les mêmes données (par exemple, vous avez à la fois une application de bureau et une application mobile). Si vous ne parvenez pas à séparer l’interface graphique du domaine métier, il vous sera très difficile d’éviter la duplication de code et un grand nombre d’erreurs.
##Benefits
-
Vous répartissez les responsabilités entre les classes de logique métier et les classes de présentation (cf. le principe de responsabilité unique), ce qui rend votre programme plus lisible et plus compréhensible.
-
Si vous devez ajouter une nouvelle vue d’interface, il vous suffit de créer de nouvelles classes de présentation ; vous n’avez pas besoin de toucher au code de la logique métier (cf. le principe ouvert/fermé).
-
Désormais, différentes personnes peuvent travailler sur la logique métier et sur les interfaces utilisateur.
##How to Refactor
-
Masquez l’accès direct aux données métier dans la classe d’interface graphique. Pour cela, le mieux est d’utiliser Auto-encapsuler un champ. Vous créez ainsi les accesseurs (getters et setters) pour ces données.
-
Dans les gestionnaires d’événements de la classe d’interface graphique, utilisez les setters pour définir les nouvelles valeurs des champs. Cela vous permettra de transmettre ces valeurs à l’objet métier associé.
-
Créez une classe métier et copiez-y les champs nécessaires depuis la classe d’interface graphique. Créez des getters et des setters pour tous ces champs.
-
Créez un patron Observateur pour ces deux classes :
-
Dans la classe métier, créez un tableau pour stocker les objets observateurs (objets d’interface graphique), ainsi que des méthodes pour les enregistrer, les supprimer et les notifier.
-
Dans la classe d’interface graphique, créez un champ pour stocker les références vers la classe métier ainsi que la méthode
update(), qui réagira aux changements de l’objet et mettra à jour les valeurs des champs de la classe d’interface graphique. Notez que les mises à jour de valeurs doivent être effectuées directement dans la méthode, afin d’éviter la récursivité. -
Dans le constructeur de la classe d’interface graphique, créez une instance de la classe métier et enregistrez-la dans le champ que vous avez créé. Enregistrez l’objet d’interface graphique comme observateur de l’objet métier.
-
Dans les setters des champs de la classe métier, appelez la méthode de notification de l’observateur (autrement dit, la méthode de mise à jour de la classe d’interface graphique), afin de transmettre les nouvelles valeurs à l’interface graphique.
-
Modifiez les setters des champs de la classe d’interface graphique pour qu’ils définissent directement les nouvelles valeurs dans l’objet métier. Veillez à ne pas définir les valeurs via un setter de la classe métier, sous peine de provoquer une récursivité infinie.
-