А или В, не оба, не ни - PullRequest
       37

А или В, не оба, не ни

9 голосов
/ 12 июля 2010

С тех пор, как я прочитал «Чистый код», я старался, чтобы мой код был наглядным и легким для понимания. У меня есть условие, когда либо А, либо В должны быть заполнены. Но не оба. И нет ни того, ни другого. В настоящее время оператор 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.");
}

Ответы [ 8 ]

24 голосов
/ 12 июля 2010

Время для 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.");
13 голосов
/ 12 июля 2010
if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) {
 // do stuff
}
12 голосов
/ 12 июля 2010

Это XOR, и его действительно легко эмулировать.

Просто подумайте об этом:

Оба не могут быть истинными, оба не могут быть ложными.Нужно быть правдивым, нужно быть ложным.

Итак, мы приходим к следующему:

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

Если оба равны, они либо оба истинны, либо оба ложны.И оба случая недействительны.

И все это без какого-либо специального оператора XOR, которого у языка выбора может не быть.;)

6 голосов
/ 12 июля 2010

Это отношение называется исключающим-или (xor).

Некоторые языки предоставляют его в качестве оператора - обычно ^:

True ^ True -> False
True ^ False -> True
False ^ True -> True
False ^ False -> False
3 голосов
/ 12 июля 2010

Используйте исключающее ИЛИ : A XOR B

2 голосов
/ 12 июля 2010

, что вы ищете, это логика 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
}
1 голос
/ 12 июля 2010

То, что вам нужно, называется XOR, т. Е. Исключительная операция ИЛИ .

Таблица правды откроет это вам ;)

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

В некоторых языках (или в большинстве из них) оно обозначается A ^ B .

хорошая статья в вики

0 голосов
/ 12 июля 2010

Это само определение исключительного или.Существует множество способов использования булевой алгебры, самый простой - использовать оператор XOR.В C нет логического xor, но вы можете использовать двоичный, удваивая оператор not, чтобы заставить любое значение истинности быть единым (как в 0x01)

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

Или выполнить отрицательный тест

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

, что будет истинно, если установлены оба параметра A и B, или ни того, ни другого.

...