문제

나는 프로그래밍을 처음 접했으며 제어 구조 로직을 주문할 수있는 올바른 방법이 있는지 궁금합니다.

가장 가능성이 가장 높은 경우를 확인하는 것이 더 자연스럽게 보이지만, 일부 제어 구조가 잘못된 모든 것을 확인하지 않으면 어떤 제어 구조가 작동하지 않으면 (논리적 공제?)

이 '부정적인'견해에 적응하기가 어려울 것입니다. 나는 모든 것이 사실이라고 가정하면 더 긍정적 인 전망을 선호합니다 :)

도움이 되었습니까?

해결책

대부분의 상황에서 가독성은 실행 속도보다 중요합니다. 따라서 다음과 같은 접근 방식을 사용하여 이해의 용이성을 최적화하려고합니다.

모든 "어설 션"수표는 앞쪽으로 완료됩니다. 이는 모든 잘못된 사례가 처음에 처리되도록 보장합니다. 이것은 Null-Pointer-Checks에 특히 중요합니다

    if(arg == null){ 
      throw new IllegalArgumentException();  // harsh (correct)
    }
    // or 
    if(arg == null){
        arg = "";  // forgiving (lazy)
    }

다음으로, 각 IF 진술에서 1 조건 만 확인하려고합니다. 대신에

    if(condition1 && condition2) {
        ...
    } else {
        ...
    }

나는 일반적으로 선호합니다

    if(condition1) {
        if(condition2) {
            ...
        } else {
            ...
        }
    } else {
        ...
    }

이 접근법은 중단 점을 설정하기가 더 쉬우 며 논리를 더욱 분명하게 만듭니다.

나는 부정을 피합니다. 대신에

    if(! condition) {
        ...a...
    } else {
        ...b...
    }

상황이 더 나은 재배치됩니다

    if(condition) {
        ...b...
    } else {
        ...a...
    }

마지막으로 부울 결과를 반환하는 모든 방법은 결과의 의미를 나타내는 "긍정적 인"이름이 있어야합니다.

    boolean checkSomething(Something x){ ... }     // bad -- whats the result?
    boolean isSomethingInvalid(Something x){ ... } // better, but ...
    boolean isSomethingValid(Something x){ ... }   // best, no "mental negation"

다른 팁

McConnell 의이 주제에 대한 훌륭한 토론이 있습니다. 코드 완료. 내가 강력히 추천하는 책입니다. 어쨌든 관련 토론은 첫 번째 판 또는 PG의 706-708 페이지에 있습니다. 두 번째 판의 749-750 (감사합니다. 그 책에서 :

가장 빠르고 가장 사실 일 가능성이 높은 테스트가 먼저 수행되도록 테스트를 정렬하십시오. 정상적인 경우를 삭제하기가 쉽고 비효율이있는 경우 예외를 처리하는 데 있어야합니다.

조건 명령문의 가치 외에 고려해야 할 사항이 있습니다. 예를 들어, 코드 블록의 크기가 크게 다르면 더 쉽게 볼 수 있도록 작은 블록을 먼저 놓을 수 있습니다. (더 큰 블록이 실제로 크면 리팩토링되거나 별도의 방법으로 꺼내야 할 수도 있습니다.)

if( condition is true ) {
    do something small;
} else { 
    do something;
    and something else; 
    . . .
    and the 20th something;
}

조건 내에, 예, 한 부분이 거짓이되면 표현식을 평가하는 것을 중단하는 언어가 있습니다. 코드에 어떤 종류의 IS 정의 논리를 포함하는 경우 기억하는 것이 중요합니다. 언어가 전체 표현식을 평가하면 다음을 수행해야합니다.

if( variable is defined ) {
    if( variable == value ) {
        ...
    }
}

이것보다는 :

if( (variable is defined) && (variable == value) ) {
     ...
}

나는 당신의 조건을 설계하는 "올바른"방법이 있다고 생각하지 않습니다. 코딩 표준이있는 회사에서 일하는 경우 표준에 포함되어 있는지 확인해야합니다. (마지막으로 일한 장소에는 합리적인 표준이 정의되었지만 조건부 논리를 작성하는 방법을 명시하지 않았습니다.)

일반적으로 예상치 못한 항목을 먼저 확인하여 프로그램의 탁월한 흐름을 처리해야합니다.

그렇게하면 일반 프로그램 흐름에 대해 "설정"을 시작하기 전에 예외/abort 작업을 던질 수 있습니다.

나는 독자가 취해야 할 정보의 양을 최소화하기 위해 내 조건을 구성하는 것을 목표로합니다. 때로는 긍정적 인 것을 증명하기 위해 부정적인 것을 테스트하는 것이 더 쉽습니다.

예 - 2 일의 기간이 2 일의 다른 기간과 교차하는지 확인하는 테스트 2 기간의 교차로가없는 테스트로 작성하기가 더 쉽습니다.

간단한 예 또는 오류 질문이라면 일반적으로 오류 처리 브랜치가 다른 조항이되도록 사물을 구성합니다. 그것이 예 또는 아니오 의문이라면 (즉, 분기도 오류가 아닙니다), 그것은 순전히 더 자연스러운 느낌에 대한 판단의 요구입니다. 코드의 핵심이 실행되기 전에 이루어져야 할 테스트가 많이 있다면, 보통 부정적인 테스트가 먼저 나오고 어떻게 든 다음 코드를 건너도록합니다 (함수에서 돌아 오거나 휴식을 취하거나 계속합니다. 루프).

하나 또는. 나는 일반적으로 '부정적인'접근법을 사용합니다.

if (! 뭔가) {

}

이것은 질문의 범위를 약간 벗어나지 만 일반적으로 방법이 빠르게 실패하기를 원합니다. 이런 이유로 나는 코드의 뒷부분까지 인수를 사용하지 않더라도 메소드 맨 위에 모든 인수 검증을 수행하는 경향이 있습니다. 이로 인해 가독성이 아프지 만 메소드가 실제로 긴 경우에만 화면에서 스크롤하여 볼 수 있습니다). 물론, 그것은 그 자체로 코드 냄새이며 리팩토링되는 경향이 있습니다.

반면에, 수표가 간단하지 않고 어쨌든 확인할 다른 방법으로 전달하면 현재 방법을 확인하기 위해 코드를 반복하지 않습니다. 대부분의 것들과 마찬가지로 균형이 있습니다.

(문맥 : Java)

readability1 : 더 작은 코드 블록으로 해결되는 조건이 먼저 진행됩니다.

if (condition) {
  smallBlock();
} else {
  bigBlockStart();
  ........
  bigBlockEnd();
}

readability2 : 긍정적 인 주장은 먼저 진행됩니다.

이해 : Assert.blaba ()를 사용하여 메소드에 대한 모든 사전 조건을 주장하고 방법이하는 일에 대해서만 조건부를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top