ฉันมีเงื่อนไข
if(exists && !isDirectory || !exists)
{}
ฉันจะแก้ไขได้อย่างไรเพื่อให้เข้าใจได้มากขึ้น
exists
และisDirectory
ทั้งสองเป็นความจริง?
ฉันมีเงื่อนไข
if(exists && !isDirectory || !exists)
{}
ฉันจะแก้ไขได้อย่างไรเพื่อให้เข้าใจได้มากขึ้น
exists
และisDirectory
ทั้งสองเป็นความจริง?
คำตอบ:
||
เปลี่ยนเป็นอย่างนั้น
if(!exists || (exists && !isDirectory))
เทียบเท่า
ตอนนี้เพราะมีอยู่จริงเสมอในส่วนที่สองของ||
คุณสามารถวาง&&
:
if(!exists || !isDirectory)
หรือคุณสามารถก้าวไปอีกขั้นแล้วทำ:
if(!(exists && isDirectory))
&&
มีความสำคัญสูง (อย่างน้อยในส่วนภาษาที่รู้จักกันดี - อาจมีข้อยกเว้น) ||
มากกว่า ดังนั้นa && b || c
จะเทียบเท่ากับการแต่ไม่ได้ไป(a && b) || c
a && (b || c)
!exists || !isDirectory
มีมากขึ้น "เข้าใจ" เพราะไม่สามารถเป็นจริงถ้าisDirectory
!exists
ดังนั้นในฐานะมนุษย์เราจะพูดว่า "ถ้ามันไม่มีตัวตนหรือมัน [มีอยู่แล้ว] ไม่ใช่ไดเรกทอรี"
||
เป็นเพียงการสับเปลี่ยนถ้าใช้กับค่าที่ไม่มีผลข้างเคียง - ถ้าเช่นใช้กับฟังก์ชั่นบางฟังก์ชั่นอาจไม่ได้รับการเรียก (ลัดวงจร) หรือคืนค่าที่แตกต่างกันในลำดับที่แตกต่างกัน
เป็นกระบวนการที่ฉันแนะนำให้สร้างตารางความจริง:
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
สิ่งนี้ตรงกับการNAND
ดำเนินการซึ่งก็คือ:
!(exists && isDirectory)
หากคุณจำไม่ได้ว่าประตูตรรกะทั้งหมดของคุณวิกิพีเดียมีการอ้างอิงที่ดีกับความจริงโต๊ะบูต
@Christoffer Hammarströmนำขึ้นมาเป็นจุดสำคัญเกี่ยวกับสถานะของถูกผูกติดอยู่กับสถานะของisDirectory
exists
สมมติว่าพวกเขาอ้างถึงการอ้างอิงเดียวกันและเป็นไปไม่ได้ที่จะมีสถานะที่ไม่มีการอ้างอิงและเป็นไดเรกทอรีตารางความจริงสามารถเขียนได้ดังนี้:
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | n/a
1 | 0 | 1
1 | 1 | 0
n/a
จะใช้ในการเป็นตัวแทนของรัฐที่ไม่ได้เรื่อง ลดการได้รับการยอมรับอาจส่งผลอย่างใดอย่างหนึ่ง1
หรือสำหรับรัฐที่เกิดขึ้นใน0
n/a
ด้วยวิธีนี้ในใจ!(exists && isDirectory)
ก็ยังคงเป็นที่ถูกต้องลดลงส่งผลให้สำหรับ1
!e && d
แต่!isDirectory
จะลดลงง่ายมากส่งผลให้ในสำหรับ0
!e && d
isDirectory
exists
มันไม่สามารถเป็นทั้งไดเรกทอรีและไม่มีอยู่จริง
n/a
ในสถานที่ที่รัฐไม่สามารถบรรลุได้และสมการลดลงตามลำดับ
เพื่อการอ่านที่ดีขึ้นฉันชอบแยกเงื่อนไขบูลีนเป็นวิธีการ:
if(fileNameUnused())
{...}
public boolean fileNameUnused() {
return exists && !isDirectory || !exists;
}
หรือด้วยชื่อวิธีที่ดีกว่า หากคุณสามารถตั้งชื่อวิธีการนี้ได้อย่างเหมาะสมผู้อ่านรหัสของคุณไม่จำเป็นต้องทราบว่าเงื่อนไขบูลีนหมายถึงอะไร
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
คุณสามารถลองทำเคสที่ไม่ต้องไปและประกันตัวถ้ามันปรากฏขึ้น
while(someCondition) {
if(exists && isDirectory)
continue;
// maybe "break", depends on what you're after.
// the rest of the code
}
หรือแม้กระทั่ง
function processFile(someFile)
{
// ...
if(exists && isDirectory)
return false;
// the rest of the code
// ...
}
คุณสามารถใช้ตารางความจริงตามที่ระบุไว้ ขั้นตอนที่สองอาจเป็นแผนที่ KVสำหรับการลดจำนวนคำศัพท์
การใช้กฎของพีชคณิตแบบบูลเป็นอีกแนวทางหนึ่ง:
A = มีอยู่
B =! isDirectory
! A =! มีอยู่
&& = *
|| = +
[แก้ไข]
การแปลงที่ง่ายกว่าเนื่องจากการดำเนินการ AND และ OR มีการแจกจ่ายซึ่งกันและกัน:
มีอยู่ &&! isDirectory || ! อยู่
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ แก้ไข]
มีอยู่ &&! isDirectory || ! อยู่
= A * B +! A
= A * B +! A * 1 // ตัวตน
= A * B +! A * (B + 1) // Annihilator
= A * B +! A * B +! A / / การกระจายและเอกลักษณ์
= B * (A +! A) +! A // การกระจาย
= B * 1 +! A // การประกอบ 2
= B +! A // เอกลักษณ์
=! isDirectory || ! อยู่
หรือเติมเต็มสองครั้ง (!! 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 || ! อยู่
ฉันไม่ชอบใช้ "!" เมื่อมีมากกว่าหนึ่งเงื่อนไขในการแสดงออก ฉันจะเพิ่มบรรทัดของรหัสเพื่อให้อ่านง่ายขึ้น
doesNotExist = !exists;
isFile = exists && !isDirecotry;
if (isFile || doesNotExist)
{}
ตามที่ระบุไว้ก่อนหน้านี้เงื่อนไขสามารถลดลงเป็น:
if (!(exists && isDirectory))
อย่างไรก็ตามฉันจะเดิมพันว่าการเป็นไดเรกทอรีหมายถึงการมีอยู่ ถ้าเป็นเช่นนั้นเราสามารถลดเงื่อนไขเป็น:
if (!isDirectory)