Sto cercando di imparare GRASP e ho trovato questo spiegato ( qui a pagina 3 ) su Low Coupling e sono rimasto molto sorpreso quando ho trovato questo:
Consider the method
addTrack
for anAlbum
class, two possible methods are:
addTrack( Track t )
and
addTrack( int no, String title, double duration )
Which method reduces coupling? The second one does, since the class using the Album class does not have to know a Track class. In general, parameters to methods should use base types (int, char ...) and classes from the java.* packages.
Tendo a diasgree con questo; Credo che addTrack(Track t)
sia migliore di addTrack(int no, String title, double duration)
a causa di vari motivi:
-
È sempre meglio per un metodo avere il minor numero possibile di parametri (secondo il Codice pulito di Uncle Bob nessuno o uno preferibilmente, 2 in alcuni casi e 3 in casi speciali; più di 3 necessita di refactoring - questi sono di Raccomandazioni sui corsi non sulle regole dell'agrifoglio).
-
Se
addTrack
è un metodo di un'interfaccia e i requisiti richiedono che unTrack
debba avere più informazioni (ad esempio anno o genere), l'interfaccia deve essere modificata e il metodo deve supportare un altro parametro. -
L'incapsulamento è rotto; se
addTrack
è in un'interfaccia, allora non dovrebbe conoscere le parti interne diTrack
. -
In realtà è più accoppiato nel secondo modo, con molti parametri. Supponiamo che il parametro
no
debba essere cambiato daint
along
perché ci sono più diMAX_INT
tracce (o per qualsiasi ragione); quindi sia ilTrack
che il metodo devono essere modificati mentre se il metodo sarebbeaddTrack(Track track)
solo laTrack
verrebbe modificata.
Tutti e 4 gli argomenti sono effettivamente connessi tra loro, e alcuni di essi sono conseguenze di altri.
Quale approccio è migliore?