Comme je l'ai dit dans ma réponse initiale, je trouve cette loi très bien.
Sauf que, en pratique, ça donne souvent l'obligation de créer des wrappers qui vont diviser l'indirection.
L'exmple de Deloget est parlant:
1 2 3
| edgeGroups.add(edge.getDirection().combine(edges)); // incorrect
edgeGroups.add(combine(edge.getDirection(), edges)); // incorrect
edgeGroups.add(edge.combineInSameDirection(edges)); // CORRECT |
On a du créer une méthode combineInSameDirection pour respecter la loi de Demeter.
Si on veut combiner dans une autre direction que celui de
edge, il faut utiliser la 2è méthode, qui ne respecte pas la loi car on récupère une direction via
edge, et qu'on l'utilise.
Exemple:
edgeGroups.add( edge.combine( otherEdge.getDirection(), edges ) );
Qui ne respecte donc pas la loi.
Ce qu'on doit faire, alors c'est:
edgeGroups.add( edge.combine( otherEdge, edges ) );
Et c'est edge qui doit récupérer la direction de otherEdge. En somme, pour respecter la loi de Demeter, on a
déplacer du code.
C'est très bien et facile à appliquer quand on a une association ternaire, mais que se passe-t-il à partir du moment où on a une association comprenant plus d'entités ?
En essayant d'appliquer la loi à la lettre, on va se retrouver à créer des responsabilités là où il n'est pas nécessaire d'en avoir.
Imaginons par exemple que edge est dépendant de Direction, comme dans l'exemple de Deloget.
On va créer une classe fictive, Foo, qui dépendra également de Direction, dépendra non dans le sens hiérarchique, mais qui possède une instance de Direction.
Et c'est là que le bas blesse:
edgeGroups.add( edge.combine( Foo, edges ) );
edge ne connait pas Foo.
On peut "bypass" le problème en créant une interface d'abstraction pour tous les objets qui possèdent une instance Direction.
Résultat: on a de la redondance de code car l'implémentation de l'interface va se retrouver dans toutes les classes qui utilisent Direction.
Il est hors de question d'avoir un héritage de Direction pour traiter le problème de redondance, vu que notre classe n'est PAS une direction, et ne doit pas être traité comme tel.
Ceci n'est que ma pensée, et je n'ai pas été chercher trop loin, mais il me semble avoir été confronté à ce genre de problèmes lorsque je m'efforçais de respecter la loi de Demeter.
Pour moi, la redondance de code c'est pire que le non respect d'une loi dans certains cas.
Après, bien sûr, l'appliquer à chaque fois que c'est possible, c'est très très bien, chose d'ailleurs que je m'efforce de faire. Il est hors de question de laisser tomber cette loi qui apporte bien des choses pour la maintenance et pour l'évolution.
Partager