引数が必要な場合と必要でない場合がある場合に、メソッドの引数としてOptionalを使用しない理由はありますか?


11

Java 8では、オプション/オプションの使用に関する記事がますます増えています。私は彼らが何を表現しようとしているのか理解しており、それらがリターンとして使用されている多くの例を見ています。ただし、デフォルト/オプションのパラメーターの構文を持たない言語でメソッド/関数の引数として使用されているのはわかりません。

Optional引数が必要かどうかにかかわらず、メソッドの引数として使用しない理由はありますか?ここに私が考えることができる例があります:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

これはHaskellでの一般的な使用方法であり、デフォルトの引数もありません(カレーの痛み)。
Daniel Gratzer、2014年

関連するスタックオーバーフローの質問に対する私の回答を参照してください。簡単に言うと、Optional主に存在しない可能性のある戻り値を対象としています。もちろん、他の用途も可能ですが、扱いにくく、スタイルが悪い可能性があります。
スチュアートマークス

回答:


6

一つの理由は、概念的に、ということであるfirstNamemiddleNameと、lastName論理的に1つの引数ではなく、3。それらはすべて、より大きな全体の一部であり、それらはほとんど常に一緒に渡されると想像できます。関数型言語では、タプルまたはレコードとして渡される可能性があります。Javaにはそれらがないため、おそらくNameクラスに集約されます。フルネームを受け取って返す関数を作成する必要がある場合は、それらを集約しないと作成できません。結局のところ、返すことができる値は1つだけです。

おそらく、値がオプションであり、大きな全体の一部ではないことは、あまり頻繁に出てきません。関数機能するために特定の値が必要な場合、その関数を受け入れてはなりませんOptional。値を返さない可能性のある操作をチェーンする必要がある場合Nothing、途中の関数が失敗した場合は中止して、への呼び出しをチェーンflatMapできます。例外で失敗したい場合get()は、途中の任意のステップまたはチェーンの終わり。

値が本当にオプションであり、関数がその存在または不在に基づいて2つの異なることを行う場合、関数がそれぞれ1つのことを行う2つの小さな関数のラッパーでなく、特定の決定の組み合わせが非常に一般的でない限り、それはコードのにおいです。

あまり一般的でないユースケースであるため、それが間違っていることはそれほど多くないと思います。


5

デフォルトの引数をサポートしない言語はそれほど多くないため、これは一般的な使用法ではありません。個人的にはあなたの使用法はひどくはないと思いますが、それは慣用的なJavaにはなりません。Javaは意図的にデフォルトの引数を持たないため、代わりにオーバーロードを強制的に使用ifします。これには、関数内のステートメントを要求する代わりにコンパイラが引数をチェックするという利点があります。

つまり、2つの異なるバージョンのクエリを作成することになります。1つはミドルネーム付き、もう1つはミドルネームなしです。簡潔にそれを行うことができる場合は、オプションを使用することをお勧めします。とにかく2つの個別の関数で必要なほど詳細な場合は、オーバーロードを使用して慣用的にすることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.