2015-01-19 5 views
1

들여 쓰기를 최소화하는 것이 좋은지에 대한 의견을 듣고 싶습니다. 들여 쓰기를 항상 최소화해야합니까?

내가 일반적으로 그것을 할 방법, 문제를 처리하는 것입니다 반면에

int foo_a() { 
    if (!check_value(x)) { 
     // error 
     return false; 
    } 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    return true; 
} 

, 나는 또한 코드를 보았다 :

int foo_b() { 
    if (!check_value(x)) { 
     // error 
     return false; 
    } else { 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     return true; 
    } 
} 

int foo_c() { 
    if (check_value(x)) { 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     return true; 
    } else { 
     // error 
     return false; 
    } 
} 

을하지만 이것은 아마도 idents 이후 contraproductive입니다 것 모든 수표가 새로운 else-branch를 만들면 매우 커집니다. 한편, 의사 결정을 위해, 예를 들어. 야채 나 고기, 내가 보통이 방법을 수행

int foo_d(FOOD food) { 
    if (food.isVegetable) { 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     return; 
    } else { 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     return; 
    } 
    // assume here is NO shared code which is always executed for both food types. 
} 

를, 그것은 다음과 같이한다 않음) (방식 foo_a처럼 그 일이 :

int foo_e(FOOD food) { 
    if (food.isVegetable) { 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     // do stuff 
     return; 
    } 

    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    // do stuff 
    return; 
} 
+0

이것은 의도적 인 것이 아니라 여러 개의 return 문, 오류 검사 및 (불필요한) else 절에 대한 것입니다. – MikeMB

+0

반환 값이 반드시 필요한 것은 아닙니다. 질문은 좋은 코딩 스타일을 위해 "else"를 사용해야하는 곳이며, 끝에 "반환 값"이있는 "if"가있는 위치 (값의 유무에 관계없이 반환)입니다. –

+0

내가 말한 것, 그것은 의도에 관한 것이 아닙니다. (그리고 나는 어디에서나 반환 값을 언급하지 않았습니다.) 그래서 제 의견으로는 질문과 제목을 다시 말해야합니다. – MikeMB

답변

1

나는 개인적으로 그들이 프로그램 흐름과 가능한 반환 값에 대한 이유를 더 어렵게하기 때문에 모두

if(flag) { 
    //long computation 
    return; 
} else { 
    //long computation 
    return; 
} 

뿐만 아니라

if(flag) { 
    //long computation 
    return; 
} 
//long computation 
return; 

이 반 패턴 있다고 생각 . 또한 리팩토링 중 또는 일반적으로 나중에 수정하는 동안 오류가 발생하기 쉽기 때문에 첫 번째 return 문을 간과 할 수 있습니다.

그런 이유로 일부 코딩 지침에서는 함수 당 하나의 return 문만 허용합니다. 이 경우 당신은 항상 ifelse을 사용해야합니다 :

개인적으로
int foo(int param) { 
    int retval = 0; 
    if (param > 0) { 
     //computation 
     retval = 5; 
    } else { 
     //computation 
     retval = -1; 
    } 
    return retval; 
} 

나는 보통 수 반환 문이 허용됩니다 두 지역 : 비정상적이거나 사소한 반환의 시작 부분에 우 (예를 들어, 매개 변수가 같이 확인 foo_a() -example) 그리고 맨 끝에 정규 반환 값이 반환됩니다. 필자의 기능에는 흔하지는 않지만 여러 "일반"종료 점이있을 수 있지만 두 영역 모두에 멀티ipe 리턴 문이있을 수 있습니다.

int foo2(int param1, int param2) { 
    if (!precondition1(param1)) return -1;//error 
    if (!precondition2(param2)) return -2;//error 
    if (param1==param2) return 0; // no error, but answer can be determined trivially  

    //computation 

    return local_variable; //return regular result 
} 

여기서 처음 두 개의 return 문은 어설 션 또는 예외 일 수 있습니다.

깃발이나 매개 변수 값 (예 : food.isVegetable)에 따라 두 가지 계산을 수행하는 경우 위의 첫 번째 예와 같이 항상 if-else와 단일 return 문을 사용합니다.

또한 의도 수준이 너무 높아지면 별도의 기능을 작성하는 것이 좋습니다. 항상 가능한 것은 아니지만 더 자주 생각할 수도 있습니다. 예 :오류가있는 입력을 검사하는 실제 함수를 래퍼 (wrapper)로 작성할 수 있습니다.

0

그것은 스타일의 문제이지만, 나는 적은 코드와 적은 들여 쓰기로 길을 선택하겠다.

함수를 추출하여 함수를 짧게 유지하면 선택한 함수를 그대로 유지해야합니다. 예 :

int foo_e(FOOD food) { 
    if (food.isVegetable) 
     return foo_vegetable(food); 

    return foo_meat(food); 
} 
+0

반면에, 코드의 가독성과 크기가 더 중요하다고 생각하거나, 실수로 인한 실수로 인해 문제가 발생하는 것을 피하려면 최악의 보안 결함? 예를 들어 우연히 "채소"가지 내부의 반환이 제거되거나 잊혀지면 "고기"가지가 실행되며 "else"가 사용 된 경우는 그렇지 않습니다. –

+0

내 경험상 가독성을 높이면 우연한 실수가 거의 발생하지 않게됩니다. 솔직히 OOP, 다형성 및 Strategy and Abstract Factory와 같은 디자인 패턴을 사용하여 이러한 if를 최소화해야합니다. –