Mam warunek
if(exists && !isDirectory || !exists)
{}
jak mogę go zmodyfikować, aby był bardziej zrozumiały.
conditions
Spynet
źródło
źródło
exists
iisDirectory
czy oba są prawdziwe?Odpowiedzi:
||
jest więc przemiennyjest równoważne.
Teraz, ponieważ istnieje jest zawsze prawdziwe w drugiej części
||
możesz upuścić&&
:Możesz też pójść o krok dalej i zrobić:
źródło
&&
ma wyższy priorytet (przynajmniej w najbardziej znanych językach - mogą istnieć wyjątki) niż||
.a && b || c
Jest to więc równoważne,(a && b) || c
ale niea && (b || c)
.!exists || !isDirectory
jest to bardziej „zrozumiałe”, ponieważisDirectory
nie może być prawdą, jeśli!exists
. Więc jako człowiek powiemy „jeśli nie istnieje lub [istnieje i nie jest katalogiem”.||
jest przemienny tylko wtedy, gdy jest stosowany w przypadku wartości bez skutków ubocznych - jeśli na przykład jest używany z funkcjami, niektóre funkcje mogą nie zostać wywołane (zwarcie) lub zwrócić inną wartość w innej kolejności.Jako proces sugeruję zbudowanie tabeli prawdy:
Jest to zgodne z
NAND
operacją , która jest po prostu:Jeśli nie pamiętasz wszystkich swoich bramek logicznych, wikipedia ma ładny odnośnik z tabelami prawdy do uruchomienia .
@Christoffer Hammarström poruszył ważną kwestię dotyczącą stanu
isDirectory
przywiązania do tego stanuexists
. Zakładając, że odnoszą się do tego samego odwołania i że nie jest możliwe, aby stan, w którym odwołanie nie istnieje i jest katalogiem, tabelę prawdy można zapisać w następujący sposób:n/a
Jest używany do reprezentowania stanu, że nie ma znaczenia. Dopuszczalne redukcje mogą skutkować skutkiem jednego1
lub obu0
stanówn/a
.Mając to na uwadze,
!(exists && isDirectory)
nadal obowiązuje ważna redukcja, w wyniku której powstaje1
for!e && d
.Jednak
!isDirectory
byłoby o wiele prostsze redukcji, w wyniku czego0
na!e && d
.źródło
isDirectory
zależyexists
. Nie może być jednocześnie katalogiem i nie istnieje.n/a
w miejscach, w których nie można osiągnąć stanu, a równanie odpowiednio zmniejszyć.Dla lepszej czytelności lubię wyodrębniać warunki boolowskie do metod:
Lub z lepszą nazwą metody. Jeśli potrafisz poprawnie nazwać tę metodę, czytnik twojego kodu nie musi odgadnąć, co oznacza warunek logiczny.
źródło
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Możesz po prostu spróbować przybić skrzynkę no-go i wpłacić kaucję, jeśli się pojawi.
lub nawet
źródło
Możesz użyć tabeli prawdy, jak wskazano. Drugim krokiem może być mapa KV dla zminimalizowania liczby terminów.
Korzystanie z praw algebry boolowskiej to kolejne podejście:
A = istnieje
B =! IsDirectory
! A =! Istnieje
&& = *
|| = +
[Edytuj]
Prostsza transformacja, ponieważ operacje AND i OR dzielą się wzajemnie:
istnieje &&! isDirectory || ! istnieje
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Edytuj]
istnieje &&! isDirectory || ! istnieje
= A * B +! A
= A * B +! A * 1 // Tożsamość
= A * B +! A * (B + 1) // Annihilator
= A * B +! A * B +! A / / Dystrybucja i tożsamość
= B * (A +! A) +! A // Dystrybucja
= B * 1 +! A // Uzupełnienie 2
= B +! A // Tożsamość
=! IsDirectory || ! istnieje
Lub z podwójnym uzupełnieniem (!! 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 || ! istnieje
źródło
Nie lubię używać „!” gdy w wyrażeniu występuje więcej niż jeden warunek. Dodam wiersze kodu, aby był bardziej czytelny.
źródło
Jak wskazano wcześniej, warunek można sprowadzić do:
Założę się jednak, że bycie katalogiem oznacza istnienie. Jeśli tak, możemy zredukować ten warunek do:
źródło