J'ai une condition
if(exists && !isDirectory || !exists)
{}
Comment puis-je le modifier pour qu'il soit plus compréhensible?
conditions
Spynet
la source
la source
exists
etisDirectory
sont les deux vrais?Réponses:
||
est si commutatifest équivalent.
Maintenant, car existe est toujours vrai dans la deuxième partie de la,
||
vous pouvez laisser tomber le&&
:Ou vous pouvez aller plus loin et faire:
la source
&&
priorité est plus grande (du moins dans les langues les plus connues - il peut y avoir des exceptions)||
. Ainsia && b || c
est équivalent à(a && b) || c
mais pas àa && (b || c)
.!exists || !isDirectory
c'est plus "compréhensible", parce que,isDirectory
ne peut être vrai si!exists
. Donc, en tant qu'être humain, nous dirons "s'il n'existe pas ou s'il [existe et que ce n'est pas un répertoire".||
est uniquement commutatif si elle est utilisée sur des valeurs sans effets secondaires - si, par exemple, elle est utilisée avec des fonctions, certaines fonctions peuvent ne pas être appelées (court-circuit) ou renvoyer une valeur différente dans un ordre différent.En tant que processus, je suggère de construire une table de vérité:
Cela correspond à l'
NAND
opération , qui est simplement:Si vous ne vous souvenez pas de toutes vos portes logiques, Wikipedia a une bonne référence avec les tables de vérité à démarrer .
@Christoffer Hammarström a soulevé un point important à propos de l’état d’
isDirectory
être lié à l’état deexists
. 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 constitue un répertoire, la table de vérité peut être écrite comme suit:Le
n/a
est utilisé pour représenter un état qui n'a pas d'importance. Réductions acceptables pourraient entraîner soit1
ou0
les états résultant enn/a
.Dans cet esprit,
!(exists && isDirectory)
est toujours une réduction valide, entraînant un1
pour!e && d
.Cependant,
!isDirectory
serait une réduction beaucoup plus simple, ce qui0
pour!e && d
.la source
isDirectory
dépendexists
. Il ne peut pas être à la fois un répertoire et ne pas exister.n/a
endroits où l'état est impossible à atteindre et l'équation doit être réduite en conséquence.Pour une meilleure lisibilité, j'aime bien extraire des conditions booléennes aux méthodes:
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 comprendre ce que signifie la condition booléenne.
la source
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Vous pouvez simplement essayer de résoudre le problème du non-départ et de renflouer si cela se présente.
ou même
la source
Vous pouvez utiliser une table de vérité comme indiqué. La deuxième étape pourrait être une carte KV pour minimiser le nombre de termes.
Utiliser les lois de l’algèbre booléenne est une autre approche:
A = existe
B =! IsDirectory
! A =! Existe
&& = *
|| = +
[Edit]
Une transformation plus simple, car les opérations AND et OR sont mutuellement distributives:
existe &&! isDirectory || ! existe
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Modifier]
existe &&! isDirectory || ! existe
= A * B +! A
= A * B +! A * 1 // Identité
= A * B +! A * (B + 1) // Annihilateur
= A * B +! A * B +! A / / Distributivité et identité
= B * (A +! A) +! A // Distributivité
= B * 1 +! A // Complémentation 2
= B +! A // Identité
=! IsDirectory || ! existe
Ou avec double complément (!! 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
la source
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.
la source
Comme indiqué précédemment, la condition peut être réduite à:
Cependant, je parie qu'être un répertoire implique l'existence. Si tel est le cas, nous pouvons réduire la situation à:
la source