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

异或的时间:

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,而且很容易模拟。

想想看:

两者都不能是真的,两者都不能是假的。一个必须是真的,一个必须是假的。

所以,我们来到这个:

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

使用异或: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

您需要的是所谓的异或,即异或运算。

真值表会向你揭示它;)

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 中,虽然没有逻辑异或,但您可以使用二进制异或,将非运算符加倍以强制任何真值为 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 回答