J'essaie d'apprendre GRASP et j'ai trouvé cela expliqué ( ici à la page 3 ) sur le couplage bas et j'ai été très surpris quand j'ai trouvé ceci:
Considérez la méthode
addTrack
pour uneAlbum
classe, deux méthodes possibles sont:
addTrack( Track t )
et
addTrack( int no, String title, double duration )
Quelle méthode réduit le couplage? La seconde le fait, car la classe utilisant la classe Album n'a pas besoin de connaître une classe Track. En général, les paramètres des méthodes doivent utiliser les types de base (int, char ...) et les classes des packages java. *.
J'ai tendance à ne pas être d'accord avec cela; Je pense que addTrack(Track t)
c'est mieux que addTrack(int no, String title, double duration)
pour diverses raisons:
Il est toujours préférable pour une méthode d'avoir le moins de paramètres possible (selon le code propre de l'oncle Bob, aucun ou un de préférence, 2 dans certains cas et 3 dans des cas spéciaux; plus de 3 doivent être refactorisés - ce sont bien sûr des recommandations et non des règles holistiques) .
Si
addTrack
est une méthode d'une interface, et que les conditions requisesTrack
doivent avoir plus d'informations (par exemple l'année ou le genre), l'interface doit être modifiée et la méthode doit donc prendre en charge un autre paramètre.L'encapsulation est rompue; si
addTrack
est dans une interface, alors il ne devrait pas connaître les internes duTrack
.Il est en fait plus couplé dans la deuxième manière, avec de nombreux paramètres. Supposons que le
no
paramètre doit être changé deint
àlong
car il y a plus deMAX_INT
pistes (ou pour une raison quelconque); alors laTrack
et la méthode doivent être changées tandis que si la méthode était laaddTrack(Track track)
seuleTrack
serait changée.
Tous les 4 arguments sont en fait liés les uns aux autres, et certains d'entre eux sont des conséquences d'autres.
Quelle approche est la meilleure?