Frage

Die Gesetz von Demeter zeigt an, dass Sie nur auf Objekte sprechen sollte, die Sie direkt kennen. Das heißt, nicht durchführt Methode Verkettung mit anderen Objekten zu sprechen. Wenn Sie dies tun, können Sie mit den dazwischen liegenden Objekte falsche Verknüpfungen etablieren, Kupplung Ihre Code zu anderem Code.

Das ist schlecht.

Die Lösung für die Klasse sein würden Sie wissen, um im wesentlichen einfachen Wrapper aussetzen, der die Verantwortung für das Objekt delegieren die Beziehung hat mit.

Das ist gut.

Aber, die in der Klasse mit niedriger Zusammenhalt zu führen scheint. Es ist nicht mehr nur für genau das, was es tut, aber es hat auch die Delegierten, dass in einem gewissen Sinne, so dass der Code weniger kohäsiv durch Teile der Schnittstelle des mit ihm verbundenen Objekt zu duplizieren.

Das ist schlecht.

führt es wirklich in Zusammenhalt senken? Ist es das kleinere Übel?

Ist das einer dieser grauen Bereichen Entwicklung, wo man diskutieren kann, wo die Linie ist, oder gibt es starke, prinzipien Möglichkeiten, eine Entscheidung, wo die Grenze zu ziehen und welche Kriterien können Sie diese Entscheidung treffen verwenden?

War es hilfreich?

Lösung

Grady Booch in "Object Oriented Analysis and Design":

"Die Idee der Kohäsion kommt auch von strukturiertem Design. Einfach gesagt, Zusammenhalt misst den Grad der Konnektivität zwischen den Elementen eines einzelnen Moduls (und für objektorientiertes Design, eine einzige Klasse oder das Objekt). Die am wenigsten wünschenswerte Form von Zusammenhalt ist zufällig Zusammenhalt, in denen völlig unabhängig Abstraktionen in der gleichen Klasse oder Modul geworfen. Betrachten wir zum Beispiel eine Klasse umfassend die Abstraktionen von Hunden und Raumschiff, deren Verhaltensweisen sind ziemlich unabhängig. Das wünschenswerteste Form Kohäsion ist funktional Kohäsion, in dem die Elemente von eine Klasse oder ein Modul alle zusammen etwas gut begrenzt Verhalten zu schaffen, arbeiten. Somit ist die Klasse Dog funktionell zusammenhängende, wenn seine Semantik das Verhalten umarmen einen Hund, der ganzen Hund und nichts als der Hund. "

Subsitute Hund mit Kunden in der oben und es könnte ein bisschen klarer. So ist das Ziel wirklich nur für funktionalen Zusammenhalt zu zielen und zu bewegen, weg von zufälligem Zusammenhalt so viel wie möglich. Je nach Ihren Abstraktionen, so einfach sein kann oder könnte etwas Refactoring erfordern.

Hinweis Zusammenhalt gilt genauso viel zu einem „Modul“ als zu einer einzigen Klasse, dh eine Gruppe von Klassen zusammenarbeiten. Also in diesem Fall immer noch die Kunden- und Auftragsklassen anständig Zusammenhalt haben, weil sie diese starken relationshhip haben, Kunden zu schaffen Aufträge, gehören Aufträge an den Kunden.

Martin Fowler sagt er bequemer wäre es die „Anregung von Demeter“ (siehe den Artikel aufrufen Mocks sind nicht Stummel ):

"Mockist Tester haben mehr sprechen über die Vermeidung‚Zugwracke.‘- Methode Ketten Stil getThis () getThat () getTheOther () -Methode Ketten vermeiden auch nach dem Gesetz von Demeter bekannt ist Während Methode Ketten sind... ein Geruch, Objekte das entgegengesetzte Problem der mittleren Männer mit Weiterleitungsmethoden aufgebläht wird auch einen Geruch. (ich habe immer das Gefühl, ich mit dem Gesetz des Demeter bequemer sein würde, wenn es den Vorschlag des Demeter genannt wurde ). "

Das fasst schön, wo ich kommen bin: es ist durchaus akzeptabel und oft notwendig, ein geringeres Maß an Zusammenhalt als die strikte Einhaltung des „Gesetz“ zu haben, könnte erfordern. Vermeiden Sie zufällig Zusammenhalt und Ziel für funktionellen Zusammenhalt, aber nicht bekommen, aufgehängt auf zwicken, wo nötig mehr natürlich mit Ihrem Design Abstraktion passen.

Andere Tipps

Wenn Sie das Gesetz von Demeter verstoßen, indem

int price = customer.getOrder().getPrice();

die Lösung ist nicht ein getOrderPrice () zu erstellen und den Code in

verwandeln
int price = customer.getOrderPrice();

, sondern zu beachten, dass dies ein Code Geruch und nehmen sie die entsprechenden Änderungen, die hoffentlich sowohl Anstieg Zusammenhalt und geringere Kopplung. Leider gibt es keine einfache Refactoring hier, die immer gilt, aber Sie sollten wahrscheinlich gelten nicht sagen, fragen

Ich glaube, Sie falsch verstanden haben, was die Kohäsionsmittel. Eine Klasse, die in Form von mehreren anderen Klassen implementiert hat nicht notwendigerweise geringe Kohäsion, solange es ein klares Konzept darstellt, und hat ein klares Ziel. Zum Beispiel können Sie eine class Person haben, die in Bezug auf die Klassen Date umgesetzt wird (Geburtsdatum), Address und Education (eine Liste der Schulen die Person ging an). Sie können für das Erhalten des Geburtsjahres Wrapper in Person bieten, die letzte Schule ging die Person, oder der Zustand, in dem er lebt, zu vermeiden, dass die Tatsache, dass aussetzt Person in Bezug auf den anderen Klassen implementiert. Dies würde Kopplung reduzieren, aber es würde Person nicht weniger Zusammenhalt.

Es ist eine Grauzone. Diese Prinzipien sollen Sie in Ihrer Arbeit helfen, wenn Sie feststellen, Sie arbeiten für sie (dh sie sind im Weg und / oder Sie finden es über verkompliziert Code), dann sind Sie zu hart konform und Sie brauchen zurückzuziehen.

Machen Sie es für Sie arbeiten, arbeiten nicht für sie.

Ich weiß nicht, ob dies tatsächlich Zusammenhalt senkt.

Aggregation / Komposition sind alle über eine Klasse anderen Klassen verwendet, den Vertrag erfüllen sie durch ihre öffentliche Methoden verfügbar macht. Die Klasse muss nicht die Schnittstelle duplizieren davon verwandten Objekten ist. Es ist eigentlich jede knwowledge über diese aggregiert Klassen aus dem Verfahren Anrufer versteckt.

Um das Gesetz des Demeter im Fall von mehreren Ebenen der Klasse Abhängigkeit gehorcht, müssen Sie nur die Aggregation / Komposition und eine gute Kapselung auf jeder Ebene anzuwenden.

Mit anderen Worten: jede Klasse hat eine oder mehr Abhängigkeiten zu anderen Klassen, aber diese sind immer nur Abhängigkeiten auf der referenzierten Klasse und nicht auf allen Objekte aus properies / Methoden zurückgegeben.

In den Situationen, in denen es scheint ein Kompromiss zwischen Kopplung und Kohäsion zu sein, würde ich mich wahrscheinlich fragen „, wenn jemand anderes hatte bereits diese Logik geschrieben, und ich für einen Fehler darin suchen, wo ich zuerst schauen? “, und schreiben Sie den Code, die Art und Weise.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top