조건이 있습니다
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
operation 입니다 :
!(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
for !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 // ID
= A * B +! A * (B + 1) // 소멸자
= 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)
{}