Gibt es einen Grund, Optional nicht als Methodenargument zu verwenden, wenn Sie wissen, dass das Argument möglicherweise benötigt wird oder nicht?

11

Mit Java 8 habe ich immer mehr Artikel über die Verwendung von Option / Optional gesehen. Ich verstehe, was sie darstellen wollen, und ich sehe viele Beispiele dafür, wie sie als Rendite verwendet werden. Was ich jedoch nicht sehe, ist, dass sie als Methoden- / Funktionsargumente in Sprachen verwendet werden, die nicht die Syntax für Standard- / optionale Parameter haben.

Gibt es einen Grund, nicht Optionalals Methodenargument zu verwenden, wenn Sie wissen, dass das Argument möglicherweise benötigt wird oder nicht? Hier ist ein Beispiel, an das ich denken könnte:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)
Nikolaus
quelle
Dies ist eine häufige Verwendung für sie in Haskell, wo es auch keine Standardargumente gibt (Currying Pain).
Daniel Gratzer
Siehe meine Antwort auf eine verwandte Frage zum Stapelüberlauf. Kurz gesagt, Optionalist in erster Linie für Rückgabewerte gedacht, die möglicherweise fehlen. Andere Verwendungen sind natürlich möglich, aber umständlich und wahrscheinlich schlecht.
Stuart Marks

Antworten:

6

Ein Grund dafür ist , dass konzeptionell firstName, middleNameund lastNameist logisch ein Argument, nicht drei. Sie sind alle Teile eines größeren Ganzen, und man kann sich vorstellen, dass sie fast immer zusammen weitergegeben werden. In funktionalen Sprachen würden sie wahrscheinlich als Tupel oder Datensatz übergeben. In Java fehlen diese, daher würden sie wahrscheinlich zu einer Name-Klasse zusammengefasst. Beachten Sie, dass Sie, wenn Sie Funktionen erstellen müssten, die vollständige Namen annehmen und zurückgeben, dies nicht ohne Aggregation tun könnten - Sie können schließlich nur einen Wert zurückgeben.

Vielleicht kommt es nur selten vor, dass ein Wert optional ist und auch nicht Teil eines größeren Ganzen. Wenn die Funktion erfordert einen bestimmten Wert seine Arbeit zu tun, dann sollte diese Funktion nicht eine Annahme Optional. Wenn Sie Vorgänge verketten müssen, die möglicherweise keinen Wert zurückgeben, und den Vorgang abbrechen, Nothingwenn eine Funktion auf dem Weg fehlschlägt, können Sie Aufrufe flatMapan verketten. Wenn Sie mit einer Ausnahme fehlschlagen möchten, können Sie sie get()in jedem Schritt des Weges oder am verwenden Ende der Kette.

Wenn ein Wert wirklich optional ist und eine Funktion je nach Vorhandensein oder Nichtvorhandensein zwei verschiedene Aufgaben ausführt, ist dies ein Codegeruch, es sei denn, die Funktion besteht aus zwei kleineren Funktionen, die jeweils eine Aufgabe ausführen, und diese bestimmte Kombination von Entscheidungen ist sehr häufig.

Ich denke nicht, dass es so viel ist, dass es falsch ist, da es ein relativ ungewöhnlicher Anwendungsfall ist.

Doval
quelle
5

Es gibt nicht sehr viele Sprachen, die keine Standardargumente unterstützen, daher ist dies keine übliche Verwendung. Ich persönlich denke, Ihre Verwendung ist nicht schrecklich, aber es wird kein idiomatisches Java sein. Java verfügt absichtlich nicht über Standardargumente, um stattdessen die Verwendung von Überladung zu erzwingen. Dies hat den Vorteil, dass der Compiler Ihre Argumente überprüft, anstatt ifAnweisungen innerhalb der Funktion zu benötigen .

Mit anderen Worten, Sie werden zwei verschiedene Versionen der Abfrage erstellen: eine mit einem zweiten Vornamen und eine ohne. Wenn Sie dies auf präzise Weise tun können, ist die Verwendung einer Option eine gute Idee. Wenn es so ausführlich ist, dass Sie es sowieso in zwei separaten Funktionen haben möchten, können Sie die Überladung auch verwenden und es idiomatisch machen.

Karl Bielefeldt
quelle