2011-11-24 73 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出來時,一些條件失敗。