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
addTrackper unaAlbumclasse, 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 aTrackabbia 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
addTracktrova in un'interfaccia, non dovrebbe conoscere gli interni diTrack.In realtà è più accoppiato nel secondo modo, con molti parametri. Supponiamo che il
noparametro debba essere modificato daintalongperché ci sono più diMAX_INTtracce (o per qualsiasi motivo); allora sia ilTrackmetodo che il metodo devono essere cambiati mentre se il metodo fosseaddTrack(Track track)solo ilTracksarebbe cambiato.
Tutti e 4 gli argomenti sono in realtà collegati tra loro e alcuni di essi sono conseguenze di altri.
Quale approccio è migliore?