Wie ist das Demeter-Gesetz auf objektorientierte Systeme in Bezug auf Kopplung und Kohäsion anwendbar? [geschlossen]

15

Wie ist das Demeter-Gesetz auf objektorientierte Systeme mit Kopplung und Kohäsion anwendbar?

Ich las ein Buch "Softwareentwicklung und berufliche Praxis" und stieß auf das Kapitel über LoD. Ich war neugierig, wie dieses Prinzip in objektorientierten Systemen angewendet wird.

Jeremy
quelle
Ich habe einmal ein Projekt geerbt, das einen hohen Kopplungsgrad (Sterntopologie) aufwies. Ich habe die Dinge aufgeräumt, indem ich ein 'Mediator-Muster' verwendet habe, um die Kopplung zwischen Objekten zu begrenzen und den Mediator stattdessen mit jedem Objekt sprechen zu lassen. Obwohl es sich immer noch um eine Kopplung handelt, ist die Anzahl der gekoppelten Personen begrenzt. Einige möchten dies vielleicht noch genauer untersuchen, wenn sie das Gefühl haben, ein Problem mit hoher Kopplung bei ihrem Design zu haben.
Jeach

Antworten:

9

Nach Emerson Macedo das Gesetz von Demeter heißt es wie folgt:

  • Jede Einheit sollte nur begrenzte Kenntnisse über andere Einheiten haben: nur Einheiten, die "eng" mit der aktuellen Einheit verbunden sind.
  • Jede Einheit sollte nur mit ihren Freunden sprechen. Sprich nicht mit Fremden.
  • Sprechen Sie nur mit Ihren direkten Freunden.

Dies entspricht direkt dem Prinzip der niedrigen Kopplung, wie es die Einheiten (oder Objekte) tun sollen, ähnlich wie oben:

  • Nicht eng miteinander verbunden sein. Nur die nächsten sind.
  • Jeder sollte nur mit seinen Mitarbeitern sprechen und nicht mit den Mitarbeitern des Mitarbeiters
  • Sprechen Sie nur mit dem unmittelbar zusammenarbeitenden Objekt

Eine der niedrigsten Formen der Kopplung ist die Nachrichtenübermittlung, dh die Daten werden zwischen Objekten über Methodenaufrufe mit Parametern geteilt.

Darüber hinaus entspricht das Demeter-Gesetz meines Erachtens nicht direkt dem Prinzip der hohen Kohäsion, da nur die Objekte selbst wissen sollten, über welche Daten sie selbst verfügen. Ein Objekt mit geringer Kohäsion verfügt über Datenelemente, die es in seinen eigenen Methoden nicht häufig verwendet. Es geht mehr um den Inhalt eines Objekts als um seine Beziehungen und kollaborierenden Objekte.

Spoike
quelle
8

Kupplung, vereinfacht

Wenn ein Objekt eine Methode, eine Eigenschaft usw. eines anderen Objekts aufruft, sagen wir, dass die Objekte gekoppelt sind. Wir nennen es Kopplung, weil der Angerufene jetzt nichts an seiner eigenen Methode / Stütze ändern kann . ohne den Anrufer zu unterbrechen .

Je mehr also die Kopplungsmethoden, Requisiten. - Je schwieriger es ist, den Code eines Angerufenen zu ändern , ohne den gesamten Code zu beschädigen , der ihn verwendet.

über eine Kopplung nachdenken

  • Wenn auf eine einzelne Eigenschaft verwiesen wird, koppelt die Methode zwei Objekte.
  • Offensichtlich ist eine Kopplung zum Erstellen von Software erforderlich.
  • In Anbetracht der Sperrstufe der Kopplung möchten wir diese sowohl begrenzen als auch isolieren. Dieses Ziel geht einfach mit der allgemeinen Softwareentwicklung einher. Prinzipien.
  • Je weniger Objekte wir ansprechen müssen, desto geringer ist die Kopplung.
  • Wenn ich zum Beispiel 20 verschiedene Methodenaufrufe machen muss, ist die Kopplung geringer, wenn alle 20 Aufrufe auf eine Klasse / ein Objekt gerichtet sind, und dieselben Methoden, die auf mehrere Klassen / Objekte verteilt sind.

Das meiste Wissen verursacht eine verrückte Kopplung

