2011-09-28 6 views
2

코드를 확인하려면 PMD을 사용합니다. 대부분의 경우에 매우 유용한 힌트를 제공하지만 다음 시나리오에서 개선 할 수있는 것을 파악할 수는 없습니다.자바 접을 수있는 if 문

if ((getSomething() != null && getSomethingElse() != null) 
    || (getSomething() == null && getSomethingElse() == null)) 
{ 
    ... 
} 

PMD는 저에게 말한다 :

원래의 코드는 다음과 같이 보입니다

때로는 두 개의 문은 부울 단락 운영자 자신의 조건을 분리하여 통합 할 수있다 '가' .

편의를 위해 부울 변수로 a와 b를 사용합시다. 그런 다음이 코드 조각은 다음과 같습니다 :이 다음 중 하나에 변환 할 수

if ((!a && !b) || (a && b)) 

:

if ((!a || b) && (a || !b)) 
if (!(a^b)) 

마지막

if (a==b) 

을 그래서

에 내 코드를 단순화
if ((getSomething() == null) == (getSomethingElse() == null)) 

그러나 PM D는 불평을 계속합니다 (사실 세 가지 버전 모두에 대해). 이것은 거짓 긍정입니까, 아니면 if-condition을 작성하는 더 좋은 방법입니까? 개인적으로, 나는 == null의 경우를 나는이 (가) ==가 null와 b 처리 할 수 ​​있도록이 이전에 if 문을 확인 널을 할 거라고 ..although

+2

코드에 _if_ 문이 없습니까? PMD는 _two_ if 문에 대해 불평하지만, 하나가 아니라 필요한 것보다 복잡합니다. – michael667

+0

최종 버전을 더 잘 만들 수있는 방법을 생각할 수 없습니다 (코드 작성). * 내부 *는'if' 블록입니다 - 거기에 또 다른'if'가 있습니까? – Bohemian

+0

방금 ​​JSR305 명세서에서'@ javax.annotations.Nonnull'과'@ javax.annotations.Nullable' 주석을 발견했습니다. 내가 사용하고있는 구현은'com.google.code.findbugs : 1.3.9'에있는 Google입니다.그것은 내 코드를 상당히 정리하고 Intellij IDEA는 이러한 주석을 기반으로 코드와 경고를 자동으로 생성합니다. –

답변

3

문제는 다른 것이 었습니다. (코드 검증 - 방법에서 유래) 경우 경우 문이 또 다른 내부의 코드 만했다 다음 PMD-메시지가 의미

if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    if ((getSomething() == null) == (getSomethingElse() == null)) 
    { 
     ... 
    } 
} 

을, 나는의 조건을 결합 할 수 있다는 것입니다 마지막으로 다른-경우와 내부의 경우 절 : 나는이 작업을 수행 할 수 있습니다 경우 원래 버전이 이해하기가 훨씬 명확하게 보이기 때문에

if (...) 
{ 
    ... 
} 
else if (...) 
{ 
    ... 
} 
else if (... && ((getSomething() == null) == (getSomethingElse() == null))) 
{ 
     ... 
} 

는 그러나, 나는, 확실하지 않다.

2
if ((a != null) && (b != null) && (a==b)) 

개별적으로

+0

이것은 'null'사례를 개별적으로 처리하는 것에 대한 훌륭한 제안입니다. 그런 식으로 특정 NPE를 던져서 정확히 어느 것이 "null"인지 또는 특정 방식으로 처리 하는지를 사용자에게 알릴 수 있습니다. –

+0

그럴 필요는 없습니다. (a == b)'? – Gandalf

+0

@ 간달프 나는 그렇게 생각하지 않는다 .... JRE가 진술을 논리적으로 true 또는 false로 찾는다면, if 문은 다음과 같이 평가할 것이다. 1) 'a'가 null이 아닌가? 사실, 오른쪽으로 이동하십시오. false 인 경우 전체 평가가 사실 일 수 없으므로 평가를 중단하십시오. 2) 'b'가 null이 아닌가요? 사실, 오른쪽으로 이동하십시오. false 인 경우 전체 평가가 사실 일 수 없으므로 평가를 중단하십시오. 3) 'a'와 'b'가 모두 null이 아니므로 'a == b'를 안전하게 평가할 수 있습니다. – claymore1977

1

큰 조건 블록은 논리적으로 어렵다는 것이 문제입니다.

OTOH, 모든 경고 PMD 방출 필요가 없습니다 - ROI를 고려해야합니다. 리팩토링이나 구조 조정이 가치있는 일인가? 동일한 기능을 다른 방식으로 처리 할 수 ​​있습니까?

가치가없는 경우 신경 쓰지 마세요.

+0

나는 내 코드를 바꿀 것이라고 생각하지 않지만, 여전히 "개선"될 수있는 것을 발견하는 것은 흥미 롭다. – martin

+0

우리는 조언을 듣고 즉시 무시합니다.) –