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
addTrackfür eineAlbumKlasse, 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
addTrackes sich um eine Methode einer Schnittstelle handelt und die Anforderungen erfordern, dass aTrackmehr 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
addTrackes 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
noParameter muss von nach geändert werdenint,longda mehr alsMAX_INTSpuren vorhanden sind (oder aus welchem Grund auch immer). dann müssen sowohl dieTrackals auch die Methode geändert werden, während wenn die MethodeaddTrack(Track track)nur dieTrackgeändert werden würde.
Alle 4 Argumente sind tatsächlich miteinander verbunden, und einige von ihnen sind Konsequenzen aus anderen.
Welcher Ansatz ist besser?