2011-11-24 45 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

大概只有通过评估一次以上的条件扁平化if S:

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); 
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; } 
} 

这,在我看来,使它比较容易跟随的场景。
但是,这仍然是非常可怕的。 你最可能想要的是某种算法模式,其中不同的行为被强制为实现相同接口的不同类,并且您将选择基于多态性的行为,或者将在对象创建期间注入算法。
基本上每个采用多个布尔参数的方法都是代码异味。

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

我被要求在最近的一次求职面试中优化这些代码。

这里的代码版本,我想出了:

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; 
} 

这里使用了老谋深算做一次且仅一次的循环,用的想法“break” -ing出来时,一些条件失败。