2010-04-07 4 views
12

여기서 x, y 등으로 언급 할 긴 문장이 있습니다. 내 조건문 '구조는 다음과 같이 진행됩니다if-else 구조

if(x || y || z || q){ 
    if(x) 
     do someth 
    else if (y) 
     do something 

    if(z) 
     do something 
    else if(q) 
     do something 
} 
else 
    do smthing 

이 일을 작성하는 더 짧은 방법이 있나요? 감사합니다

답변

1

이것은 내게 꽤 분명해 보입니다 (그리고 명확합니다).

당신이 할 수있는 일은 먼저 x, y, z 및 q를 평가하고이를 변수로 저장하여 두 번 할 필요가 없도록합니다.

+3

@Thirler 흠을 만들 수 평가. 저는 평균적으로 x, y, z, q의 균등 확률과 시간 복잡성을 가정하면 이것이 성능 향상이 될 것이라고 생각합니다. 그러나 z의 확률이 50 %이고 q의 확률이 1 %이고 처리 능력의 95 %를 차지한다면 처리량은 거의 들지 않을까요? 적절한 최적화없이 마이크로 최적화가 문제를 일으킬 수있는 방법을 확인하십시오. –

+0

예, 우리는 하나의 변수를 사용하여 해당 검사를 수행해야합니다. – Halo

+0

@Tim 성능 저하가 발생하려면 극도로 긴 조건 (수백만 번 실행되는 코드)이 필요합니다.나는 확실히 최적화하지 않고있다. (문제는 그것에 대해 이야기하지 않는다.) 유지 보수성을 향상시킬 것을 제안하고있다. 성능이 중요한 경우 계산 결과를 투명하게 버퍼링해야합니다 (결과를 저장하는 함수 뒤에 숨김). 주어진 예제는 몇 가지 조건을 두 번 실행합니다. 그러나 실행하는 데 상당한 시간이 걸릴 때까지는 전혀 최적화하지 않는 것이 좋습니다. – Thirler

1

아마도 조금 더 읽기 쉽습니다. 그러나 이제는 한 가지 추가 검사를 수행 할 것입니다. 미션 크리티컬 코드가 아닌 경우 다음을 사용할 수 있습니다.

if (x) 
    do something; 
else if (y) 
    do something; 

if (z) 
    do something; 
else if(q) 
    do something; 

if !(x || y || z || q) 
    do something completely different. 
+2

당신의 마지막 진술은 질문과 같지 않습니다. 당신이'if! (x || y || z || q)' – Thirler

+0

을 필요로하고, else를 사용하면 더 잘 읽을 것이라고 생각합니다. 너는 우리가 구멍을 남기지 않았 음을 확신한다. – Halo

+0

나는 이것이 어떻게 '하나의 추가 검사를 수행하는지'를 보지 못했다. 결국 if 문수는 같습니다. –

4

지금 쓰는 방법에 큰 문제는 없습니다. 단일 명령문 if 블록에 대해서도 중괄호를 사용하는 것이 좋습니다. 이렇게하면 나중에 코드 줄을 추가해야 할 경우에 실수를 피할 수 있습니다 (중괄호를 추가하는 것을 잊을 수도 있습니다). 나는 그것을 더 읽기 쉽다고 생각한다. 나는 다음을 추천하고 있지 않다

if (x || y || z || q) { 
    if (x) { 
     do something 
    } else if (y) { 
     do something 
    } 

    if (z) { 
     do something 
    } else if (q) { 
     do something 
    } 
} else { 
    do something 
} 
+0

+1 중괄호 사용. Java, C++ 및 다른 언어가 "이동"이 수행하는 작업을 수행하고 이러한 중괄호를 의무화하도록하면 좋겠지 만 ... 코드를 사용하면 코드를 훨씬 쉽게 읽을 수 있습니다. –

+0

예, 저는 항상 실제로 중괄호를 사용합니다. 위의 예는 프로토 타입이나 뭔가입니다. – Halo

0

, 사실, 난 당신이 괜찮 가지고 무엇을 생각하지만, : 코드는이 다음과 같을 것이다

s = true; 
if (x) { 
    do something; 
    s = false; 
} else if (y) { 
    do something; 
    s = false; 
} 
if (z) { 
    do something; 
    s = false; 
} else if (q) { 
    do something; 
    s = false; 
} 

if (s) { 
    so something; 
} 
4

복수를 피할 또 다른 변형을 검사 및 errorprone 복잡한 논리 표현식은 다음과 같을 수 있습니다.

boolean conditionhandled = false; 
if (x) { 
    do something 
    conditionhandled = true; 
} else if (y) { 
    do something 
    conditionhandled = true; 
} 

if (z) { 
    do something 
    conditionhandled = true; 
} else if (q) { 
    do something 
    conditionhandled = true; 
} 

if (!conditionhandled) { 
    do something 
} 
+1

감사합니다. 나는 conditionhandled를 false로 초기화해야한다고 생각합니다. – Halo

+0

죄송합니다! 고마워, 이걸 고쳤어. –

0

x, y, z, q에 대해 몇 가지 가정을 할 수 있습니까? e.G. 그 중 하나만 사실 일 수 있습니다. 당신이 국가

enum State { 
X{ 
    void doSomething(){ 
    doItTheXWay(); 
    } 
}, 
Y{ 
    void doSomething(){ 
    doItTheYWay(); 
    } 
}, 
Z{ 
    void doSomething(){ 
    doItTheZWay(); 
    } 
}, 
Q{ 
    void doSomething(){ 
    doItTheQWay(); 
    } 
}; 
    void doSomething(){ 

    } 
} 

로 당신의 코드에서 볼 수있는 것보다 당신이 사용하는 곳 방금 상태를 할당 할 수

문은 경우에 옳은 일

State state = getAState(); 
state.doSomething(); 

을 할 경우 열거 형을 좋아하지 않음 State는 Interface가 될 수 있고 X to Q는 클래스를 구현할 수 있습니다. 이 경우 이점은 동일한 if else 구문을 여러 번 사용하는 것입니다. 일부 codelines 나중에는

if(x) 
    do_the_next_thing_with_X(); 
... 

로 시작하는 것이 말하거나 또 다른 기능으로 열거를 확장하고 단락의 목적을 물리 칠 것이다, 하나의 호출

state.doTheNextThing();