Ich versuche, GRASP zu lernen und ich fand dies erklärt ( hier auf Seite 3 ) über Low Coupling und ich war sehr überrascht, als ich dies fand:
Betrachten Sie die Methode
addTrack
für eineAlbum
Klasse, zwei mögliche Methoden sind:
addTrack( Track t )
und
addTrack( int no, String title, double duration )
Welche Methode reduziert die Kopplung? Das zweite ist der Fall, da die Klasse, die die Album-Klasse verwendet, keine Track-Klasse kennen muss. Im Allgemeinen sollten Parameter für Methoden Basistypen (int, char ...) und Klassen aus den Java. * -Paketen verwenden.
Ich neige dazu, damit einverstanden zu sein; Ich halte addTrack(Track t)
es addTrack(int no, String title, double duration)
aus verschiedenen Gründen für besser als :
Es ist immer besser, wenn eine Methode so wenig Parameter wie möglich enthält (laut Uncle Bobs Clean Code keiner oder einer, vorzugsweise 2 in einigen Fällen und 3 in besonderen Fällen; mehr als 3 müssen überarbeitet werden - dies sind natürlich Empfehlungen, keine holly rules). .
Wenn
addTrack
es sich um eine Methode einer Schnittstelle handelt und die Anforderungen erfordern, dass aTrack
mehr Informationen (z. B. Jahr oder Genre) enthält, muss die Schnittstelle geändert werden, damit die Methode einen anderen Parameter unterstützt.Die Kapselung ist kaputt. wenn
addTrack
es sich in einer schnittstelle befindet, dann sollte es die interna der nicht kennenTrack
.Es ist tatsächlich mehr auf die zweite Art und Weise gekoppelt, mit vielen Parametern. Angenommen, der
no
Parameter muss von nach geändert werdenint
,long
da mehr alsMAX_INT
Spuren vorhanden sind (oder aus welchem Grund auch immer). dann müssen sowohl dieTrack
als auch die Methode geändert werden, während wenn die MethodeaddTrack(Track track)
nur dieTrack
geändert werden würde.
Alle 4 Argumente sind tatsächlich miteinander verbunden, und einige von ihnen sind Konsequenzen aus anderen.
Welcher Ansatz ist besser?