2

全て。私はという本を読んでいて、そのアイデアの1つは、メソッドを作成するときに「nullを返さない」というものです。彼は、関数がnullを返さなければならない場合、「例外をスローする」または「特殊なケースを使用する」のいずれかを提案します。

メソッドの戻り型がリストの場合、nullの代わりに空のリストを返すことができることはわかっています。ただし、戻りタイプが特定のオブジェクトである場合はどうなりますか。たとえば、一意のIDでデータベースを検索し、結果を返すメソッド。メソッドが何も見つからない場合は何を返す必要がありますか?

「例外を破棄」を使用しようとしましたが、関数を呼び出す場所に、より多くのコード化された追加のロジックを記述してしまいました。

任意の提案をいただければ幸いです。

4

5 に答える 5

3

nullを返したくない場合は、Optionalクラスのようなものを使用できます。

于 2012-04-05T21:55:01.977 に答える
1

ヌルは存在しないこととして定義され、あなたが望むものに完全に適合しているようです。コードが何も返さない場合は何も返しませんよね?

しかし、いつものように、それは異なります。

コードが何も返さないように意図されている場合、そうすることで、計り知れない問題が発生する可能性があります。この場合、例外をスローすることをお勧めします。1 / null、どこでも機能しません。

存在しないことが完全に有効な戻り値である場合、なぜ例外を返したいのでしょうか。もちろん、クエリから返される存在しない値を処理するためのコードが用意されていると仮定すると、例外をスローする必要はまったくありません。

于 2012-04-05T21:55:43.037 に答える
1

コンテキストスイッチがあり、多くのデバッグ情報を収集する必要があるため、例外のスローはコストのかかる操作です。したがって、プロセスフローを制御する方法として例外をスローすることは避けてください(特に、例外をスローせずに状況を処理できる場合)。 )。例外のキャッチを回避するために、nullを返すことは完全に許容できます。

この動作の例は、C#のいくつかのLINQ関数です。これらのメソッドはnullを返す可能性があります。

SingleOrDefault(); // returns a single instance of an object, or null if not found

FirstOrDefault(); // returns the first matching object, or null if not found

これにより、例外処理を使用して制御フローを把握しようとせずに、nullをチェックできます。

私が考えることができる1つの例外(駄洒落を許してください)は、プログラムの境界を越えて通信するために例外を使用することです。たとえば、別のDLLにデータアクセス層があり、データベースの障害を親プログラムに通知する必要がある場合、それを行うための最良の方法は、例外処理を使用することです。

于 2012-04-05T22:26:26.393 に答える
1

返すことができる可能性のある値である可能性がある場合は、何も見つからない場合Nullは返さないでください。Nullたとえば、次のようになります。

[1, 2, 3, Null, 5].find(nonInteger) -> Null
[1, 2, 3, 4].find(nonInteger) -> Null

.find関数は、成功すると戻ることがあるため、失敗を示すために戻ることはできませんNullNull代わりに、セマンティクスを変更するか、特別なオブジェクトを使用できます。

# changed semantics (with extra information returned)
[1, 2, 3, Null, 5].find(nonInteger) -> index=4, value=Null
[1, 2, 3, 4].find(nonInteger) -> index=Null, value=Null

# changed semantics (with wrapper)
[1, 2, 3, Null, 5].find(nonInteger) -> new Maybe(Null)
[1, 2, 3, 4].find(nonInteger) -> new Maybe()

# special object
NoResultFound = new object()
[1, 2, 3, Null, 5].find(nonInteger) -> Null
[1, 2, 3, 4].find(nonInteger) -> NoResultFound
于 2012-04-05T22:41:33.490 に答える
0

nullを返すことに問題はありませんが、例外をスローすることが最も賢明な代替手段のようです。最善の策は、独自のカスタムExceptionクラスを作成することです。

コードはどちらの方法でもほぼ同じように見えるはずです。

try {
    SearchResult someResult = searchForStuff();
}
catch ( ResultNotFoundException rnfe ) {
    /* do stuff */
}


/* almost the same as this */

SearchResult someResult = searchForStuff();

if ( someResult == null ) {
    /* do stuff */
}
于 2012-04-05T21:56:03.727 に答える