2011-11-24 2 views
3
boolean f(boolean A, boolean B, boolean C, boolean D, boolean E) 
{ 
    if (A) 
    { 
    k(); 
    if (B) 
    { 
     m(); 
     if (C) 
     { 
     n(); 
     if (D) 
     { 
      p(); 
      if (E) 
      { 
      q(); 
      return true; 
      } 
      else 
      { 
      r(); 
      return false; 
      } 
     } 
     else 
     { 
      s(); 
      return false; 
     } 
     } 
     else 
     { 
     t(); 
     return false; 
     } 
    } 
    else 
    { 
     v(); 
     return false; 
    } 
    } 
    else 
    { 
    w(); 
    return false; 
    } 
} 
+0

단순화 기준은 무엇입니까? 더 &&를 사용하여 ?? –

+1

어떤 방식으로 "단순화"합니까? 이것은 아마도 http://codereview.stackexchange.com –

답변

3

최근 취업 인터뷰에서이 코드를 최적화하도록 요청 받았다.

boolean f(boolean A, boolean B, boolean C, boolean D, boolean E) 
{ 
    boolean success = false; 

    // I use "==false" because it's more readable than "if !A" 
    if(A == false) 
    { 
     w(); 
    } else { 
     if(B == false) 
     { 
      v(); 
     } else { 
      m(); 
      if(C == false) 
      { 
       n(); 
       if(D == false) 
       { 
        s(); 
       } else { 
        if(E == false) 
        { 
         r(); 
        } else { 
         q(); 
         success = true; 
        } 
       } 
      } 
     } 
    } 

    // this will be "false" in all cases except one 
    return (success); 
} 

그리고 내 대답 뒤에 내 논리는 "반환"의 수를 줄이고 가독성을 유지하려고했다 :

는 여기에 내가 생각 해낸 코드의 버전입니다. 여기

는 고용 사람은 정말에 대한 답을 찾고 있었다된다

boolean f(Boolean A, Boolean B, Boolean C, Boolean D, Boolean E) 
{ 
    boolean result = false; 

    do 
    { 
     if (!A) 
     { 
      w(); 
      break; 
     } 

     k(); 
     if (!B) 
     { 
      v(); 
      break; 
     } 

     m(); 
     if (!C) 
     { 
      t(); 
      break; 
     } 

     n(); 
     if (!D) 
     { 
      s(); 
      break; 
     } 

     p(); 
     if (!E) 
     { 
      r(); 
      break; 
     } 

     // All conditions satisfied 
     result = true; 

    } while (false); 

    return result; 
} 

이 교활한 DO-번과 전용-일단의 아이디어와 루프, "break는"밖으로 -ing 때 일부를 사용 조건이 실패합니다.

3

당신이 해결하는 문제에 대한 자세한 내용을 모른 채, 나는 그것이 다소 쉽게 시나리오를 수행 할 수 있습니다, 내 의견으로는,

boolean f(boolean A, boolean B, boolean C, boolean D, boolean E) 
{ 
    if (A) k(); 
    if (A && B) m(); 
    if (A && B && C) n(); 
    if (A && B && C && D) p(); 
    if (A && B && C && D && E) { q(); return true; } 
    if (A && B && C && D && !E) { r(); return false; } 
    if (A && B && C && !D) { s(); return false; } 
    if (A && B && !C) { t(); return false; } 
    if (A && !B) { v(); return false; } 
    if (!A) { w(); return false; } 
} 

이로 다시 것입니다.
그러나 이것은 여전히 ​​절대적으로 끔찍합니다. 가장 가능성있는 것은 다른 인터페이스가 동일한 인터페이스를 구현하는 다른 클래스로 다른 동작이 적용되는 일종의 알고리즘 패턴이며, 다형성에 기반한 동작을 선택하거나 알고리즘이 객체 생성 중에 주입되는 알고리즘 패턴입니다.
기본적으로 하나 이상의 부울 인수를 사용하는 모든 메소드는 코드 냄새입니다. 메소드가 호출되는 순서는 다음,하지 않는 것이 중요 경우

if (A) k(); else w(); 
if (A && B) m(); else if(A && !B) v(); 
if (A && B && C) n(); else if (A && B && !C) t(); 
if (A && B && C && D) p(); else if (A && B && C && !D) s(); 
if (A && B && C && D && E) q(); else if (A && B && C && D && !E) r(); 

return (A && B && C && D && E); 
0

:

failedOnce = false 
for ar as Array in [ 
    (A, K, W) 
    (B, M, V) 
    (C, N, T) 
    (D, P, S) 
    (E, Q, R) 
    ]: 
    if ar[0]: 
     ar[1].Invoke() 
    else: 
     ar[2].Invoke() 
     break 
     failedOnce = false 

return not failedOnce 
+1

에 속하며 길이에 맞게 최적화됩니다. 그렇지만 읽기가 특히 쉽지는 않습니다. –

+0

'A'가'false'인데도'B'의 메서드를 호출 할 것입니다, 그렇지 않습니까? – GSerg

+0

@MK, 나는이 말을 읽기가 훨씬 쉬우 며 로직이 한 곳에 있으므로 유지 보수가 더 쉽고 함수에 조건을 연결하는 것은 배열 목록에 매우 간단하게 배열되어 있으며 후자는 가능성이 높다. – andyhasit

0

나는 단지 한 번 이상 조건을 평가하여 if의 평탄화에 의해 아마

관련 문제