Wie zu gehorchen Gesetz von Demeter?

Jedes mal, wenn ich Artikel über das Gesetz von Demeter, der Autor scheint nie zu geben, ein solides Beispiel dafür, wie, dieses Gesetz zu befolgen. Sie alle erklären, was es ist, und zeigen ein Beispiel für das Gesetz brechen, aber das ist einfach.

Gibt es wahrscheinlich viele Möglichkeiten, dieses Gesetz zu befolgen (gute design und Planung als einer), aber in sehr einfachen Worten würde dies ein Weg sein, ihm zu gehorchen?

Sagen wir, ich habe eine Klasse mit folgenden Eigenschaften:

public class Band {

    private Singer singer;
    private Drummer drummer;
    private Guitarist guitarist;
}

Bin ich irgendwo im Programm, und ich habe eine Instanz dieser Band Klasse und ich wollen die Gitarristen namens, was ich in der Regel sehen, ist so etwas wie:

guitaristName = band.getGuitarist().getName();

Dass man gar nicht so schlecht scheint, wie es ist, nicht zu tief in die Kette, aber ist das Gesetz von Demeter zu sagen, dass vielleicht sollte es auf diese Weise getan:

guitaristName = band.getGuitaristName();

und meine Band Klasse hat eine Methode:

public String getGuitaristName() {
    return guitarist.getName();
}

Ist dies, wie Sie sollen, dem Gesetz zu gehorchen?

Dank.

  • Einige würden sagen, dass das hinzufügen einer getGuitaristName Methode Band wäre gegen das Gesetz von Demeter: haben Sie gezwungen Band Kenntnis von der Struktur der Guitarist. Das schafft ein design Abhängigkeit, wo keine existiert haben mögen, bevor. Es ist alles eine Frage der Perspektive, denke ich.
  • Diese Menschen würden falsch sein. Die LoD nicht verhindern, dass Band aus senden von Anfragen an Guitarists da er bereits darüber weiß. Es einfach verhindert, dass Benutzer von Band Zugriff auf Guitarists direkt, da die Nutzer von Band sollte nicht wissen über seine Interna
  • Also würden Sie sagen, was ich gemacht habe oben mit der getGuitaristName() Methode ist eine gültige Art und Weise, dieses Gesetz zu befolgen? Zumindest dann, wenn die Objekt-Graphen sind nicht zu groß wie oben.
  • Ist das wahr; in der Tat, die Verbreitung solcher Verfahren in den Klassen wie Band ist zitiert als einer der Nachteile des LoD. Meine Ansicht, jedoch, ist, dass, während eine solche Umgestaltung passt zu dem Buchstaben des Gesetzes, es ist in direkter Verstoß gegen den Geist des Gesetzes. (Warum sollte Band Objekt wissen müssen, dass ein Guitarist hat eine String-Wert name-Attribut?) Aus der Perspektive des Designs, der Struktur einer Guitarist ist nicht wirklich Teil des "tiefen-Struktur" einer Band.
  • Das zitieren von Wikipedia: "ein bestimmtes Objekt übernehmen sollten so wenig wie möglich über die Struktur oder Eigenschaften von etwas anderem (einschließlich deren Teilkomponenten)"---Hervorhebung von mir.
  • Ich bin geneigt zu, einverstanden mit, die Sie auf diese Methode (und andere wie es), wo Sie haben im wesentlichen 'codiert' der internen Objekt-Typ in den Namen der Methode. Es ist ein cheat um die strenge definition von LoD
  • Also das bedeutet, dass ein getGuitaristName Methode ist nicht die beste Wahl, aber das bedeutet dann, ich habe zu tun getGuitarist.getName(). Ich weiß, dass die Kette nicht zu tief ist, aber was ist, wenn ich wollte, dass seine Gitarre machen also wäre band.getGuitarist().getGuitar().getMake(). Ich weiß wirklich nicht, wie das Aussehen von diesem, es scheint zu lange.
  • David, besser Lesen meine Antwort. Das war eine Randnotiz, unter der Annahme der Prämisse, dass das gesamte Gespräch ist sinnvoll, ich denke, das ist es nicht.
  • Im Fall von band.getGuitarist().getGuitar().getMake(), die Frage ist, ob die Gitarre (und der Gitarre selbst) ist ausschließlich eine Eigenschaft der Gitarrist ist, oder ob es eine Eigenschaft von "der Gitarrist in dieser band". Meiner Ansicht nach ist es vernünftiger zu erweitern, die Band Schnittstelle im letzteren Fall als in der ehemaligen.

InformationsquelleAutor ibanore | 2013-06-30
Schreibe einen Kommentar