2016-03-21 7 views
1

Law of Demeter (LOD) helfen, entmutigt eine lange Anrufkette. Es wird angegeben, dass Methoden nur für die Objekte aufgerufen werden sollen, die direkt in der Klasse erstellt wurden, oder für die Objekte, die in einer Methode erstellt wurden. Objekte werden als Parameter in Methoden übergeben. Wenn B b; ein Feld in Klasse A ist und B ein Feld vom Typ C hat, (C c;) dann innerhalb A.java, ist es nicht ratsam, b.c.performOperation(); zu rufen.Wie Adaptermuster bei der Implementierung des Demeter-Gesetzes

Nach meinem Verständnis sollten wir kleine Methoden in jeder Klasse haben, die Operationen auf dem Feld, das sie in ihnen eher haben, dass Außenwelt die Felder extrahieren und die Methoden aufrufen. Auch ich verstehe, dass wir Visitor pattern verwenden können, um dies zu erreichen. Aber dann lese ich Adapter ist auch eine Möglichkeit, dies zu implementieren, die ich nicht verstehen konnte.

Adapter hat lediglich die Aufgabe Adaptee Klasse darin und implementiert die interface eines anderen Systems (beide Adaptee und die interface in kompatibel zu jedem anderen-wird). Es verwendet Delegierung, um Methode auf Adaptee aufzurufen. Hier naht nicht, um verletzt zu werden, aber ich kann nicht sehen, wenn wir Adaptermuster dann nicht verwendet hätten, wie das Gesetz gebrochen wurde?

Die Referenz ich aus ist entnahm Website: http://c2.com/cgi/wiki/LawOfDemeter?LawOfDemeter

ObjectQueries? und das AdapterPattern sind zwei Möglichkeiten, das LawOfDemeter zu implementieren. - DaveOrme

Antwort

1

Dies ist, was ich denke, sie bedeuten:

Wenn sie sprechen, um die Adapter-Muster über die Verwendung von Demeter-Gesetz zu entsprechen, sie sprechen von einem anderen Fall als die Standard-Adapter-Muster Anwendungsfall Sie beschrieben .

Lassen Sie uns sagen, dass wir eine Klasse haben, dass jemand anderes geschrieben hat, dass ein öffentliches Feld aussetzt:

public class DataClass { 
    public Data data; 
} 

Wenn wir das Datenfeld überall in unserem Code zugreifen möchten, nennen wir Ketten erhalten:

dataClass.data.doOperation() 

Ein Adapter kann zu 'verstecken' diese Call-Kette verwendet werden:

public class DataClassAdapter { 
    DataClass wrappedInstance; 

    public void doOperation() { 
     wrappedInstance.data.doOperation(); 
    } 
} 

Dann können wir cal l wie:

dataAdapter.doOperation(); 

Ohne die Anrufkette.

Ich würde argumentieren, dass das Wort "Adapter" hier etwas missbraucht wird. Obwohl das Adaptermuster etwas ähnlich ist.

+1

Erweitern Sie, was Sie geschrieben haben: Das Adaptermuster wurde lose interpretiert. * Wrapper-Methoden * sind eine Lösung für Code, der LoD nicht berücksichtigt. Objektadapter können als Wrapper * gesehen * werden, da sie eine öffentliche Methode in eine andere Reihe von gekapselten Methoden konvertieren. Eine Façade könnte dasselbe tun, da es sich nur um Delegation (oder Indirektion) handelt. Wenn Sie jedoch die polymorphen Aufrufe des GoF-Adaptermusters als Teil seiner Essenz betrachten (http://stackoverflow.com/a/13323703/1168342), dann ist der Objektadapter keine Einstiegslösung für Code, der das nicht tut Respekt LoD. – Fuhrmanator

Verwandte Themen