2010-07-12 12 views
9

Desde que leí el Código de limpieza, he tratado de mantener mi código descriptivo y fácil de entender. Tengo una condición donde se deben completar A o B. Pero no ambos. Y no ninguno. Actualmente, la declaración if para verificar esta condición es difícil de seguir de un vistazo. ¿Cómo se escribe lo siguiente para que quede claro de un vistazo lo que se está comprobandoA o B, no ambos, ninguno tampoco

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

¿Quieres la respuesta de código Java o simplemente cualquier código? –

+0

Sé que esto no es lo que estás preguntando, y es una discusión totalmente diferente que se ha repetido interminablemente, pero no creo que arroje una excepción aquí ... ¿tal vez un simple mensaje para el usuario? – mickeyf

+0

@Claus, en realidad estoy escribiendo C#, pero el idioma no debería importar a la pregunta – CaffGeek

Respuesta

24

Tiempo para un XOR:

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

Es posible que también vea escrito como:

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

XOR para expresiones booleanas también se puede escribir como '! ='. Y como '^' rara vez se usa en expresiones booleanas (al menos en el código Java que he visto), en realidad sugiero usar '! =' Ya que cada desarrollador sabe lo que eso significa. –

+0

También vea esto: http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the-xor-operator-in-java-for-boolean-checks –

+3

@Joachim; solo es verdad si tiene solo un valor de verdad, que en C no lo hace (cualquier cosa que no sea cero es verdadera). – falstro

6

Esta relación se denomina exclusive-or (xor).

Algunos lenguajes proporcionan como un operador - por lo general ^:

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

Esta es la definición misma de exclusiva o. Hay muchas maneras de usar álgebra booleana, la más simple es usar un operador XOR. En C, no hay lógica XOR sin embargo, pero se puede utilizar el uno binario, duplicando el operador not a la fuerza ningún valor de verdad a ser uno (como en 0x01)

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

o realiza la prueba negativa

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

que será verdadero si se configuran A y B, o ninguno.

+1

! = Es lógico xor. –

+0

@Roger; Lo pondré aquí también entonces. No, no lo es, solo en idiomas donde solo tienes un valor de verdad. ! = significa que no son iguales, 1 y 2 no son iguales, sin embargo, ambos son verdaderos, por lo que el xor lógico arroja un resultado falso. Puede hacer !! A! = !! B, pero eso es solo empujarlo cuando tiene el operador xor en ese caso ...;) – falstro

+0

@roe: use un tipo de datos booleanos. –

2

lo que está buscando es XOR (http://en.wikipedia.org/wiki/Exclusive_or) lógica.

Se puede escribir como:

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

¡Vamos gente! poco sabio xor? –

+0

^Esta es la respuesta correcta. –

+2

esto solo es correcto si el valor de verdad es siempre el mismo, que en C no tiene que ser así. 1! = 2 es verdadero, pero debe ser lógicamente XORed a falso. – falstro

12

Es un XOR, y es muy fácil de imitar.

Sólo pensar en ello:

ambos no pueden ser verdad, ambos pueden no ser falso. Uno tiene que ser cierto, uno tiene que ser falso.

Por lo tanto, llegamos a esto:

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

Si ambos son iguales, o bien son ambos verdaderos o ambos falsos. Y ambos casos son inválidos.

Y todo eso sin ningún operador XOR especial que el lenguaje elegido no tenga. ;)

+0

+1 solo porque no usaste un operador de desigualdad. –

+0

+1 para la solución más fácil. No necesita duplicar la negación de la expresión. –

+0

+1 gracias. Tantas negaciones dobles en las otras respuestas que estaba empezando a dudar de mi cordura. –

1

Lo que necesita se llama XOR, es decir, operación exclusiva O.

Tabla de verdad se revelará a usted;)

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

En algunas lenguas (o en la mayor parte de ellos) se denota por A^B .

good wiki article

Cuestiones relacionadas