Ich liebe wirklich die Philosophie der Verkettung von Methoden, wie jQuery in seiner Bibliothek hervorhebt. Ich fand es sehr elegant und klar.
Da ich hauptsächlich Java-Entwickler bin, frage ich mich immer wieder, warum diese Praxis in dieser Sprache nicht mehr verwendet wurde. Zum Beispiel wurde das Collection-Interface nicht auf diese Weise entworfen (zum Hinzufügen / Entfernen von Methoden), und ich fand es ziemlich traurig.
Gibt es wirklich Nachteile gegen diese Praxis oder ist es einfach etwas, das nicht schon genug "Sex-Appeal" hat?
Martin Fowler diskutiert dieses Thema als "fließende Schnittstellen" in Ссылка . Ein Hauptproblem ist, dass fließende Interfaces für Menschen entworfen sind, daher können Frameworks wie Spring diese nicht verstehen. Vereinfacht gesagt, die Verwendung einer fließenden Schnittstelle bietet Wartbarkeit in einem Sinne (Lesbarkeit), verliert aber die Wartbarkeit in einem anderen (Flexibilität).
Es gibt ein häufiges Problem mit kettenfähigen Methoden und Vererbung. Angenommen, Sie haben eine Klasse C, deren Methoden F1 (), F2 (), etc. eine C zurückgeben. Wenn Sie die Klasse D von C ableiten, wollen die Methoden F1, F2 usw. nun ein D zurückgeben, damit D's verkettbare Methoden es können irgendwo in der Kette aufgerufen werden.
Der einzige Nachteil ist, dass Sie den Rückgabetyp verlieren, also ist Chaining gut für Operationen, die Dinge erledigen, aber nicht gut für Operationen, die Dinge berechnen.
Ein weiteres Problem ist, dass der Compiler beim Verketten nicht so einfach triviale Funktionsaufrufe für das Inlining bestimmen kann. Aber wie gesagt, wenn Ihre Verkettung Operationen ausführt und keine Berechnungen, dann ist es am wahrscheinlichsten, dass der Compiler sowieso nichts ändert.
Ich mag diesen Ansatz auch sehr. Der einzige Nachteil, an den ich denken kann, ist, dass es manchmal etwas peinlich erscheint, dies am Ende jeder Methode "zurückzugeben". Für JQuery zum Beispiel macht es etwas unangenehm, Plugins zuzulassen, weil man sagen muss: "Vergesst nicht, eure Returns zu vergessen !!" aber es gibt keine gute Möglichkeit, es zur Kompilierzeit zu fangen.
JavaScript ist (mehr oder weniger) eine funktionale Sprache mit Funktionen als erstklassige Bürger.
Hinzufügen / Entfernen von Methoden zu Objekten, Übergabe von Funktionen als Parameter, all dies ist natürlich für diese Sprache.
Auf der anderen Seite ist Java streng OO, eine Funktion kann nicht außerhalb einer Klasse existieren. Die Verwendung von Vererbung, Komposition und Schnittstellen ist eine natürlichere Methode für diese Sprache.
Chainable Methoden sind ein weiteres großartiges Werkzeug in unserer Design Toolbag. Nur stellen Sie sicher, dass Sie nicht in die gemeinsame "Ich habe einen Hammer, daher jedes Problem ist ein Nagel" Design Chaos.
Jedes Designproblem wird nicht durch verkettbare Methoden gelöst. Manchmal hilft es dabei, eine Benutzeroberfläche einfacher zu verwenden (z. B. das von Ihnen erwähnte Sammlungs-Problem). Manchmal nicht. Der Trick ist herauszufinden, welcher Fall zutrifft.
Tags und Links language-agnostic