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 Optional
als 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)
java
functional-programming
java8
Nikolaus
quelle
quelle
Optional
ist 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.Antworten:
Ein Grund dafür ist , dass konzeptionell
firstName
,middleName
undlastName
ist 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,Nothing
wenn eine Funktion auf dem Weg fehlschlägt, können Sie AufrufeflatMap
an verketten. Wenn Sie mit einer Ausnahme fehlschlagen möchten, können Sie sieget()
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.
quelle
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
if
Anweisungen 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.
quelle