1

what if I would have something like this:

if (data == null || (data != null && (data.Count() != 3 || data.IsNotCorrect()))
{
  //error...
}

The data == null and then || (data != null) part is somehow ugly. Is that how to solve this problem in c#?

Edit: Sorry! Changed data.IsCorrect() to data.IsNotCorrect()

4

5 に答える 5

8

上手。data.Count() != 3 || data.IsCorrect()。カウントが3の場合、データが正しくないということです。では、内部でチェックを行う代わりに、追加のif条件を使用するのはなぜですか。

if (data == null || data.IsCorrect())
{
  //error...
}

アップデート

検証ロジックをクラス内に移動することの意味について混乱しているようです。すべてのクラスは、適切なOOPで何が有効な状態であるかを判断する責任があります。これはカプセル化と呼ばれます。

クラス自体の代わりに呼び出し元に何が正しいかどうかを判断させるというこの全体的なアイデアは、OR / M、マッパーなどの導入以来、ますます出現しています。しかし、実際には、自分の情報を検証しないクラスはそうではありません。本当に適切に設計されたOOPクラス。それらはDTOのよ​​うな単なるコンテナです。

それによる危険は、呼び出しコードのすべてのブロックが、DTOに正しく有効な情報が含まれていることを確認する責任があることです。つまりn、コードには、だけでなくバグが発生する可能性のある場所があります1

そのため、すべての検証ロジックを、IsCorrectまたはそれを呼び出したいものの内部に移動することをお勧めします。しかし、本当に基本的なOOPの原則に従ってコーディングしたい場合は、クラスが一貫性のない状態にならないようにする必要があります。そして、それは私が以下のブログ投稿で説明するように行われます。

http://blog.gauffin.org/2012/06/protect-your-data/

于 2012-09-18T14:16:15.550 に答える
7

そのままにしておくことができます(data != null && ... )(つまり、...パーツを残す)。

前の引数が||評価されるtrue(つまりdatanull である) 場合、後の引数||は評価されないため、null 参照の例外について心配する必要はありません。これを短絡と呼びます。

于 2012-09-18T14:15:40.023 に答える
5

遅延評価のために2番目のチェックを削除できます。その後、演算子data != nullのみが残るため、括弧は不要になります。||

if (data == null || data.Count() != 3 || data.IsCorrect())

もちろん、上記は少し疑わしいです (私は を期待していたでしょう!data.IsCorrect())。

于 2012-09-18T14:15:47.937 に答える
3

の右側||は、左側が真でない場合(||短絡している場合)にのみ評価されます。

条件付きOR演算子(||)は、そのboolオペランドの論理ORを実行します。最初のオペランドがtrueと評価された場合、2番目のオペランドは評価されません。最初のオペランドがfalseと評価された場合、2番目の演算子はOR式全体がtrueと評価されるかfalseと評価されるかを決定します。

オペレーターからの引用||(C#リファレンス)(MSDN)

それをあなたの表現に適用してください:

data == null || (data != null && (data.Count() != 3 || data.IsCorrect())

これは、data != nullに到達したとき、とdataは異なるnullことdata != nullが保証されているため、真であることが保証されているため、省略できることを意味します。

したがって、式は次と同等です。

data == null || data.Count() != 3 || data.IsCorrect()
于 2012-09-18T14:17:53.693 に答える
1

その部分を取り除くだけですdata != null。ステートメントの最初の部分は既に通過しているため、その時点でデータが null ではないことがわかっているため、チェックする必要はありません。

if (data == null || (data.Count() != 3 || data.IsCorrect()))
于 2012-09-18T14:15:57.797 に答える