Encapsuler une collection.
Une classe contient un champ de type collection ainsi qu'un simple getter et un simple setter pour manipuler la collection.
Rendez la valeur renvoyée par le getter en lecture seule et créez des méthodes pour ajouter/supprimer des éléments de la collection.
##Example
##Why Refactor
Une classe contient un champ qui contient une collection d'objets. Cette collection peut être un tableau, une liste, un ensemble ou un vecteur. Un getter et un setter classiques ont été créés pour manipuler la collection.
Mais les collections devraient être utilisées selon un protocole un peu différent de celui des autres types de données. La méthode getter ne devrait pas renvoyer l'objet collection lui-même, car cela permettrait aux clients de modifier le contenu de la collection à l'insu de la classe propriétaire. De plus, cela exposerait trop des structures internes des données de l'objet aux clients. La méthode permettant d'obtenir les éléments de la collection devrait renvoyer une valeur qui n'autorise pas la modification de la collection ni ne divulgue de données superflues sur sa structure.
En outre, il ne devrait pas y avoir de méthode qui affecte une valeur à la collection. Il devrait plutôt y avoir des opérations d'ajout et de suppression d'éléments. Grâce à cela, l'objet propriétaire garde le contrôle de l'ajout et de la suppression des éléments de la collection.
Un tel protocole encapsule correctement une collection, ce qui réduit finalement le degré de couplage entre la classe propriétaire et le code client.
##Benefits
-
Le champ de type collection est encapsulé à l'intérieur d'une classe. Lorsque le getter est appelé, il renvoie une copie de la collection, ce qui empêche toute modification ou tout écrasement accidentel des éléments de la collection à l'insu de la classe qui la contient.
-
Si les éléments de la collection sont contenus dans un type primitif, tel qu'un tableau, vous créez des méthodes plus pratiques pour manipuler la collection.
-
Si les éléments de la collection sont contenus dans un conteneur non primitif (une classe de collection standard), en encapsulant la collection vous pouvez restreindre l'accès aux méthodes standard indésirables de la collection (par exemple en restreignant l'ajout de nouveaux éléments).
##How to Refactor
-
Créez des méthodes pour ajouter et supprimer des éléments de la collection. Elles doivent accepter les éléments de la collection dans leurs paramètres.
-
Affectez une collection vide au champ comme valeur initiale si cela n'est pas déjà fait dans le constructeur de la classe.
-
Trouvez les appels du setter du champ de collection. Modifiez le setter pour qu'il utilise les opérations d'ajout et de suppression d'éléments, ou faites en sorte que ces opérations soient appelées par le code client.
Notez que les setters ne peuvent servir qu'à remplacer tous les éléments de la collection par d'autres. Il peut donc être judicieux de changer le nom du setter (Renommer une méthode) en replace.
-
Trouvez tous les appels du getter de la collection après lesquels la collection est modifiée. Modifiez le code pour qu'il utilise vos nouvelles méthodes d'ajout et de suppression d'éléments de la collection.
-
Modifiez le getter pour qu'il renvoie une représentation en lecture seule de la collection.
-
Examinez le code client qui utilise la collection à la recherche de code qui aurait mieux sa place à l'intérieur de la classe de collection elle-même.