2009-08-05 57 views
3

在這樣一種情況的變量可以有兩種不同的價值觀,你做的東西,如果它的一個,東西可依使用如果其他的,你只需要做:一般編程 - 其他否則,如果爲清楚起見

if(myVariable == FIRST_POSSIBLE_VALUE) { ... } 
else { ... } 

或會怎麼做:

if(myVariable == FIRST_POSSIBLE_VALUE) { ... } 
else if (myVariable == SECOND_POSSIBLE_VALUE) { ... } 

爲清晰起見,在這樣一種情況:讀者不一定能夠告訴他們做同樣的事情(但否則,如果確實是「不必要的」表達)? 那麼你會怎麼做? 謝謝!

編輯:實際上有很多不同的選項,像這樣:三元運算符,if-else,if-elseif,if-elseif-else,-if-else(帶有斷言),開關。每個人都有自己的位置,但很難決定。

回答

1

難道這就是assert的原因嗎?

if (condition1) { ... } 
else { assert(condition2); } 

這也可以擴展爲三態邏輯。使用assert使您的代碼易讀,易於維護和清除。這就是說,assert和評論幾乎是可以互換的。

+0

斷言在else中比使用else更好嗎? – mk12 2009-08-05 06:36:06

2

其他是默認設置。這意味着數據有很多種可能性,或者它是意想不到的數據。

我走的基本規則:如果有一個可以滿足的參數,使用else if,如果沒有,則使用else。我通常使用其他的錯誤。

0

這取決於具體情況。如果滿足某些標準,你只想採取行動,還是有一個特殊情況的一個值和另一個邏輯的任何其他值?

7

當變量沒有其他可能的狀態時(即檢查null和所有這些狀態),我總是比較喜歡其他狀態。我可以添加評論說變量是什麼,如果它不是第一個條件,但這只是在情況下,它像

if(color==red){ 
.... 
}else{ //our theme only allows for red and yellow, so the color must be yellow. 
.... 
} 

而且,這樣可以節省一些時間處理導致它不會有檢查無用的變量(OOP中,或者更糟的地方檢查變量佔用相當多的指針引用,函數調用和內存讀取)

我從來沒有這樣做

if(file.is_open==1){ 
.... 
}else if(file.is_open==0){ 
.... 

}

as is_open是一個布爾值,因爲剩下的唯一選項是0,所以當你必須重構代碼以使用is_open()時,這可以節省一點點輸入,因爲現在你只需要改變一個而不是兩個。

和'else if'語句我認爲應該將其轉換爲開關,如果有多於1個'else if',除非語言使得它不可能(例如C如何不能處理開關中的字符串)

+0

它確實沒有什麼意義的布爾變量,但想到一個整數結果代碼。您始終可以將返回值分配給本地變量以節省處理器時間。 – Scoregraphic 2009-08-05 06:03:22

1

有時else語句的條件非常明顯。例如,

if(user.IsNew) { } else { /*in this case user.IsNew != true*/ } 

但在其他一些情況下,其他情況並不明顯,最好澄清其他情況。如果添加其他可能的條件,這也是更有前途的證據。

此外,您可以在(最後)else中插入一個異常來通知有關未實現的情況。當例如後端和前端分開並有人向枚舉器添加新值時(或者在使用文本鍵時引入了新鍵),當第一次使用新值時,您將收到錯誤,這可能非常有用。如果不使用,如果你不會看到發生了什麼,並可能使調試非常困難。

if(user.SelectedStyle == Styles.Red) { 
} else if(user.SelectedStyle == Styles.Basic) { 
} else { 
throw new Exception("Not implemented"); 
} 

在上面的情況下,新的Style(例如Style.Blue)將導致您的應用程序拋出異常。

1

這的確是一個風格問題和你自己的世界觀。玻璃杯是半空半滿的,但你可以得到關於它的最深的爭論。

如果布爾測試都是相同的類型,那麼switch語句是最好的。

如果不是這樣,我建議不要做額外的測試,但要插入一條關於落入最後一條語句的操作含義的評論。見上面的Gertjan的評論。

2

我只使用if-else作爲布爾檢查,這意味着如果表達式不匹配,那麼只能有else。或者我想把所有東西都拿出來:把它想成默認。

如果你想檢查枚舉或什麼的,你應該嘗試通過switch語句來檢查,如果可能的話在你的語言。

在Java中,不可能爲字符串使用開關。所以,你可以使用這樣的事情:

if(string.equals("foo")) { 
    // first case 
} else if(string.equals("bar")) { 
    // second case 
} else { 
    throw IllegalArgumentException(" ... "); 
    // or log it 
} 

如果你不知道你的支票不能擴展,你應該如果你能提供一個默認的方式。

1

當您的輸入可以清楚地分爲不同的情況時,我覺得明確說明這些情況是什麼更好,例如,如果您希望'n'是0到100之間的數字,並且您有三種情況:

if (n >= 0 && n < 30) { 
    case1(); 
} else if (n >=30 && n < 70) { 
    case2(); 
} else if (n >=70 && n < 100) { 
    case3(); 
} 

在某些情況下,「別人的情況是良好的錯誤檢查

} else { 
    error("n should be between 0 and 100"); 
} 

如果你的數據被檢查爲早期錯誤的值,那麼有可能是別人使用的情況下,最後一種情況,爲語言提供小的性能提升就像C:

} else { // (n >= 70 && n < 100) 
    case3(); 
} 

但是這僅僅是必要的,因爲某些語言無法表達一個函數的定義域,在語言的域中可以清楚地表示,該優化器應該添加此性能優勢,爲你,讓你需要明確你的代碼,並且以後可以更容易地添加更多的案例

...當然,這是一門藝術,而不是一門科學,而且在某些情況下,你就不能按照硬遵守的規則,我經常發現自己寫的代碼,如:

if (p == NULL) { 
    doSomething(); 
} else { 
    doSomethingElse(); 
} 

...的事實理由這是非常明顯的和隱含的,如果條件是什麼其他用於。

1

else是被髮明出來的,使用起來很有道理。你在哪裏使用它應該由你試圖達到的邏輯來決定,而不是一種人爲的風格。

有人認爲這是更自我記錄在else if明確的條件;然而,這可能會導致邏輯與缺省的差距或捕獲所有條件。

此外,有人說在未來修改更容易。這個說法是鋪張的。使用設計模式和編寫模塊化代碼是未來更容易修改的內容,編寫一行不應該符合這些類型的語句。

相關問題