2010-10-06 91 views
0

以下哪項是構建If統計信息嵌套的更好方法。構建「If」語句的更好方法

if (x && y) 
    doXY(); 
else if (x) 
    doX(); 
else if (y) 
    doY(); 

(OR)

if(x) 
    if(y) 
    doXY(); 
    else 
    doX();  
else if(Y) 
    doY(); 
+0

這真的取決於形勢(即其中之一,而閱讀似乎更自然)。 – strager 2010-10-06 15:37:44

+0

does doXY()碰巧讀{doX(); doY()}?如果是這樣,你只需要兩種情況... – atk 2010-10-06 15:59:47

+0

@atk:不,他們處理完全不同的功能。 – rkg 2010-10-06 16:04:16

回答

2

可讀性,聰明的我肯定會用第一個選項去。

但是,如果這是執行數百萬次的某種邏輯的一部分,並且您知道x & y爲真的概率分佈與僅x爲真或僅y爲真的概率分佈有利於後者之一,爲了表現,您可能想犧牲可讀性。然而,確保你跳到這樣的優化之前,你的配置文件,並確保你記錄這樣的if語句的結構化的原因,所以其他開發人員不會只是進來你贊成通過重構你的代碼。

5

第一少嵌套所以ID說。

在第二個例子中,你正在評估它的「x」是否爲真,然後進入該塊並評估「y」是否爲真,它通常是儘可能少嵌套代碼的良好實踐。

if (x && y) 
{ 
    // doXY 
} 
else if (x) 
{ 
    // doX 
} 
else 
{ 
    // doY 
} 
+3

其他應該是/ /做特殊的事情。應該還有第三個如果捕獲(y) – Woot4Moo 2010-10-06 15:48:34

+0

真的,我只是懶惰! – kyndigs 2010-10-07 08:23:59

1

我第一個想到的是可讀性以及以及結構性

0

我喜歡把代碼行的維護成本的更好。更少的生產線=更低的成本。在你的情況下,第一個代碼塊是一行較短,所以我投票。

一般情況下,這當然取決於聲明的上下文。

看看這個Wiki頁面上SLOC

2

另一種可能性:

if (x && y) 
    doXY(); 
if (x && !y) 
    doX(); 
if (!x && y) 
    doY(); 

這是 - 我聲明瞭前面 - 效率較低,但這種微小的程度,它會未落關係。從可讀性和可維護性的角度來看,在某些情況下可能會更好,因爲沒有任何條款依賴於其他條款,也沒有要求按照指定的順序執行條款。如果需要,每個單獨的子句可以被提取到它自己的方法中。

+0

第二和第三條if語句中的冗餘檢查。如果它被重寫爲:if(x)doX()AND if(y)doY()。它可以獲得相同的結果,而不需要進行冗餘檢查。 – Woot4Moo 2010-10-06 15:47:39

+1

@ Woot4Moo:我討厭將邏輯運算符用作「if」語句。我覺得很多人都有這種感覺。 – 2010-10-06 15:58:53

0

DoXY中的操作是否與Actions DoX()和DoY()相互排斥?即:你能重新工作的行動像這樣的工作:

if (x) { DoX(); } 
if (y) { DoY(); } 
if (X && y) { DoXY(); } 

也許甚至是)Paramters以強力黴素(

if (X || y) { DoXY(x,y); } 

但我可能會與你的選擇爲第一個去可讀性...

1

你也可以做到以下幾點:

switch (x + (y<<1)) 
{ 
    case 1: doX(); break; 
    case 2: doY(); break; 
    case 3: doXY(); break; 
} 

Discla imer:請注意,這不是更快,更好的可讀性,只是一種替代方案,在極少數情況下這可能是一個可接受的解決方案。

+0

這是一個甜蜜的黑客。 – rkg 2010-10-06 16:06:20

+0

聰明的最高分,可讀性最低的分數 – 2010-10-06 16:08:12

2

1.)正如kyndigs所說,少嵌套是一個好習慣。

2.)另一個好的建議是用括號{ }包圍運算符塊,不管是否只有一個被調用的方法或更多。

3.)總是儘量簡化你的「if」語句。我的意思是if (isTrue)優於if (!(!isNotFalse))

我會寫上面的代碼中這樣說:

if (x && y) { 
    doXY(); 
} 
else if (x) { 
    doX(); 
} 
else if (y) { 
    doY(); 
}