Wann wird die Verkettung verwendet?
Funktionsverkettung ist vor allem in Sprachen beliebt, in denen eine IDE mit automatischer Vervollständigung üblich ist. Beispielsweise verwenden fast alle C # -Entwickler Visual Studio. Wenn Sie mit C # entwickeln, kann das Hinzufügen von Verkettungen zu Ihren Methoden für Benutzer dieser Klasse Zeit sparen, da Visual Studio Sie beim Erstellen der Kette unterstützt.
Auf der anderen Seite werden Sprachen wie PHP, die von Natur aus sehr dynamisch sind und in IDEs häufig keine automatische Vervollständigung unterstützen, weniger Klassen sehen, die die Verkettung unterstützen. Eine Verkettung ist nur dann angebracht, wenn korrekte phpDocs verwendet werden, um die verkettbaren Methoden freizulegen.
Was ist Verkettung?
Bei einer Klasse mit dem Namen sind Foo
die folgenden beiden Methoden verkettbar.
function what() { return this; }
function when() { return new Foo(this); }
Die Tatsache, dass man auf die aktuelle Instanz verweist und eine neue Instanz erstellt, ändert nichts daran, dass es sich um verkettbare Methoden handelt.
Es gibt keine Goldregel, dass eine verkettbare Methode nur auf das aktuelle Objekt verweisen darf. Tatsächlich können verkettbare Methoden zwei verschiedene Klassen umfassen. Beispielsweise;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
this
In keinem der obigen Beispiele wird darauf verwiesen . Der Code a.What().When()
ist ein Beispiel für eine Verkettung. Interessant ist, dass der Klassentyp B
niemals einer Variablen zugewiesen wird.
Eine Methode wird verkettet, wenn ihr Rückgabewert als nächste Komponente eines Ausdrucks verwendet wird.
Hier sind einige weitere Beispiele
// return value never assigned.
myFile.Open("something.txt").Write("stuff").Close();
// two chains used in expression
int x = a.X().Y() * b.X().Y();
// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();
Wann zu verwenden this
undnew(this)
Zeichenfolgen in den meisten Sprachen sind unveränderlich. Verkettungsmethodenaufrufe führen also immer dazu, dass neue Zeichenfolgen erstellt werden. Wobei als Objekt wie StringBuilder geändert werden kann.
Konsistenz ist eine bewährte Methode.
Wenn Sie Methoden haben, die den Status eines Objekts ändern und zurückgeben this
, mischen Sie keine Methoden ein, die neue Instanzen zurückgeben. Erstellen Sie stattdessen eine bestimmte Methode mit dem Namen Clone()
, die dies explizit ausführt.
var x = a.Foo().Boo().Clone().Foo();
Das ist viel klarer, was im Inneren vor sich geht a
.
Der Schritt nach draußen und zurück Trick
Ich nenne dies den Step-out- und Back- Trick, weil er viele häufige Probleme im Zusammenhang mit der Verkettung löst. Dies bedeutet im Grunde, dass Sie aus der ursprünglichen Klasse in eine neue temporäre Klasse und dann zurück in die ursprüngliche Klasse wechseln.
Die temporäre Klasse existiert nur, um der ursprünglichen Klasse spezielle Funktionen bereitzustellen, jedoch nur unter besonderen Bedingungen.
Es gibt oft Zeiten, in denen eine Kette den Status ändern muss , aber die Klasse A
kann nicht alle diese möglichen Zustände darstellen . Während einer Kette wird eine neue Klasse eingeführt, die einen Verweis auf enthält A
. Dies ermöglicht es dem Programmierer, in einen Zustand und zurück zu wechseln A
.
Hier ist mein Beispiel, lassen Sie den Sonderzustand bekannt sein als B
.
class A {
function Foo() { return this; }
function Boo() { return this; }
function Change() return new B(this); }
}
class B {
var _a;
function (A) { _a = A; }
function What() { return this; }
function When() { return this; }
function End() { return _a; }
}
var a = new A();
a.Foo().Change().What().When().End().Boo();
Das ist ein sehr einfaches Beispiel. Wenn Sie mehr Kontrolle haben möchten, B
können Sie zu einem neuen Supertyp zurückkehren A
, der andere Methoden hat.