Site icon Blog Zenika

Collection accessors considered harmful

L’art du design objet repose sur la détermination des rôles et responsabilités de chaque classe. Quelle classe est responsable de la gestion de telle ou telle donnée ? A qui et sous quelles conditions ces données sont-elles exposées ? Il est bon de se poser ces questions souvent et de questionner son modèle objet tout au long de sa conception.
Actuellement, la mode est aux POJOS. Depuis quelques années, depuis Hibernate et Spring, tout le monde a appris à programmer comme ça. On crée une classe, on déclare ses champs privés, et on génère des accesseurs : un coup de bouton droit dans Eclipse, et le tour est joué – easy as pie.
Le problème, c’est que ce réflexe conditionné est dangereux dans le cas des collections, car il affaiblit l’encapsulation de la classe.
Le code suivant illustre le problème.
En fournissant des accesseurs directs sur la collection d’Items, la classe Caddie expose son fonctionnement interne, et perd le contrôle de l’ajout ou de la suppression d’éléments dans le Set. Non seulement l’encapsulation est rompue, mais il devient plus difficile de changer l’implémentation de la classe, par exemple pour modifier le type de collection utilisée.

  1. public class Caddie
  2. {
  3. private Set<Item> items = new LinkedHashSet<Item>();
  4. public Set<Item> getItems()
  5. { return this.items;
  6. }
  7. public void setItems(Set<Item> items)
  8. { this.items = items;
  9. }
  10. }

La solution suivante permet de reprendre le contrôle sur la collection d’Items. Elle est basée sur deux principes :

  1. public class Caddie
  2. {
  3. private Set<Item> items = new LinkedHashSet<Item>();
  4. public Collection<Item> getItems()
  5. { return Collections.unmodifiableSet(items);
  6. }
  7. public boolean addItem(Item item)
  8. { return items.add(item);
  9. }
  10. public boolean removeItem(Item item)
  11. { return items.remove(item);
  12. }
  13. }

La prochaine fois que vous générez des accesseurs pour vos POJOs, pensez à porter un regard critique sur leur encapsulation : ne laissez pas Eclipse réfléchir pour vous !

Quitter la version mobile