tengo una condición
if(exists && !isDirectory || !exists)
{}
¿Cómo puedo modificarlo para que sea más comprensible?
conditions
Spynet
fuente
fuente
exists
yisDirectory
son ambas verdaderas?Respuestas:
||
es conmutativo asíes equivalente.
Ahora porque existe siempre es cierto en la segunda parte de la
||
que puede soltar&&
:O puede ir un paso más allá y hacer:
fuente
&&
tiene mayor prioridad (al menos en la mayoría de los idiomas conocidos, puede haber excepciones) que||
. Pora && b || c
lo tanto, es equivalente(a && b) || c
pero no aa && (b || c)
.!exists || !isDirectory
es más "comprensible", porqueisDirectory
no puede ser cierto si!exists
. Entonces, como humanos diremos "si no existe o si [existe y no] es un directorio".||
solo es conmutativo si se usa en valores sin efectos secundarios; si, por ejemplo, se usa con funciones, algunas funciones podrían no llamarse (cortocircuito) o devolver un valor diferente en un orden diferente.Como proceso, sugiero construir una tabla de verdad:
Esto coincide con la
NAND
operación , que es simplemente:Si no recuerda todas sus puertas lógicas, wikipedia tiene una buena referencia con las tablas de verdad para arrancar .
@Christoffer Hammarström planteó un punto importante sobre el estado de
isDirectory
estar vinculado al estado deexists
. Suponiendo que se refieren a la misma referencia, y que no es posible tener un estado donde la referencia no existe y es un directorio, la tabla de verdad se puede escribir de la siguiente manera:El
n/a
se utiliza para representar un estado que no importa. Reducciones aceptables podrían resultar en1
o0
para los estados resultantes enn/a
.Con esto en mente,
!(exists && isDirectory)
sigue siendo una reducción válida, lo que resulta en un1
for!e && d
.Sin embargo,
!isDirectory
sería una reducción mucho más simple, lo que resulta en0
para!e && d
.fuente
isDirectory
dependeexists
. No puede ser un directorio y no existir.n/a
en lugares donde el estado es imposible de alcanzar, y la ecuación debe reducirse en consecuencia.Para una mejor legibilidad, me gusta extraer condiciones booleanas a los métodos:
O con un mejor nombre de método. Si puede nombrar este método correctamente, el lector de su código no necesita descubrir qué significa la condición booleana.
fuente
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Podrías tratar de arreglar el caso de no ir y rescatar si eso aparece.
o incluso
fuente
Puede usar una tabla de verdad como se señaló. El segundo paso podría ser un mapa KV para minimizar el número de términos.
Usar las leyes del álgebra booleana es otro enfoque:
A = existe
B =! IsDirectory
! A =! Existe
&& = *
|| = +
[Editar]
Una transformación más simple, porque las operaciones AND y OR son mutuamente distributivas:
existe &&! isDirectory || ! existe
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Editar]
existe &&! isDirectory || ! existe
= A * B +! A
= A * B +! A * 1 // Identidad
= A * B +! A * (B + 1) // Aniquilador
= A * B +! A * B +! A / / Distributividad e identidad
= B * (A +! A) +! A // Distributividad
= B * 1 +! A // Complementación 2
= B +! A // Identidad
=! IsDirectory || ! existe
O con doble complemento (!! x = x):
A * B +! A
= !! (A * B +! A)
=! (! (A * B) * A)
=! ((! A +! B) * A)
=! (! A * A + ! B * A)
=! (0 +! B * A)
=! (! B * A)
= B +! A
=! IsDirectory || ! existe
fuente
No me gusta usar "!" cuando hay más de una condición en la expresión. Agregaré líneas de código para hacerlo más legible.
fuente
Como se indicó anteriormente, la condición se puede reducir a:
Sin embargo, apuesto a que ser un directorio implica existencia. Si es así, podemos reducir la condición a:
fuente