Tôi có một điều kiện
if(exists && !isDirectory || !exists)
{}
Làm thế nào tôi có thể sửa đổi nó, để nó có thể dễ hiểu hơn.
exists
và isDirectory
cả hai đều đúng?
Tôi có một điều kiện
if(exists && !isDirectory || !exists)
{}
Làm thế nào tôi có thể sửa đổi nó, để nó có thể dễ hiểu hơn.
exists
và isDirectory
cả hai đều đúng?
Câu trả lời:
||
là giao hoán
if(!exists || (exists && !isDirectory))
là tương đương
Bây giờ bởi vì tồn tại luôn luôn đúng trong phần thứ hai của ||
bạn, bạn có thể bỏ &&
:
if(!exists || !isDirectory)
Hoặc bạn có thể tiến thêm một bước và làm:
if(!(exists && isDirectory))
&&
có độ ưu tiên cao hơn (ít nhất là trong hầu hết các ngôn ngữ được biết đến - có thể có ngoại lệ) hơn ||
. Như vậy a && b || c
là tương đương (a && b) || c
nhưng không a && (b || c)
.
!exists || !isDirectory
là "dễ hiểu" hơn, bởi vì, isDirectory
không thể đúng nếu !exists
. Vì vậy, là một con người, chúng ta sẽ nói "nếu nó không tồn tại hoặc nó [tồn tại và nó] không phải là một thư mục".
||
chỉ giao hoán nếu được sử dụng trên các giá trị không có tác dụng phụ - ví dụ: nếu được sử dụng với các chức năng, một số chức năng có thể không được gọi (ngắn mạch) hoặc trả về một giá trị khác theo thứ tự khác.
Theo quy trình, tôi đề nghị xây dựng một bảng chân lý:
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
Điều này phù hợp với NAND
hoạt động , đơn giản là:
!(exists && isDirectory)
Nếu bạn không nhớ tất cả các cổng logic của mình, wikipedia có một tài liệu tham khảo thú vị với các bảng chân lý để khởi động .
@Christoffer Hammarström đưa ra một điểm quan trọng về tình trạng isDirectory
bị ràng buộc với trạng thái exists
. Giả sử rằng chúng tham chiếu đến cùng một tham chiếu và rằng không thể có trạng thái nơi tham chiếu không tồn tại và là một thư mục, bảng chân lý có thể được viết như sau:
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | n/a
1 | 0 | 1
1 | 1 | 0
Cái n/a
này được sử dụng để đại diện cho một trạng thái không quan trọng. Việc giảm chấp nhận được có thể dẫn đến một trong hai 1
hoặc 0
cho các trạng thái dẫn đến n/a
.
Với suy nghĩ này, !(exists && isDirectory)
vẫn là một giảm hợp lệ, dẫn đến một 1
cho !e && d
.
Tuy nhiên, !isDirectory
sẽ là một giảm đơn giản hơn nhiều, kết quả là 0
cho !e && d
.
isDirectory
phụ thuộc vào exists
. Nó không thể là một thư mục và không tồn tại.
n/a
vào những nơi không thể đạt được trạng thái và phương trình giảm tương ứng.
Để dễ đọc hơn, tôi muốn trích xuất các điều kiện boolean cho các phương thức:
if(fileNameUnused())
{...}
public boolean fileNameUnused() {
return exists && !isDirectory || !exists;
}
Hoặc với một tên phương pháp tốt hơn. Nếu bạn có thể đặt tên cho phương thức này một cách chính xác, người đọc mã của bạn sẽ không hiểu được điều kiện boolean có nghĩa là gì.
boolean fileNameUnused = !exists || !isDirectory; if (fileNameUnused) { doSomething(); }
Bạn chỉ có thể cố gắng đóng đinh trường hợp không đi và bảo lãnh nếu điều đó xuất hiện.
while(someCondition) {
if(exists && isDirectory)
continue;
// maybe "break", depends on what you're after.
// the rest of the code
}
hoặc thậm chí
function processFile(someFile)
{
// ...
if(exists && isDirectory)
return false;
// the rest of the code
// ...
}
Bạn có thể sử dụng một bảng chân lý như được chỉ ra. Bước thứ hai có thể là bản đồ KV để giảm thiểu số lượng điều khoản.
Sử dụng định luật đại số Boolean là một cách tiếp cận khác:
A = tồn tại
B =! IsDirectory
! A =! Tồn tại
&& = *
|| = +
[Chỉnh sửa]
Một biến đổi đơn giản hơn, bởi vì các hoạt động AND và OR là phân phối lẫn nhau:
tồn tại &&! isDirectory || ! tồn tại
= A * B +! A
= (A +! A) * (B +! A)
= 1 * (B +! A)
= B +! A
[/ Chỉnh sửa]
tồn tại &&! isDirectory || ! tồn tại
= A * B +! A
= A * B +! A * 1 // Danh tính
= A * B +! A * (B + 1) // Annihilator
= A * B +! A * B +! A / / Phân phối và Danh tính
= B * (A +! A) +! A // Phân phối
= B * 1 +! A // Bổ sung 2
= B +! A // Danh tính
=! IsDirectory || ! tồn tại
Hoặc với bổ sung kép (!! 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 || ! tồn tại
Tôi không thích sử dụng "!" khi có nhiều hơn một điều kiện trong biểu thức. Tôi sẽ thêm các dòng mã để dễ đọc hơn.
doesNotExist = !exists;
isFile = exists && !isDirecotry;
if (isFile || doesNotExist)
{}
Như đã chỉ ra trước đó, tình trạng có thể được giảm xuống:
if (!(exists && isDirectory))
Tuy nhiên, tôi sẽ đặt cược rằng một thư mục ngụ ý sự tồn tại. Nếu vậy, chúng ta có thể giảm điều kiện xuống:
if (!isDirectory)