Sto cercando di imparare GRASP e ho trovato questo spiegato ( qui a pagina 3 ) sull'accoppiamento basso e sono rimasto molto sorpreso quando ho trovato questo:
Considera il metodo
addTrack
per unaAlbum
classe, due possibili metodi sono:
addTrack( Track t )
e
addTrack( int no, String title, double duration )
Quale metodo riduce l'accoppiamento? Il secondo sì, poiché la classe che utilizza la classe Album non deve conoscere una classe Track. In generale, i parametri dei metodi dovrebbero usare tipi di base (int, char ...) e classi dai pacchetti java. *.
Tendo a diasgree con questo; Credo che addTrack(Track t)
sia meglio che addTrack(int no, String title, double duration)
per vari motivi:
È sempre meglio per un metodo il minor numero possibile di parametri (secondo il Clean Code di Zio Bob nessuno o uno preferibilmente, 2 in alcuni casi e 3 in casi speciali; più di 3 necessita di refactoring - queste sono ovviamente raccomandazioni non regole di agrifoglio) .
Se
addTrack
è un metodo di un'interfaccia e i requisiti richiedono che aTrack
abbia più informazioni (ad esempio anno o genere), allora l'interfaccia deve essere modificata e in modo che il metodo supporti un altro parametro.L'incapsulamento è rotto; se si
addTrack
trova in un'interfaccia, non dovrebbe conoscere gli interni diTrack
.In realtà è più accoppiato nel secondo modo, con molti parametri. Supponiamo che il
no
parametro debba essere modificato daint
along
perché ci sono più diMAX_INT
tracce (o per qualsiasi motivo); allora sia ilTrack
metodo che il metodo devono essere cambiati mentre se il metodo fosseaddTrack(Track track)
solo ilTrack
sarebbe cambiato.
Tutti e 4 gli argomenti sono in realtà collegati tra loro e alcuni di essi sono conseguenze di altri.
Quale approccio è migliore?