Wie lautet der Name für die Redewendung, die Methodenverkettung verwendet, um ein Objekt zu erstellen?

21

Ich verwende häufig ein Muster, bei dem ich mithilfe der Methodenverkettung ein Objekt wie ein Builderoder ein PrototypeMuster einrichte, aber nicht bei jedem Methodenaufruf neue Objekte erstelle, sondern das ursprüngliche Objekt ändere.

Beispiel:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

Ich frage mich nur, ob es einen Namen für dieses Muster gibt und ob es als Anti-Muster gilt, denn obwohl es flüssiger lesen kann, kann es zu langen Methodenketten führen.

Garrett Hall
quelle
3
Eine flüssige Benutzeroberfläche ist eine Frage des Stils. Wenn Sie eine API schreiben, stellen Sie alternative Formulare zur Verfügung.
Oded
1
Weitere
Eric King,
@Oded Es ist möglich, eine solche API ohne Verkettung zu verwenden, indem Sie einfach für jeden Aufruf eine separate Anweisung eingeben, oder hatten Sie eine andere Idee für eine Alternative?
Garrett Hall
@ GarrettHall - Natürlich ist es möglich, aber dann rufst du Dinge wie menu.withStyle("")ohne Kontext auf. In diesem Fall benötigen Sie zwei APIs.
Oded
2
@GarrettHall Der Punkt der "fließenden Schnittstelle" ist die Methodenkette, die wie ein Satz gelesen werden soll. In diesem Sinne wird die lange Methodenkette nicht als schlecht angesehen. Aber, und da stimme ich Oded zu, wäre es am besten, die gleiche Funktionalität auch in einer konventionelleren Syntax bereitzustellen. Auf diese Weise kann der Entwickler die zu verwendende Methode auswählen.
Eric King

Antworten:

37

Fließendes Interface

Ich habe immer davon gehört, dass diese Methode als " fließende Schnittstelle " bezeichnet wird, wie es Eric Evans (bekannt als Domain Driven Design ) und Martin Fowler (bekannt als Agile Manifesto ) prägten .

Die Hauptnachteile sind die Lesbarkeit (die manche lieben und manche hassen) und die Tatsache, dass das Debuggen in manchen Fällen schwieriger sein kann, da die gesamte Aktionskette als eine einzige Aussage betrachtet werden kann, wenn sie durchlaufen wird.

Ich halte es mit Sicherheit nicht für ein Anti-Pattern, obwohl ich die Technik selbst nur ein paar Mal angewendet habe.

Eric King
quelle
4
Beachten Sie, dass die Befürworter ziemlich darauf bestehen, dass eine flüssige Schnittstelle viel mehr als nur eine Methodenverkettung beinhaltet, obwohl oft unklar ist, was mit diesem Begriff noch gemeint ist.
Kilian Foth
Ist es üblich, dass die gesamte Kette als eine einzige Aussage betrachtet wird? Das klingt für mich nach einem schlecht gestalteten Debugger-Problem.
Blueberryfields
Ich bin nicht auf einen Debugger gestoßen, der Ketten als eine einzige Anweisung behandelt, aber es kann immer noch schmerzhaft sein, wenn Sie nur an einer der Methoden gegen Ende der Kette interessiert sind, nämlich an einer bestimmten Kette.
Vaughandroid
1
Ich arbeite in C #, und mit dem .NET-Debugger kann ich problemlos in die einzelnen Methoden einsteigen. Bei anderen Sprachen bin ich mir nicht so sicher.
Eric King
1
@KilianFoth Wie in den Kommentaren der Frage erwähnt, sollten die verketteten Methoden in einer fließenden Benutzeroberfläche fast als Satz lesbar sein. Manchmal bedeutet dies, dass die einzelnen Methoden andere Namen haben sollten, als es sonst als gute Praxis angesehen wird
Izkata
5

Eine solche Verkettung von Methoden wird normalerweise als Fluent-Schnittstelle bezeichnet, wenn ein Fluss oder eine Auffindbarkeit in der Kette vorliegt. Alternativ können Sie sich eine API wie jQuery vorstellen, die sich stark auf die Verkettung von Methoden stützt, da sie nicht den gleichen Schwerpunkt auf die Auffindbarkeit legt, sondern der Einfachheit halber.

In Ihrem Beispiel (mit withx, withy) können Sie dies als Variante des Builder-Musters betrachten, da Sie eine spezielle Klasse haben, die bei bestimmten Zuständen (Methodenaufrufen) weiß, wie ein ordnungsgemäß konfiguriertes Objekt zurückgegeben wird.

Dies ist bei sachgemäßer Verwendung kein Anti-Pattern.

pfries
quelle
Was ist Entdeckbarkeit? Die Möglichkeit, die von Ihnen benötigten Methoden über die automatische Vervollständigung der API zu finden?
Josiah Yoder
Ich kenne mich mit jQuery nicht aus. Wie sind ihre Methodenketten nur der Einfachheit halber und nicht der Auffindbarkeit halber? Weil es so viele Arten der Verkettung gibt, ist es selbst bei der automatischen Vervollständigung überwältigend?
Josiah Yoder
3

ob es ein Anti-Muster betrachtet wird,

definitiv kein Anti-Pattern. jQuery ist wahrscheinlich die am häufigsten verwendete Implementierung.

Denn obwohl es flüssiger lesen kann, kann es zu langen Methodenketten führen

Ja, aber was ist die Alternative? Sie können mit fast einem einfachen englischen Satz enden, wobei das API Sie zu dem führt, was verfügbar und angemessen ist.

NimChimpsky
quelle
..und Sie bekommen, was Sie wollen, in einer Zeile statt in 8 - 10. Das ist gut, wenn Sie nur einen Zeilenumbruch in einem Terminal schreiben. Es ist einfacher, einen Befehl als 10 abzurufen. Da er fließend ist und die Methoden beschreibende Namen haben, ist er auch leichter zu lesen. Leider ist vieles davon in Python2 in Python3 / Python4 nicht mehr möglich.
McKenzm
-3

Es heißt "Zugunglück" -Muster.

(Es ist ein Anti-Pattern und ist gegen Clean Code)

Das Muster "Zugunglück" verstößt gegen das Gesetz von Demeter .

Marc
quelle
3
Dies ist nicht dasselbe wie die Verkettung der Methoden in dem Artikel, auf den Sie verweisen, in dem sich das Beispiel befindet a.getB().getC().doSomething(). Dieses Beispiel ist schlecht, weil "Ihre Methode Methoden in ihren eigenen Feldern direkt aufrufen kann (aber nicht in den Feldern der Felder)". Hier gibt es nur 1 Objekt, das erstellt wird, und "Sie können mit Spielzeug spielen, das Sie selbst hergestellt haben".
Nic