Начиная с чтения Чистого Кода я пытался сохранить свой код описательным и легким понять. У меня есть условие, где или 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.");
}
Время для 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.");
то, что вы ищете - это логика 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
}
if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) {
// do stuff
}
То, что вам нужно, называется XOR, то есть операция исключающее ИЛИ .
Таблица истинности откроет вам это ;)
A B ⊕
F F F
F T T
T F T
T T F
В некоторых языках (или в большинстве из них) она обозначается A ^ B .
Это самое определение исключающего или. Есть куча способов с помощью булевой алгебры, самый простой - использовать оператор XOR. В C нет логического xor, но вы можете использовать двоичный оператор one, удваивающий оператор not, чтобы заставить любое истинностное значение быть единицей (как в 0x01)
!!string.IsNullOrEmpty(input.A) ^ !!string.IsNullOrEmpty(input.B)
Или сделать отрицательный тест
!string.IsNullOrEmpty(input.A) ^ !string.IsNullOrEmpty(input.B)
который будет истинным, если и A и B установлены, или ни то, ни другое.
Это отношение называется исключающее-или (xor).
Некоторые языки предоставляют его в виде оператора - обычно ^:
True ^ True -> False
True ^ False -> True
False ^ True -> True
False ^ False -> False
Это XOR, и его очень легко подражать.
Просто вдумайтесь:
Оба не могут быть истинными, оба не могут быть ложными. Один должен быть правдой, другой должен быть ложным.
Итак, мы приходим к следующему:
if(string.IsNullOrEmpty(input.A) == string.IsNullOrEmpty(input.B)) {
throw new ArgumentException("Exactly one A *OR* B is required.");
}
Если оба равны, они либо оба истинны, либо оба ложны. И оба случая недействительны.
И все это без какого-либо специального оператора XOR, которого может не быть в выбранном языке. ;)