2010-01-25 42 views
5

好 - 我有一個我與誰合作寫了財產以後這樣組合數量在這個if語句

if() 
    if() 
     if() 
     if() 
     if() 

我不喜歡這樣!

如果有十個不同的布爾標誌有多少種組合?

10個因數?

我試圖解釋爲什麼這是個壞

+0

我很感興趣的是如何重構這個代碼... – 2010-01-25 09:44:39

+0

我不明白爲什麼這很糟糕,它可能是解決他/她正在工作的問題的最佳方法。 – harryovers 2010-01-25 09:46:31

+0

無論您如何安排「if」,都會有相同數量的標誌和組合。 – Kobi 2010-01-25 09:47:48

回答

2

兩個州和10個標誌意味着2^10 = 1024

3

2在10度= 1024

我試圖解釋爲什麼這是個壞

這未必是壞。每種情況都會切斷一半的情況。如果您知道只有在第一個條件爲真時才需要做某些事情,那麼您已經丟棄了512個案例。這是檢查的重點。

但是,您可以把它改寫爲更好看,更具可讀性:每個標誌的

if(c1 && c2 && c3 && c4 && c5) 
+0

也就是說,2 ** 10或1024. – 2010-01-25 09:41:37

+0

@Ignacio:你的意思是2^10。 ;) – Bobby 2010-01-25 09:43:43

+2

@Bobby:智能程序員知道2^10等於8; P – 2010-01-25 09:44:48

1

大多數優秀的靜態代碼分析儀具有最高水平出於這個確切原因的縮進。如此高層次的嵌套處理所有邏輯情況變得非常困難。

這是檢查函數頂部的一個大塊的所有錯誤條件的典型新手錯誤?

如果是這樣,您可能希望讓代碼的作者將其更改爲if語句的序列,而不是這種嚴重嵌套的構造。

if(error1) { 
    /* report error 1 and exit */ 
} 

if(error2) { 
    /* report error 2 and exit */ 
} 

if(error3) { 
    /* report error 3 and exit */ 
} 

... 

使得它更容易對代碼進行測試,並提供有關特定錯誤,而不是一個普通的「東西的壞」的聲明定製的信息。

+0

如果存在多個返回語句,則很難重構... – cjk 2010-01-25 09:53:45

+0

@ck,如果返回語句的意圖清晰,則完全沒有,如函數中的六個返回語句。五個位於個人錯誤情況的頂部,另一個位於最下方以獲得良好結果。 但是,如果有返回語句在一個返回不同事物的函數中運行,* *肯定是一個重構的痛苦! – 2010-01-25 10:17:46

0

至多2^10 = 1024的路徑(如果條件完全獨立達到最大)

具有沿一個方法許多路徑被稱爲具有高的複雜性。這種高度複雜性會影響可維護性和可測試性。顯然,複雜的方法更容易出錯,更難以測試和維護。

複雜性不一定是一個問題:某些問題的解決方案具有無法消除的固有複雜性。換句話說,有些問題確實很難找到解決方案。在這些情況下,可以通過將較小的複雜方法拆分來降低局部複雜度(這並不會顯着降低全局複雜度)。

在其他情況下,除去額外的複雜性:找到一個簡單的解決方案(說起來容易,我知道了);-)