状態がある
if(exists && !isDirectory || !exists)
{}
どうすれば修正できるので、より理解しやすくなります。
exists
とisDirectory
の両方が本当ですか?
状態がある
if(exists && !isDirectory || !exists)
{}
どうすれば修正できるので、より理解しやすくなります。
exists
とisDirectory
の両方が本当ですか?
回答:
||
可換なので
if(!exists || (exists && !isDirectory))
同等です。
の2番目の部分では、existsが常に真であるため、以下||
をドロップできます&&
。
if(!exists || !isDirectory)
または、さらに一歩進んで以下を実行できます。
if(!(exists && isDirectory))
&&
(少なくとも最もよく知られている言語では-例外があるかもしれない)よりも高い優先順位を持っているということです||
。したがって、a && b || c
と同等ですが(a && b) || c
、ではありませんa && (b || c)
。
!exists || !isDirectory
、ので、より多くの「分かりやすい」であるisDirectory
場合はtrueにすることはできません!exists
。したがって、人間として「存在しないか、存在する場合はディレクトリではない」と言います。
||
副作用のない値で使用された場合にのみ可換です-たとえば関数で使用された場合、一部の関数は呼び出されない(短絡)か、異なる順序で異なる値を返します。
プロセスとして、真理値表を作成することをお勧めします。
e = exists
d = isDirectory
e | d | (e && !d) || !e
--+---+----------------
0 | 0 | 1
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0
!(exists && isDirectory)
すべてのロジックゲートを覚えていない場合、ウィキペディアにはブートするための真理値表に関する素晴らしいリファレンスがあります。
@ChristofferHammarströ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
forになり!e && d
ます。
ただし、これ!isDirectory
ははるかに単純な削減であり、結果は0
forになり!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
// ...
}
指摘したとおり、真理値表を使用できます。2番目のステップは、項の数を最小化するためのKVマップです。
ブール代数の法則を使用することも別のアプローチです。
A =存在する
B =!isDirectory
!A =!exists
&& = *
|| = +
[編集]
操作ANDとORは相互に分配的であるため、より単純な変換です。
存在する&&!isDirectory || !exists
= A * B +!A
=(A +!A)*(B +!A)
= 1 *(B +!A)
= B +!A
[/編集]
存在する&&!isDirectory || !exists
= A * B +!A
= A * B +!A * 1 // ID
= A * B +!A *(B + 1)// Annihilator
= A * B +!A * B +!A / / Distributivity and Identity
= B *(A +!A)+!A // Distributivity
= B * 1 +!A // Complementation 2
= B +!A // Identity
=!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 || 存在する