2011-02-16 4 views
2

나는 다음과 같은 코드의 라인을 가지고 수행해야합니다 약 20 검사와자바 코딩 표준 및 다중 IF의

if(
    checker.this()==false || 
    checker.that()==false || 
    checker.what()==true|| 
    checker.cool()==false || 
    checker.damm()==true 
    (...) 
) 
{ 
    option = Option.FALSE; 
} 

합니다. 나는 이것을 if 복수 OR 시퀀스와 함께 쓰는 것이 가장 시각적으로 견딜 수있는 형식이라는 것을 알았지 만 아직 만족하지는 못했다. 이것에 대한 코딩 표준이 있습니까?

감사합니다.

답변

11

코딩에 가장 가까운 것 이 문제를 둘러싼 표준은 스티브 맥코넬 (Steve McConnel)입니다.이 책의 권위있는 책 "코드 컴플리트 (Code Complete)"는 한 번만 사용 되더라도 복잡한 조건을 자신의 방법으로 분해 할 것을 권장합니다. 이것은 일어나고있는 것을 descibe하는 메소드의 이름을 허용합니다.

if (checkValid(checker)) {...} 

private boolean checkValid(Checker checker) {...} 

checkValid는 당연히 좋은 이름이 아니며, 더 이해하기 쉬운 것으로 대체되어야합니다. 이 특별한 경우 check 메소드를 "checker"객체의 일부로 만들 수 있습니다.

"something == true"및 "something == false"를 피하고 "something"및 "! something"을 사용해야합니다. 이 프로세스는 부울 메서드에 "open()"및 "empty()"대신 "isOpen()", "isEmpty()"와 같은 적절한 이름을 지정하는 경우 도움이됩니다. "checker.isOpen() & &! checker.isEmpty()"는 읽기가 완벽합니다.

+1

답변은 Bozho가 "코딩 표준"요청에 따라 출처와 다음 골짜기를 인용했기 때문에 동일합니다. – Frankie

11

foo==false 더 나은 아마도 !foo

작성해야합니다, 당신은 별도의 방법의 경우이 큰 이동할 수 있습니다 if (checker.complexConditionMet()) 또는 if (complexConditionMet(checker))을. 가독성이 향상됩니다.

+0

@Bozho가 동의 했음에도 불구하고, 여기서 나의 문제점은 여러 개의 'OR'의 길고 긴 줄을 사용하는 것입니다. – Frankie

+4

'!'때문에 명확성을 위해'! foo'보다'foo == false'를 선호합니다. 쉽게 간과 될 수 있습니다. 그것은 모두 (개인적인) 취향의 문제입니다. –

+1

그래, 나는 그것을 요약 한 것 같아요. 코드를 별도의 메서드로 푸시하고 거기에 정크를 드롭하면 좋은 생각입니다. – Frankie

4

checker.this()==false은 내가 이런 일을위한 코딩 표준에 들어 본 적이없는 !checker.this()

3

교체 할 수 있습니다. 개인적으로, 나는 가독성을 고려하여 여러 개의 그룹을 if 그룹으로 묶을 것이다. 당신은 그것을 대체 할 수

if (this || that || what || where || why || cool || wow){ ... } 

: 예를 들어 당신은 같은이있는 경우

if (pronouns() || questions() || exclamations()){ ... } 
2

내가 한 점검의 사이에 공통의 의미를 발견하려고 노력하고, 그들로부터 함수를 만들 것입니다.

특정 이산 상태, 의미있는 상태 또는 요구 사항을 설명하기 위해 번들로 제공되는 경우 코드가 덜 마술적이고 읽기 쉽고 테스트하기 쉽습니다.

if (a == "world" || b == "dolly" || c == 42 || murder()) { 

} 

더 이런 식으로 뭔가로 변경하여 가독성을 렌더링 할 수있는 약간의 "마법"입니다 같은

즉 뭔가 :

if (canSayHello() || canMeanLife()) { 

} 
... 

boolean canSayHello() { 
    return a == "world" || b == "dolly" 
} 

boolean canMeanLife() { 
    return c == 42 || murder(); 
} 
+0

물론 Bozho의 답처럼 - 목록을 합리적인 수준으로 축소하지 않으면 모든 것을 기능으로 만드십시오. –