7

アイテムのコレクションを含むクラスがあります。便宜上、実装されている GetCurrentItem を提供しました

public Type GetCurrentItem
{
     get { return this.items[this.items.Count - 1]; }  
}

リストに項目がない場合、例外がスローされます。

例外をスローする必要がありますか、それとも返す必要がありnullますか? これが私があなたに渡した API だったとしたら、あなたは何を期待しますか? 例外またはnull?これを処理するより良い方法はありますか?

4

7 に答える 7

9

どちらがより正しいですか?カークのコメントが示唆するように:それは依存します。デフォルトが合理的でない場合nullは、論理的に意味のある場合もあれば、例外の方が適している場合もあります。私がやろうとしていることの 1 つは、「GetCurrentItem論理的な失敗を呼び出すことですか、それとも安全なことを呼び出すことですか?」ということです。

何もないときに呼び出しに失敗した場合はGetCurrentItem、例外をスローするのが正しいコースです。たとえば、コレクションにHasCurrentorIsEmptyプロパティがあり、誰かが を呼び出す前に結果を調べることができるGetCurrentItem場合、彼らは「よく知っている」必要があります。しかし、現在のアイテムがnullクラスを使用する正しい論理的な方法である場合は、必ずそのように設計してください。いずれにせよ、ユーザーに予想される動作を知らせるために、コード コメントに動作を記録します。

ただし、例外を公開すると、ArgumentOutOfRange実装の詳細が流出する可能性があります。つまり、このクラスのユーザーが内部構造が配列またはList<T>であることを認識していない場合、その例外をブリードアウトせず、キャッチしてラップし、より意味のあるもの (カスタム、または のようなものInvalidOperationException)をスローします。 .

実際には引数を直接渡していないため、ArgumentOutOfRange例外を取得すると混乱する可能性があります:-)

于 2012-06-22T17:10:22.767 に答える
3

エラーをスローします。これは、他のコレクションがどのように機能するかです。潜在的な例外を処理するのは、ユーザー アプリケーション次第です (特にコレクションを操作する場合)。bool HasSelection()先に進む前に、ユーザーが呼び出すことができるメソッドがあるはずです。

于 2012-06-22T17:09:52.867 に答える
3

例外は、例外的な場合に使用する必要があります。CurrentItem が null になる可能性がある場合は、例外をスローしないでください。CurrentItem を持たないことが例外的である理由がわかりません。

于 2012-06-22T17:10:14.347 に答える
1

ユーザーの視点で考えてみます。驚き最小の原則を求めてください。

ライブラリまたはオブジェクトを使用して呼び出しGetCurrentItemIndexOutOfRangeExceptionときにスローされた場合、「インデックスを使用して何も呼び出さなかったので、現在のアイテムが必要でした」と思います。したがって、nullを返すことを提案します。これにより、「ああ、現在のアイテムはありません」と思われるでしょう。

または、プロパティがインデクサーであり、特定のインデックスでアイテムを取得したい場合は、に驚かないでしょうIndexOutOfRangeException

于 2012-06-22T17:15:26.950 に答える
1

問題は、GetCurrentItem が安全な値を返すことを期待するかどうかです。Type が null 許容の場合、現在の項目がない場合、GetCurrentItem はおそらく null を返す必要があります。リストが空ではなく、デフォルトで常に何かが選択されていることが常に予想される場合は、意味のある例外をスローします。

あなたのケースが本当に例外であり、通常のユースケースではない場合を除き、通常は例外をスローすべきではありません。ただし、これはかなり主観的なものになる可能性があります。

于 2012-06-22T17:11:05.123 に答える
0

このGetCurrentItemがAPIにとって意味がある場合、アイテムがないときに「InvalidOperationException」をスローします。有効な結果としてnullを許可する場合は、別の名前を付けることができます。

既存のLINQLastメソッドがすでに同じ機能を提供しているかどうかを検討してください。

于 2012-06-22T17:13:56.320 に答える
0

疑わしい場合は、.NET に従ってください。この機能は、空の場合に例外をスローする List.Last() に似ています。

http://msdn.microsoft.com/en-us/library/bb358775

于 2012-06-22T17:16:43.713 に答える