2009-04-14 56 views
8

我個人有以下代碼沒有問題單個if語句中謂詞的正確平衡在哪裏?

if (Object foo != null && !String.IsNullOrEmpty(foo["bar"])) 
{ 
    // do something 
} 

因爲我認爲以下是太冗長

if (Object foo != null) 
{ 
    if (!String.IsNullOrEmpty(foo["bar"])) 
    { 
     // do something 
    } 
} 

但我不會,到目前爲止這個角度來看去,如果說有5個謂語而且我不得不在編輯器中包裝文本以便一次查看它們,是否有一條邏輯「線」可以表示您將單個if語句中包含的謂詞包含在多少個謂詞中,類似於說方法不應該要求超過7個參數

+0

永遠不要說永遠。你有沒有在printf函數族中使用超過7個參數? – Les 2009-04-14 11:58:21

回答

10

我不認爲重寫if語句是兩種方式,特別是如果您考慮在示例中添加else子句會給出不同的結果。如果我想減少狀態原子命題的號碼,我會因素一些有意義起來自己的功能,如:

if(won_jackpot(obj)) ... 
3

不是謂詞的數量,而是複雜性計數。只要你能夠以最小的努力理解代碼的功能,它對我來說就好了。

爲了補充說明,我不會更改爲多個if,但是我會爲謂詞添加一個函數。特別是如果在幾個地方使用相同數量的謂詞。

1

我不認爲有任何的規則,但是:

  1. 是它非常複雜,當你把它展示給別人,他們努力去理解它?
  2. 是否需要覆蓋多行?
  3. 您是否在多個'if'子句中重複檢查條件?這將指向需要重構成某種方法

如果上述任何適用,我會重做它。

9

我認爲這是不同類型運營商和正確格式的平衡。如果所有的運營商都是一樣的(全「和」或全部「或」),那麼你或許可以串聯在一起,表達數量不確定的不失理解:

if (something() && 
    something_else() && 
    so_on() && 
    so_forth() && 
    some_more_stuff() && 
    yada() && 
    yada() && 
    yada() && 
    newman() && 
    soup_nazi() && 
    etc()) 
    ... 
3

這取決於你在做什麼。第二條語句在您反轉時會產生不同的結果。 (在它前面添加一個「不」),並且是一個非常常見的錯誤來源。

我已經看到了大約20個謂詞的代碼,它的作品(或者至少,效果不錯!) 我使用的經驗法則,如果它看起來像狗晚餐,我認爲是重構。

4

我不相信有一個神奇的數字。如果所有的謂詞都有意義,那麼我會把它們放在一起。這可能涉及將if語句分成兩行,但我通常不會引入多餘的if語句。但如果時間特別長,你應該問自己,所有的陳述是否真的有必要。也許你可以先過濾一些值或類似的東西。最大的問題是可讀性。如果別人難以理解,則需要重構代碼。但是將代碼分成兩個不同的if語句很少使代碼更具可讀性,它只佔用更多的行。

5

短期記憶容量有七項,分爲兩項。這意味着涉及五個以上不同對象的表達可能需要一個人暫停並考慮它。

1

這與條件的一長串問題是沒有這麼多的可讀性損失,但可測性損失。特別是在處理不好的方法爭論時,有時候更容易要求原諒而不是允許(例如參見this question的回答)。這樣你就可以保持代碼的清潔和可測試性,並且修復調用者或讓他們處理由此產生的異常。

0

這一切都取決於需要做什麼。但是你可能想看看,這將使某些算法更簡潔的一件事是switch語句:

switch (myVal) 
{ 
    case "isThis": 
    case "isThat": 
    case "something else": 
     doThis(); 
     break; 
    case "another": 
    case "yet another": 
    case "even another": 
     doThat(); 
     break; 
    case "another one": 
    case "more more": 
     doThisAgain(); 
     break; 
}

否則會一直在,如果else語句相當冗長。一些代碼需要大量的if和else語句,一些代碼可以被壓縮,等等。只要不犧牲代碼執行的質量,就可以使代碼的可用性更高。

0

哪種方式更好?都不是。兩者的語義不同。

我同意雖然分裂使調試容易,但這樣做的條件斷點:)

如果它是一個簡單的組合「AND的或」 Or的,這比3周的測試時間越長,重構它。