깊은 들여 쓰기를 방지하는 방법? [닫은]

코드에서 들여 쓰기를 방지하기 위해 어떤 단계와 조치를 취할 수 있습니까?



답변

프로그램의 모든 함수 / 메소드가 단 하나만 수행하면 깊은 들여 쓰기는 일반적으로 문제가되지 않습니다. 경우에 따라 조건을 몇 단계 깊게 중첩해야 할 수도 있지만 12 년 이상 코딩하면 들여 쓰기가 많은 코드를 몇 번만 작성했다고 정직하게 말할 수 있습니다.


답변

가장 좋은 방법은 추출 방법입니다.

int Step1(int state)
{
    if (state == 100)
    {
        return Step2(state);
    }
    else
    {
        return Step3(state);
    }
}

int Step2(int state)
{
    if (state != 100)
    {
        throw new InvalidStateException(2, state);
    }

    // ....
}

답변

가드 조항을 고려할 수 있습니까?

대신에

public void DoSomething(int value){
    if (someCondition){
           if(someOtherCondition){
                if(yetAnotherCondition){
                       //Finally execute some code
                }
           }
    }
}

하다

public void DoSomething(int value){
    if(!(someCondition && someOtherCondition && yetAnotherCondition)){
        return;
        //Maybe throw exception if all preconditions must be true
    }
    //All preconditions are safe execute code
}

기회가된다면 Steve McConnell의 Code Complete를 읽어보십시오. 그는이 주제들에 대해 많은 조언을 받았습니다.

http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6

“guard 조항”에 대한 자세한 내용은 https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses를 참조하십시오.


답변

ifs를 뒤집습니다 .

대신에:

if (foo != null)
{
    something;
    something;
    if (x)
    {
       something;
    }
    something;
}
else
{
    boohoo;
}

나는 쓸 것이다 :

if (foo == null)
{
    boohoo;
    return;
}
something;
something;
if (x)
{
   something;
}
something;

동일하게 적용 ifelse블록. 경우 else적은 중첩 / 짧은, 다음을 되돌립니다.

한 곳에서 매개 변수 값 확인

분석법을 입력하자마자 모든 매개 변수에 잘못된 값이 있는지 확인한 다음 안전하다는 것을 계속 확인하십시오. 더 읽기 쉬운 코드를 만들지 만 나중에 조건부 블록을 쌓고 이러한 검사를 서브 루틴 전체에 분산시키는 것도 절약합니다.


답변

일반적으로 깊이 들여 쓰기 된 코드는 일반적으로 문제가있는 코드라는 것을 알았습니다. 이 문제가 발생하면 뒤로 물러서서 함수가 너무 많은 일을하고 있는지 평가하십시오.

동시에, 당신의 질문에 대답하기 위해, 들여 쓰기가 깊은 곳에서 필요하다면, 당신이 그것을 거기에 두도록 제안 할 것입니다. 그러한 코드에서 들여 쓰기는 매우 긴 코드 일 가능성이 있기 때문에 간단한 이유입니다.


답변

중첩 된 구성 요소 (특히 반복되는 구성 요소)를 별도의 함수로 분리하거나 (언어가 클로저를 지원하는 경우 더 쉽습니다) 일련의 중첩 된 루프를 재귀로 대체합니다.

또한 4 개 대신 2 개의 공백을 들여 쓰기하십시오.


답변

깊은 들여 쓰기를 제거해야 할 범주 적 문제로 보지 않습니다 (리팩토링이 모든 것에 대한 진정한 답이라고 생각하지도 않습니다).

일반적으로 중첩 된 if 대신 논리 문을 작성하고 싶습니다.

if (foo && bar && baz)

오히려

if foo
 if bar
   if baz