Logo ConstructiCat
CodeBust.
Parcourir la section ▾

Transformer une association unidirectionnelle en bidirectionnelle.

Problème

Vous avez deux classes qui ont chacune besoin d'utiliser les fonctionnalités de l'autre, mais l'association entre elles n'est qu'unidirectionnelle.

Solution

Ajoutez l'association manquante à la classe qui en a besoin.

##Exemple

Avant
class Order {
  Customer customer;

  void setCustomer(Customer arg) {
    customer = arg;
  }
}
class Customer {
}
Après
class Order {
  Customer customer;

  void setCustomer(Customer arg) {
    if (customer != null) customer.friendOrders().remove(this);
    customer = arg;
    if (customer != null) customer.friendOrders().add(this);
  }
}
class Customer {
  private Set<Order> orders = new HashSet<>();

  Set<Order> friendOrders() {
    return orders;
  }
}

##Pourquoi refactoriser

À l'origine, les classes avaient une association unidirectionnelle. Mais avec le temps, le code client a eu besoin d'accéder aux deux côtés de l'association.

##Avantages

  • Si une classe a besoin d'une association inverse, vous pouvez simplement la calculer. Mais si ces calculs sont complexes, il est préférable de conserver l'association inverse.

##Comment refactoriser

  1. Ajoutez un champ pour contenir l'association inverse.

  2. Décidez quelle classe sera « dominante ». Cette classe contiendra les méthodes qui créent ou mettent à jour l'association à mesure que des éléments sont ajoutés ou modifiés, en établissant l'association dans sa propre classe et en appelant les méthodes utilitaires pour établir l'association dans l'objet associé.

  3. Créez une méthode utilitaire pour établir l'association dans la classe « non dominante ». La méthode doit utiliser ce qui lui est fourni en paramètres pour renseigner le champ. Donnez à la méthode un nom évident afin qu'elle ne soit pas utilisée plus tard à d'autres fins.

  4. Si les anciennes méthodes de contrôle de l'association unidirectionnelle se trouvaient dans la classe « dominante », complétez-les par des appels aux méthodes utilitaires de l'objet associé.

  5. Si les anciennes méthodes de contrôle de l'association se trouvaient dans la classe « non dominante », créez les méthodes dans la classe « dominante », appelez-les et déléguez-leur l'exécution.