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
addTrackpour uneAlbumclasse, 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
addTrackest une méthode d'une interface, et que les conditions requisesTrackdoivent 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
addTrackest 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
noparamètre doit être changé deintàlongcar il y a plus deMAX_INTpistes (ou pour une raison quelconque); alors laTracket la méthode doivent être changées tandis que si la méthode était laaddTrack(Track track)seuleTrackserait 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?