2010-07-12 12 views
9

Seit ich Clean Code gelesen habe, habe ich versucht, meinen Code beschreibend und leicht verständlich zu halten. Ich habe eine Bedingung, in der A oder B ausgefüllt werden müssen. Aber nicht beide. Und nicht auch nicht. Gegenwärtig ist die if-Anweisung zur Überprüfung dieser Bedingung auf einen Blick schwer zu folgen. Wie würden Sie folgendes deutlich zu machen, auf einen Blick zu schreiben, wasA oder B, nicht beide, nicht auch nicht

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."); 
} 
+1

Sie wollen die Antwort für Java-Code oder irgendein Code? –

+0

Ich weiß, dass dies nicht das ist, was du fragst, und es ist eine ganz andere Diskussion, die endlos aufgepeppt wurde, aber ich denke nicht, dass ich hier eine Ausnahme machen würde ... vielleicht eine einfache Nachricht an den Benutzer? – mickeyf

+0

@Claus, ich schreibe eigentlich C#, aber die Sprache sollte nicht auf die Frage – CaffGeek

Antwort

24

Zeit für eine XOR geprüft wird:

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

Sie können es auch geschrieben sehen:

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

XOR für boolesche Ausdrücke kann auch als '! =' Geschrieben werden. Und da '^' selten in booleschen Ausdrücken verwendet wird (zumindest im Java-Code, den ich gesehen habe), würde ich vorschlagen, '! =' Zu verwenden, da jeder Entwickler weiß, was das bedeutet. –

+0

Siehe auch: http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the-xor-operator-in-java-for-boolean-checks –

+3

@ Joachim; nur wahr, wenn du nur einen Wahrheitswert hast, den du in C nicht hast (alles andere ist nicht wahr). – falstro

6

Diese Beziehung wird exklusive-or (xor) genannt.

Einige Sprachen bieten es als Operator - in der Regel ^:

True^True -> False 
True^False -> True 
False^True -> True 
False^False -> False 
0

Dies ist die Definition von exklusiven oder. Es gibt eine Reihe von Möglichkeiten, Boolesche Algebra zu verwenden, die einfachste ist die Verwendung eines XOR-Operators. obwohl in C gibt es keine logische xor, aber Sie können die binäre Eins verwenden, das nicht Betreiber verdoppeln jeden Wahrheitswert zu zwingen, zu sein (wie in 0x01)

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

Oder den negativen Test

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

das wird wahr, wenn sowohl A als auch B gesetzt sind, oder keines von beiden.

+1

! = Ist logisch xor. –

+0

@Roger; Ich werde es auch hier hinstellen. Nein, ist es nicht, nur in Sprachen, wo Sie nur einen Wahrheitswert haben. ! = bedeutet nicht gleich, 1 und 2 sind nicht gleich, aber sie sind beide wahr, also ergibt logisches xor falsch. Sie können !! A! = !! B, aber das ist nur drücken, wenn Sie den XOR-Operator in diesem Fall haben ...;) – falstro

+0

@roe: Verwenden Sie einen booleschen Datentyp. –

2

was Sie suchen, ist XOR (http://en.wikipedia.org/wiki/Exclusive_or) Logik.

können Sie schreiben als:

if (string.IsNullOrEmpty(A)^string.IsNullOrEmpty(B)) 
{ 
//Either one or the other is true 
} 
else 
{ 
//Both are true or both are false 
} 
13
if (string.IsNullOrEmpty(input.A) != string.IsNullOrEmpty(input.B)) { 
// do stuff 
} 
+0

Komm schon Leute! bit weise xor? –

+0

^Dies ist die richtige Antwort. –

+2

Das ist nur dann richtig, wenn der Wahrheitswert immer gleich ist, was in C nicht sein muss. 1! = 2 ist wahr, sollte aber logisch zu false XORed sein. – falstro

12

Sein eine XOR, und es ist wirklich einfach zu emulieren.

Nur daran zu denken:

Beide kann nicht wahr sein, die beide nicht falsch sein kann. Man muss wahr sein, man muss falsch sein.

Also, kommen wir dazu:

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

Wenn beide gleich sind, sind sie entweder beide wahr oder beide falsch. Und beide Fälle sind ungültig.

Und das alles ohne speziellen XOR-Operator, den die Sprache der Wahl möglicherweise nicht hat. ;)

+0

+1, nur weil Sie keinen Ungleichheitsoperator verwendet haben. –

+0

+1 für die einfachste Lösung. Sie müssen den Ausdruck nicht doppelt negieren. –

+0

+1 danke. So viele doppelte Verneinungen in den anderen Antworten begann ich an meiner Vernunft zu zweifeln. –

1

Was Sie brauchen, heißt XOR, d. H. Exklusive OR Operation.

Wahrheitstabelle wird zeigen es Ihnen;)

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

In einigen Sprachen (oder in den meisten von ihnen) ist gekennzeichnet durch A^B.

good wiki article

Verwandte Themen