2012-10-10 32 views
10

對不起,如果標題模糊不清,我不知道該怎麼說。條件是否應測試正面或負面結果?

是否更好地短語一個條件,使得你不想要的結果輸入if語句,然後你退出函數,或者我應該測試我想要的結果,然後用我的代碼來跟蹤語句。

也許一些例子可以幫助:

我的意思是通過測試陰性結果:

if(myObject == null) { 
    return; 
} 

//do whatever with myObject 

我的意思是通過測試陽性結果:

if(myObject != null) { 
    //do whatever with myObject 
} 

對不起,如果有人可以說比我好,請做。

+0

如果沒有別的,這兩個語句意味着不同。如果還有別的東西,人們會期望編譯器足夠好,可以優化最快的比較。 – Eduardo

+0

這是一個很好的問題,我覺得應該有一個確定的答案。我個人認爲,閱讀和理解的積極條件會更快,但我本來期望有一個研究來明確證明這種或那種方式。 – Ken

回答

7

我個人更喜歡第一種檢查對象是否爲空然後立即返回的方法。它允許「真實代碼」保持不縮進,線性,並可以防止許多嵌套的if語句,我發現它們更具可讀性。 否則,兩種方式都是有效的,並且會有相同的結果。選擇哪種方式在你的情況下效果最好(可以依賴於其他方面或其他情況)。

這裏有一個很好的例子:

if (object1 == null) { 
    return; 
} 
// do some stuff 
if (object2 == null) { 
    return; 
} 
// do some stuff 
if (object3 == null) { 
    return; 
} 

被反對:

if (object1 != null) { 
    // do some stuff 
    if (object2 != null) { 
     // do some stuff 
     if (object3 != null) { 
      // do some stuff 
     } 
    } 
} 

我覺得第一個是更具可讀性。

+0

可讀性比編譯速度更重要嗎? 只是問?我也在這些新的 –

+1

在這種情況下,速度的改善,如果有的話,可以忽略不計。在我看來,可讀性更重要。另外,先編寫代碼,測試它,然後再進行優化。沒有一點優化已經足夠快的東西,只會讓你的代碼變得不可讀。 – monoxygen

0

如果在滿足積極條件時可以採取有效行動,例如記錄結果集爲空或未指定變量,則最好使用肯定條件。在測試字符串時,API可以在這裏提供幫助,例如Apache Commons StringUtils isNotBlank()。但是,有時最乾淨的事情是進行負面測試,例如只允許在變量非空的情況下進行處理。