Salut,
A mon avis un accesseur c'est bien souvent un
code smell.
Pas seulement parce que ça bousille l'encapsulation mais plutôt parce que ça inverse le sens du flux d'exécution et du coup ça inverse aussi les dépendances entre objets.
Par exemple ici on obtient une dépendance depuis d'autres objets vers Carte, uniquement pour pouvoir faire un 'get' et donc pour obtenir des données.
L'orienté objet est quand même plus axé traitements que données (c'est un des courants en tous cas), idéalement il faut s'efforcer de transformer ce genre de dépendance pour les inverser : que l'objet Carte avertisse les autres objets qui en ont besoin lors d'une modification (
pattern observateur, etc..).
Ca a l'air anecdotique et on se dit "holala la grosse artillerie qu'est l'observateur c'est quand même plus simple de faire un get", néanmoins plus on systématise cette inversion de contrôle et plus on voit les avantages se dégager dont la plus importante est je trouve la facilité de mise en place de
proxies (vas-y faire un proxy sur un accesseur qui renvoit un int** pour décrire la carte).
Ca permet aussi de "lisser" les dépendances (et le flux d'exécution) en les mettant toutes dans le même sens : on peut les suivre linéairement sans avoir besoin de faire des aller-retours tout le temps (typiquement ce que fait un accesseur).
Pour donner une image ça transforme un diagramme de séquence très en hauteur en un tout en largeur.
Ca demande de se forcer un peu au début, mais ça vaut franchement le coup. Au final je trouve ça beaucoup plus simple, plus modulaire, plus souple, etc..
MAT.
Partager