Saya memiliki suatu kondisi
if(exists && !isDirectory || !exists)
{}
bagaimana saya bisa memodifikasinya, sehingga bisa lebih dimengerti.
conditions
Spynet
sumber
sumber
exists
danisDirectory
keduanya benar?Jawaban:
||
komutatif begitusetara.
Sekarang karena ada selalu benar di bagian kedua
||
Anda dapat menjatuhkan&&
:Atau Anda dapat melangkah lebih jauh dan melakukan:
sumber
&&
memiliki prioritas lebih tinggi (setidaknya dalam sebagian besar bahasa terkenal - mungkin ada pengecualian) daripada||
. Jadia && b || c
sama dengan(a && b) || c
tetapi tidak untuka && (b || c)
.!exists || !isDirectory
lebih "dapat dimengerti", karena,isDirectory
tidak mungkin benar jika!exists
. Jadi sebagai manusia kita akan mengatakan "jika itu tidak ada atau itu [ada dan itu] bukan direktori".||
hanya komutatif jika digunakan pada nilai tanpa efek samping - jika misalnya digunakan dengan fungsi, beberapa fungsi mungkin tidak dipanggil (hubungan arus pendek) atau mengembalikan nilai yang berbeda dalam urutan yang berbeda.Sebagai suatu proses, saya sarankan membangun tabel kebenaran:
Ini cocok dengan
NAND
operasi , yang hanya:Jika Anda tidak mengingat semua gerbang logika Anda, wikipedia memiliki referensi yang bagus dengan tabel kebenaran untuk di-boot .
@Christoffer Hammarström mengemukakan satu poin penting tentang keadaan
isDirectory
terikat pada keadaanexists
. Dengan asumsi bahwa mereka merujuk ke referensi yang sama, dan bahwa tidak mungkin memiliki keadaan di mana referensi tidak ada dan merupakan direktori, tabel kebenaran dapat ditulis sebagai berikut:Yang
n/a
digunakan untuk mewakili sebuah negara yang tidak peduli. Pengurangan yang dapat diterima dapat menghasilkan salah satu1
atau0
untuk negara bagian yang menghasilkann/a
.Dengan pemikiran ini,
!(exists && isDirectory)
masih merupakan reduksi yang valid, menghasilkan1
for!e && d
.Namun,
!isDirectory
pengurangan akan jauh lebih sederhana, menghasilkan0
untuk!e && d
.sumber
isDirectory
tergantung padaexists
. Keduanya tidak bisa berupa direktori dan tidak ada.n/a
tempat-tempat di mana negara tidak mungkin untuk dicapai, dan persamaan berkurang sesuai.Untuk keterbacaan yang lebih baik, saya suka mengekstraksi kondisi boolean ke metode:
Atau dengan nama metode yang lebih baik. Jika Anda dapat memberi nama metode ini dengan benar, pembaca kode Anda tidak perlu mencari tahu apa arti kondisi boolean.
sumber
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Anda bisa mencoba untuk menyelesaikan kasus no-go dan menebus jika itu muncul.
atau bahkan
sumber
Anda bisa menggunakan tabel kebenaran seperti yang ditunjukkan. Langkah kedua bisa berupa peta KV untuk meminimalkan jumlah istilah.
Menggunakan hukum aljabar Boolean adalah pendekatan lain:
A = ada
B =! IsDirectory
! A =! Ada
&& = *
|| = +
[Sunting]
Transformasi yang lebih sederhana, karena operasi AND dan OR saling mendistribusikan:
ada &&! isDirectory || ! exist
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Edit]
ada &&! isDirectory || ! exist
= A * B +! A
= A * B +! A * 1 // Identitas
= A * B +! A * (B + 1) // Annihilator
= A * B +! A * B +! A / / Distributivity and Identity
= B * (A +! A) +! A // Distributivity
= B * 1 +! A // Komplementasi 2
= B +! A // Identity
=! IsDirectory || ! ada
Atau dengan komplemen ganda (!! 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 || ! ada
sumber
Saya tidak suka menggunakan "!" ketika ada lebih dari satu syarat dalam ekspresi. Saya akan menambahkan baris kode agar lebih mudah dibaca.
sumber
Seperti yang ditunjukkan sebelumnya, kondisinya dapat dikurangi menjadi:
Namun, saya berani bertaruh bahwa menjadi direktori berarti keberadaan. Jika demikian, kita dapat mengurangi kondisinya menjadi:
sumber