J'ai une condition
if(exists && !isDirectory || !exists)
{}
comment puis-je le modifier, de sorte qu'il peut être plus compréhensible.
||
Est commutative si
if(!exists || (exists && !isDirectory))
est équivalent.
Maintenant que cela existe est toujours vrai dans la deuxième partie du ||
Vous pouvez déposer le &&
:
if(!exists || !isDirectory)
Ou vous pouvez aller plus loin et faire:
if(!(exists && isDirectory))
En tant que processus, je suggère de construire une table de vérité:
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Cela correspond à NAND
Opération , qui est simplement:
!(exists && isDirectory)
Si vous ne vous souvenez pas de toutes vos portes logiques, Wikipedia a une belle référence avec les tables de vérité à démarrer .
@Christoffer Hammarström a élevé un point important sur l'état de isDirectory
étant attaché à l'état de exists
. En supposant qu'ils se réfèrent à la même référence et qu'il n'est pas possible d'avoir un état où la référence n'existe pas et est un répertoire, la vérité Le tableau peut être écrit comme suit:
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | n/a
1 | 0 | 1
1 | 1 | 0
Le n/a
Est utilisé pour représenter un état qui n'a pas d'importance. Des réductions acceptables pourraient entraîner une 1
Ou 0
Pour les états qui ont obtenu n/a
.
Dans cet esprit, !(exists && isDirectory)
est toujours une réduction valide, ce qui entraîne un 1
Pour !e && d
.
Cependant, !isDirectory
Serait une réduction beaucoup plus simple, ce qui permettrait de 0
Pour !e && d
.
Pour une meilleure lisibilité, j'aime extraire des conditions booléennes aux méthodes:
if(fileNameUnused())
{...}
public boolean fileNameUnused() {
return exists && !isDirectory || !exists;
}
Ou avec un meilleur nom de méthode. Si vous pouvez nommer cette méthode correctement, le lecteur de votre code n'a pas besoin de déterminer ce que signifie la condition booléenne.
Vous pouvez utiliser une table de vérité comme indiquée. La deuxième étape pourrait être une kv-map pour minimiser le nombre de termes.
Utiliser les lois de algèbre booléen est une autre approche:
A = existe
B =! Isdirectory
[.____]! A =! Existe
&& = *
[.____] || = +
[modifier]
[.____] une transformation plus simple, car les opérations et OR sont distributives mutuellement:
existe &&! isdirectory || ! existe
[.____] = a * b +! Un
[.____] = (A +! A) * (B +! A)
[.____] = 1 * (B +! A)
[.____] = b +! Un
[/ EDIT]
existe &&! isdirectory || ! existe
[.____] = a * b +! Un
[.____] = a * b +! A * 1 // identité
[.____] = A * B +! A * (B + 1) // Annihilator
[.____] = A * B +! A * B +! A // Distribution et identité
[.____] = B * (A +! A) +! A // Distribution
[.____] = B * 1 +! A // Complemence 2
[.____] = B +! A // Identité
[.____] =! isdirectory || ! existe
Ou avec double complément (!! x = x):
A * b +! Un
[.____] = !! (a * b +! A)
[.____] =! (! (A * b) * a)
=! ((! A +! B) * a)
[.____] =! (! A * A +! B * a)
[.____] =! (0 +! B * a)
[.____] =! (! B * a)
[.____] = b +! Un
[.____] =! isdirectory || ! existe
Je n'aime pas utiliser "!" quand il y a plus d'une condition dans l'expression. Je vais ajouter des lignes de code pour le rendre plus lisible.
doesNotExist = !exists;
isFile = exists && !isDirecotry;
if (isFile || doesNotExist)
{}