Kopplung, Kohäsion und das Gesetz von Demeter
Den Gesetz von Demeter zeigt an, dass Sie sollten sprechen Sie nur zu Objekten, die Sie wissen über direkt. Das heißt, führen Sie nicht die Verkettung von Methoden zu sprechen, um andere Objekte. Wenn Sie dies tun, werden Sie zur Gründung unsachgemäße verbindungen mit der Vermittler-Objekte, unpassend Kupplung Ihren code anderen code.
Ist das schlecht.
Die Lösung wäre für die Klasse, die Sie kennen, im wesentlichen setzen einfache Wrapper, übertragen Sie die Verantwortung für das Objekt, es hat die Beziehung mit.
Gut.
Aber scheint das Ergebnis in der Klasse mit niedrigen zusammenhalt. Es ist nicht mehr einfach verantwortlich für genau das, was es tut, aber es hat auch die Delegierten, die in einem gewissen Sinne, was den code weniger zusammenhalt durch das duplizieren von teilen der Schnittstelle der zugehörigen Objekt.
Ist das schlecht.
Ist es wirklich Ergebnis-Senkung der zusammenhalt? Ist es das kleinere von zwei übeln?
Ist das eine dieser Grauzonen der Entwicklung, wo Sie debattieren können, wo die Linie ist, oder sind es starke, grundsätzliche Möglichkeiten der Herstellung einer Entscheidung, wo die Grenze zu ziehen und welche Kriterien Sie verwenden können, um diese Entscheidung zu treffen?
- Zwar ein wenig off-topic, würde ich dringend empfehlen, Ted Faisons "Event-based programming: taking events to the limit" link. Es gibt eine große Panne auf der gemeinsamen Kupplung Probleme und gibt ein gutes system, um die Messung der Höhe der Kupplung in einem bestimmten system
- Bei Verstößen gegen die LoD, ob die zusätzlichen verbindungen sind "falsche" hängt von der Art der verknüpften Klassen: Wenn diese sehr prominent (denke, Zeile, Spalte, Zelle in der Umsetzung von Excel), die Kupplung zu Ihnen ist unproblematisch und der LoD ist sehr restriktiv. Ebenso, wenn die Klassen in Frage gezielt reinen Daten-Klassen mit im wesentlichen kein Verhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grady Booch in der "Objekt-Orientierten Analyse und Design":
"Die Idee der Kohäsion kommt auch aus strukturierten design. Einfach gesagt, zusammenhalt
misst den Grad der Konnektivität zwischen den Elementen eines einzelnen Moduls (und
für Objekt-orientiertes design, eine einzelne Klasse oder ein Objekt). Die am wenigsten wünschenswerte form der
zusammenhalt ist Zufall, zusammenhalt, in dem völlig andere Abstraktionen
geworfen in die gleiche Klasse oder ein Modul. Betrachten wir zum Beispiel eine Klasse, bestehend aus
die Abstraktionen von Hunde-und Raumfahrzeugen, deren Verhalten sind ganz andere. Die
die wünschenswerteste form von Kohäsion funktionale Kohäsion, die einzelnen Elemente von
eine Klasse oder ein Modul, das alle zusammen arbeiten, um etwas gut begrenzt Verhalten.
So, die Klasse Hund ist funktional zusammenhängende, wenn seine Semantik umarmen, das Verhalten
ein Hund, der ganze Hund, und nichts als der Hund."
Ersetzt Hund mit dem Kunden in der vor-und vielleicht ist es ein bisschen klarer. Das Ziel ist also eigentlich nur zum Ziel für den funktionalen zusammenhalt und die Abkehr von der zufällige zusammenhalt, so viel wie möglich. Je nach Ihren Abstraktionen, diese können einfach sein oder könnte es erfordern, dass einige refactoring.
Hinweis zusammenhalt gilt nur so viel, um ein "Modul" ist, als eine einzelne Klasse, dh eine Gruppe von Klassen, die zusammen arbeiten. Also in diesem Fall der Kunde-und Bestellung-Klassen haben noch anständige zusammenhalt, weil Sie dieses starke relationshhip, Kunden anlegen von Bestellungen, Aufträge gehören zu den Kunden.
Martin Fowler sagt, er wäre wohler nannte es den "Vorschlag der Demeter" (siehe den Artikel Mocks aren ' T stubs):
"Mockist Tester sprechen mehr über die Vermeidung von 'Zug-Wracks' - Methode, die Ketten der Stil von getThis().getThat().getTheOther(). Die Vermeidung von Ketten-Methode ist auch bekannt als nach dem Gesetz von Demeter. Während die Methode, die Ketten sind der Geruch, die das gegenteilige problem von Mitte Männer als Objekte, die aufgebläht ist mit forwarding-Methoden ist auch ein Geruch. (Ich habe immer das Gefühl, ich würde mich wohler mit dem Gesetz von Demeter, wenn Sie aufgerufen wurden, die Vorschlag von Demeter .)"
Fasst schön, wo ich komme aus: es ist durchaus akzeptabel und oft notwendig, um einen geringeren zusammenhalt als die strikte Einhaltung der "Gesetze" erfordern dürfte. Vermeiden Sie zufällige zusammenhalt und das Ziel für die funktionale Kohäsion, aber don ' T get hung up auf optimieren, wo nötig, passen mehr natürlich mit Ihrem design-Abstraktion.
Wenn Sie gegen das Gesetz von Demeter durch
die Lösung ist nicht das erstellen einer getOrderPrice() und transformieren den code in
aber stattdessen beachten Sie, dass dies ein code smell und nehmen Sie die relevanten änderungen, die hoffentlich beide erhöhen die Kohäsion und geringer Kopplung. Leider gibt es keine einfache refactoring hier, das immer gilt, aber man sollte wohl gelten sagen nicht Fragen
Ich denke, Sie kann missverstanden haben, was zusammenhalt bedeutet. Eine Klasse, die implementiert wird, in Bezug auf mehrere andere Klassen nicht unbedingt geringe Kohäsion, solange es stellt ein klares Konzept und einen klaren Zweck. Zum Beispiel, haben Sie möglicherweise eine
class Person
, die implementiert wird, in Bezug auf die KlassenDate
(Geburtsdatum),Address
, undEducation
(eine Liste der Schulen, die die person ging). Sie können Wrapper inPerson
für immer das Jahr der Geburt, die Letzte Schule die person ging, oder den Staat, wo er lebt, zu vermeiden, dass die Tatsache, dassPerson
implementiert ist, in Bezug auf die anderen Klassen. Dies würde verringern Kupplung, aber es wärePerson
nicht weniger zusammenhalt.Es ist eine Grauzone.
Diese Prinzipien sind gedacht, um Ihnen bei Ihrer Arbeit helfen, wenn Sie finden, Sie die für Sie tätig sind (D. H. Sie sind immer im Weg und/oder Sie finden es über kompliziert Ihre code) dann sind Sie konform zu schwer, und Sie müssen zurück off.
Machen es für Sie arbeiten, nicht für ihn arbeiten.
Ich weiß nicht, ob dies tatsächlich senkt zusammenhalt.
Aggregation/Komposition sind alle von einer Klasse nutzen andere Klassen, um den Vertrag zu erfüllen es macht durch seine öffentlichen Methoden.
Die Klasse muss nicht duplizieren Sie die Schnittstelle der zugehörigen Objekte. Es ist tatsächlich versteckt jeder knwowledge über diese aggregierten Klassen von der Methode caller.
Gehorchen das Gesetz von Demeter im Falle von mehreren Stufen der class-Abhängigkeit, die Sie nur anwenden müssen, aggregation/Komposition und gute Kapselung auf jeder Ebene.
In anderen Worten: jede Klasse hat eine oder mehrere Abhängigkeiten zu anderen Klassen, aber diese sind immer nur Abhängigkeiten auf der referenzierten Klasse und nicht auf alle Objekte zurückgegeben, die von properies/Methoden.
In den Situationen, in denen es scheint ein Kompromiss zwischen Kopplung und Kohäsion, würde ich wahrscheinlich mich Fragen: "wenn jemand anderes bereits geschrieben hatte, diese Logik, und ich waren auf der Suche für einen Fehler, wo sollte ich zuerst suchen?", und schreiben den code, der Weise.