2010-05-26 190 views
7

我和我的同事討論了以下最佳實踐問題。
大多數函數/方法都以一些參數檢查開始。風格的if:嵌套或不嵌套

我主張以下風格,避免嵌套。

if (parameter one is ugly) return ERROR; 
if (parameter two is nonsense || it is raining) return ERROR; 
// do the useful stuff 
return result; 

他,誰來自更多的功能/邏輯編程背景,更喜歡下面的,因爲它減少了從函數退出點的數量。

if (parameter one is ok) { 
    if (parameter two is ok && the sun is shining) { 
     // do the useful stuff 
     return result 
    } 
} 
return ERROR; 

您更喜歡哪一個?爲什麼?

+3

使用警衛條款的建議。檢查Fowlers重構規則:http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html - 它將您的第二個(嵌套)轉換爲第一個(guard子句)。 – Konerak 2010-05-26 14:39:50

回答

0

第二個我通常更喜歡,除非整個函數體將包裝在if語句的X號碼。如果是這樣,我會選擇第一個選項。

5

只要樣式在代碼庫中一致,這兩種樣式中的任何一種都可以。

0

我更喜歡第一個。 5298529357級別的縮進只是在我的神經上磨礪。

此外,當您立即返回時,很明顯(參數一醜)是一個錯誤。

1

我更喜歡在函數的開始處進行所有輸入參數驗證,並且僅在那裏執行return。因此,我更喜歡大多數時候的第一種方法。如果只有一層嵌套,那麼我可能會選擇第二個選項。

12

我個人更喜歡第一種風格,因爲我覺得它提供了我們可以稱之爲「錯誤案例」和「方法邏輯」之間的邏輯分離。在該方法的開始有一個定義好的塊,用於評估和處理輸入中的任何錯誤,然後該方法的其餘部分全部關於該方法實際應該做什麼。

這是微觀層面上的某種分離問題,我想。

0

最可讀的風格是:

if (parameter one is ok) 
{ 
    if (parameter two is ok && the sun is shining) 
    { 
     // do the useful stuff 
     return result 
    } 
    else 
    { 
     // do other things 
    } 
} 
return ERROR; 

至少對我來說:)

編輯:對不起,誤解了這個問題。我投第一,不喜歡深嵌。

2

在兩次檢查的情況下,或者確實沒問題,一旦你添加更多,選項1快速變得越來越可取!

0

在我看來,它只取決於你需要的錯誤類型。
如果例如參數一是ugly但在下面的代碼中,您可以設法將其狀態更改爲pretty第二種方法更可取。
但是如果錯誤是致命並且無法處理,您應該立即返回。
這裏有第三種選擇,其中第二種樣式最適合,並且是當您想要將所有錯誤收集到一個連貫的錯誤消息。
第二種風格不應檢查有效性,而應首先檢查無效性。
至於個人喜好,我會更喜歡第一種風格。

0

我們的內部風格是爲了避免多個return分,另外還限制嵌套的量,所以我可能會結合您的前置條件完整性檢查一起做這樣的事情:

result_t result = OKAY;  

// Sanity checks 
if ((parameter_one == ugly) || (parameter_two == nonsense) || (weather == raining)) 
{ 
    result = ERROR; 
} 
else 
{ 
    // do the useful stuff 
} 

return result;