Hier haben wir eine Employee, die eine Personhat, die eine "Adresse" hat

public class Employee {
    public Person me = new Person();
}
public class Person {
    public Address home = new Address();
}
public class Address {
    public string street;
} 

Um die Straße zu bekommen muss ich nennen: myEmployee.me.home.street. Dies ist das 180-Grad-Gegenteil des Prinzips des geringsten Wissens. Ich muss wissen , über die Interna, die Verbundstruktur, der Employee, Personund AddressKlassen.

Dieses fehlerhafte Klassendesign zwingt mich , über all diese Klassen Bescheid zu wissen , und myEmployee.me.home.streetkoppelt mich (das aufrufende Objekt) daher mit nicht weniger als 3 Klassen - um nur eine einzige Eigenschaft zu erhalten!

Wenig Wissen rettet den Tag

Wenn ich nur mit der EmployeeKlasse spreche, wende ich das Prinzip des geringsten Wissens per se an. Auf diese Weise beschränken wir die Kopplung automatisch auf nur diese Klasse und isolieren gleichzeitig die Kopplung auf diese eine Klasse.

Durch Hinzufügen aller benötigten Eigenschaften in der EmployeeKlasse wird die Kopplung behoben.

somit

public class Employee {
    public Person me = new Person();
    public string street { return me.home.street; }
}

Erlaubt mir anzurufen: myEmployee.street-

  1. Ich weiß nur Employee
  2. Ich bin nur gekoppelt Employee- egal wie komplex seine Struktur ist.

Wenig Wissen bis zum Ende

Wir haben myEmployee von Personund entkoppelt Address, und im Idealfall sollten wir weiterhin das geringste Wissen anwenden, indem wir Pass-Through- Eigenschaften hinzufügen , mit denen Employeenur Personund Personnur gesprochen wirdAddress

Radarbob
quelle
1

Eine Studie ( V. Basili, L. Briand und WL Melo. Eine Validierung objektorientierter Entwurfsmetriken als Qualitätsindikatoren ) hat gezeigt, dass Klassen mit größeren Antwortmengen tendenziell mehr Fehler verursachen als Klassen mit kleineren Antwortmengen, weil mehr Antwortmengen vorliegen bedeutet die Chance einer höheren Kopplung.

Das Gesetz von Demeter hat den Wert, dass es die per Definition festgelegte Reaktion reduziert. Die Methode eines Objekts kann nur eine eigene Methode aufrufen, einen beliebigen Parameter, der an die Methode übergeben wurde, eine Methode eines von ihr erstellten Objekts und eine Methode eines direkt gehaltenen Objekts. Da der Antwortsatz kleiner ist, ist die Wahrscheinlichkeit einer hohen Kopplung geringer. Da das Modul / die Methode nur unmittelbar verfügbare Referenzen verwendet, besteht eine höhere Kohäsion.

Das D
quelle
1
Eine Studie ( Anquetil, N. und Laval, J. Legacy Software Restructuring: Analyse eines konkreten Falls ) hat auch gezeigt, dass das Verringern der Kopplung und das Erhöhen der Kohäsion nicht immer zu einer besseren Qualität führt. Sich auf das Ergebnis einer einzigen kleinen Studie stützen, die als schädlich eingestuft wird.
0

Es ist ziemlich einfach; A hängt von B ab und B hängt von C. Ohne das Gesetz von Demeter können Sie sowohl B als auch C in A verwenden, aber indem Sie sich an dieses Gesetz halten, hängt A nur von B ab, es kann nicht von C abhängen.

Dies ermöglicht eine geringe Kopplung, da die Anzahl der Abhängigkeiten eines Moduls stark verringert wird. Der Zusammenhalt wird auf die gleiche Weise erreicht, obwohl er sich im Konzept von der Kopplung unterscheidet. Indem weniger Abhängigkeiten von einem Modul bestehen, werden diese für dieses Modul spezifischer und erhöhen so den Zusammenhalt. Außerdem wird die Gesamtzahl der Module steigen und sie werden spezialisierter, um Dinge zu tun, die auf das abhängige Modul spezialisiert sind (im Gegensatz zu Gottobjekten), was direkt zu einem kohärenteren System führt.

m3th0dman
quelle