9

Clean Codeを読んで以来、私は自分のコードを説明的で理解しやすいものにしようと努めてきました。AまたはBのいずれかを入力する必要があるという条件がありますが、両方を入力する必要はありません。そして、どちらでもありません。現在、ifこの状態をチェックするためのステートメントは一目で理解するのは難しいです。何がチェックされているかを一目で明確にするために、次のようにどのように記述しますか

if ((!string.IsNullOrEmpty(input.A) && !string.IsNullOrEmpty(input.B)) 
    || string.IsNullOrEmpty(input.A) && string.IsNullOrEmpty(input.B))
{
    throw new ArgumentException("Exactly one A *OR* B is required.");
}
4

8 に答える 8

24

XORの時間:

if(!(string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");

また、次のように書かれていることもあります。

if(!(string.IsNullOrEmpty(input.A) ^ string.IsNullOrEmpty(input.B)))
    throw new ArgumentException("Exactly one A *OR* B is required.");
于 2010-07-12T13:47:59.877 に答える
13
if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) {
 // do stuff
}
于 2010-07-12T13:51:29.617 に答える
12

そのXORであり、エミュレートするのは本当に簡単です。

考えてみれば:

両方を真にすることはできません。両方を偽にすることはできません。1つは真でなければならず、もう1つは偽でなければなりません。

だから、私たちはこれに到達します:

if(string.IsNullOrEmpty(input.A) == string.IsNullOrEmpty(input.B)) {
   throw new ArgumentException("Exactly one A *OR* B is required.");
}

両方が等しい場合、両方とも真、または両方とも偽です。そして、どちらの場合も無効です。

そして、選択した言語にはないかもしれない特別なXOR演算子がなければすべてです。;)

于 2010-07-12T13:51:53.363 に答える
6

この関係は排他的論理和(xor)と呼ばれます。

一部の言語はそれを演算子として提供します-通常は^:

True ^ True -> False
True ^ False -> True
False ^ True -> True
False ^ False -> False
于 2010-07-12T13:49:14.130 に答える
3

排他的論理和を使用する-OR :A XOR B

于 2010-07-12T13:49:04.287 に答える
2

探しているのはXOR(http://en.wikipedia.org/wiki/Exclusive_or)ロジックです。

あなたはそれを次のように書くことができます:

if (string.IsNullOrEmpty(A) ^ string.IsNullOrEmpty(B))
{
//Either one or the other is true
}
else
{
//Both are true or both are false
}
于 2010-07-12T13:51:13.550 に答える
1

必要なものはXOR、つまり排他的論理和演算と呼ばれます。

真理値表はあなたにそれを明らかにします;)

A   B   ⊕
F   F   F
F   T   T
T   F   T
T   T   F

一部の言語(またはほとんどの言語)では、A^Bで表されます。

良いウィキ記事

于 2010-07-12T13:52:22.917 に答える
0

これはまさに排他的論理和の定義です。ブール代数を使用する方法はたくさんありますが、最も簡単な方法はXOR演算子を使用することです。Cでは、論理xorはありませんが、バイナリのxorを使用して、not演算子を2倍にして、真理値を1に強制することができます(0x01のように)

!!string.IsNullOrEmpty(input.A) ^ !!string.IsNullOrEmpty(input.B)

またはネガティブテストを行います

!string.IsNullOrEmpty(input.A) ^ !string.IsNullOrEmpty(input.B)

これは、AとBの両方が設定されている場合、またはどちらも設定されていない場合に当てはまります。

于 2010-07-12T13:51:00.783 に答える