`return $this; " design pattern oder anti-pattern?
Habe ich viele Male gesehen Zend Framework mit return $this;
Muster Stil
- und aus meiner Sicht:
-
Pro: scheint Ihr durchaus nicht schlecht
MusterStil für die Verkettung von vielen Aktionen, die auf das gleiche Objekt und machen Sie Ihren code kürzer. -
Con: code sieht ein bisschen komisch, wenn Sie sehen, dass Objekt gibt selbst in der Methode, die nicht etwas anderes (z.B. Set-Methode für eine Eigenschaft)
Ist es wirklich gut Muster Praxis oder vielleicht eine anti-MusterPraxis?
EDIT: gut, es war ein wenig zu viel von meiner Seite, nennen es "Muster", vielen Dank an alle für den Hinweis mich richtige Richtung!
- Siehe Martin Fowlers Artikel auf fluent interfaces. Ich habe es nie erlebt, wie ein antipattern. Es funktioniert sehr gut für viele Dinge. jQuery ist ein weiterer prominenter fluent interface.
- es ist nur а coding style und die Art der syntax von Zucker, nicht in ein Muster.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rückkehr
this
können Sie an die Kette fordert-und set-Werte. Es ist sehr nützlich für Sie einige Objekt (siehe Fluent interface). Sie können express sehr einfach, was Sie wollen (und Sie können verschiedene Rückgabetypen zu erreichen, was Sie wollen).Habe ich gefunden, die Verkettung von Methoden, um nützlich zu sein in Situationen, wo es Sinn macht; eine domain-spezifische Sprache, zum Beispiel:
Der Sache ist, dass diese Methoden würde nur wieder
void
sowieso und so diereturn $this
lediglich Funktionen, wie ein kurzer-hand-version der Schrift:Dass wir immer noch fordern die
toSQL()
oderexecute()
Methode, um Gebrauch machen von den Daten, die wir haben aufgefüllt, unser Objekt mit.Meiner Meinung nach ist es nicht ein anti-pattern und kann als eine legitime, vernünftig, die Methode der Objekt-population in den richtigen Umständen.
Wenn du meinst "gute oder schlechte Praxis", hier ist mein nehmen:
Auf der plus-Seite, Sie bekommen einige syntaktische Zucker.
Auf der Seite nach unten, geben Sie sinnvolle Werte zurückgeben zu Gunsten der verkettbarkeit. Das ist nicht wirklich möglich, denn schließlich müssen Sie über Methoden verfügen, die Rückkehr von etwas anderem als der Basis-Objekt, so dass Sie am Ende mit einige Methoden, die verkettbare und einige, die nicht (Benutzer der Klassen zu bekommen, um Spaß zu haben, zu raten, welche diejenigen sind, welche.)
Oder Sie gehen voll hog und machen alle von Ihnen verkettbare, egal was, aber dann finden Sie sich selbst in lächerliche Situationen, wie die Rückgabe einem gefälschte "leer" - Objekt für den Willen der Erhaltung der Kette, das Objekt, das getestet werden muss, für einige obskure Eigenschaft, um festzustellen, ob es eine "echte" oder nur ein Glied in der Kette.
Das klassische Beispiel dafür ist jQuery, das zeigt alle Symptome: die base-Objekt versucht, um das einzige grundlegende Einheit von Daten, die in dem gesamten code (alles wieder ein jQuery-Objekt); fake-Objekt-Prüfung (
if (obj.length)
); und die selbst-Widerspruch, wo es noch notwendig, zu brechen, verkettbarkeit für Methoden wiegetAttribute()
dass return string.IMHO, es ist eine schreckliche Durcheinander zu machen, etwas für den Willen, dass etwas syntaktischen Zucker.
Es ist nicht ausschließlich PHP - /Zend-Framework, dies zu tun, wie es viele andere Programmiersprachen, die Nutzung des fluent-interface. Ich jedenfalls finde es praktisch, und, dass die Verwendung des fluent interface ist eine gute Möglichkeit, die Codierung. Obwohl manchmal-codes sieht seltsam, bedeutet nicht, es ist falsch, und ich glaube nicht, dass Sie können dies unter con um ehrlich zu sein.
In das Ende der Programmierer sieht nur, dass er das gleiche Objekt zurück, nicht, wie es aussieht ist in dem code des fluent interface Klasse. Ich denke, der größte pro in der fluent-Oberfläche ist die Lesbarkeit des Codes. Wenn Sie möchten, zu hören, ein con dann Debuggen einer fließend-Kette ist eine.
Dieser sogenannte Fluent Interface, ich glaube nicht, dass dies ein Muster ist, aber besser eine Möglichkeit implementiert die Funktion zur Reduzierung der Menge an code und verbessern readibility.
Ich lasse Sie Lesen die Wikipedia-Seite : http://en.wikipedia.org/wiki/Fluent_interface