2009-05-19 46 views
5

重複:Should a function have only one return statement?更好的Java方法語法?回來早還是晚?

很多時候,你可能有一個檢查許多條件,並返回一個狀態的方法(可以說布爾現在)。它是更好地定義的標記,這些方法中設置,並在年底返回它:

boolean validate(DomainObject o) { 
    boolean valid = false; 
    if (o.property == x) { 
    valid = true; 
    } else if (o.property2 == y) { 
    valid = true; 
    } ... 
    return valid; 
} 

或者是更好/更正確只返回一旦你知道了方法的結果?

boolean validate(DomainObject o) { 

    if (o.property == x) { 
    return true; 
    } else if (o.property2 == y) { 
    return true; 
    } ... 
    return false; 
} 

現在很明顯,有可能是try/catch塊和所有其他種類的條件,但我認爲這個概念是明確的。意見?

+0

只有一個屬性必須是有效的整個事情纔有效? – 2009-05-19 18:58:08

+0

duplicate http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement – 2009-05-19 18:59:43

+0

另一個鏈接http://stackoverflow.com/questions/124122/single-return-or- multiple-return-statements-closed – 2009-05-19 19:00:23

回答

7

如果這是一種方法,你會打電話幾千次,然後提前回報更好地實現[稍微]提高的性能。

如果不是,那麼我寧願遲到,因爲它提高了可讀性。

記住程序員通常會花費更多的時間閱讀而不是編寫代碼,所以您可以做的任何事情來提高可讀性都將受到歡迎。

1

對我來說,這是那些沒有正確答案的宗教戰爭話題之一。反對早退的論點本質上歸結爲一個事實,即一個函數可以退出的唯一一點減少了通過代碼的可能路徑的數量,因此理論上至少減少了錯誤的可能性。我的個人風格是,在早期返回時有意義的情況下,以及在限制爲一個返回語句的情況下,我會這樣做。

0

個人而言,我更喜歡第二種方法。這對我來說很簡單明瞭,但我確實知道有一些人在一個功能中必須只有一個回報。

5

與大多數編碼風格一樣,這確實是一個優先選擇的問題,但很多人認爲guard clauses是最佳做法。

1

如果異常不是圖片的一部分,我寧願立即返回。

它可能很容易管理標誌變量,我反對標誌變量。不返回也可能使維護者認爲可能會做更多的工作(如果方法很長)。

0

老實說,我認爲這取決於情況。就我個人而言,我使用這兩種方法,而且我決定根據哪一種方法使代碼更清晰易讀。

如果你已經嚴重嵌套的if語句(或任何其他控制結構),它可能會比較混亂,然後我將返回語句中

不要太擔心什麼是「最佳實踐」在這情況,因爲更重要的是代碼清晰易懂。使用感覺正確的情況。

8

我寧願早點回來,避免深層嵌套。這是,特別是在方法開始的時候是正確的:測試任何簡單的事情,如果真的可以提前做出來(或拋出異常)。

如果在方法的中間是正確的,那更多的是判斷。

注意,我會重構你的榜樣馬上使用單一if

boolean validate(DomainObject o) {  
    if (o.property == x || o.property2 == y) { 
    return true; 
    } ... 
    return false; 
} 

我知道這只是一個玩具的例子,但我的觀點是,它總是值得尋找更多的途徑來簡化你的代碼:)

0

對於這種情況,我更喜歡:

boolean validate (DomainObject o) { 
    if (o.property == x || 
     o.property2 == y || 
     ...) { 
      return true; 
    } else { 
      return false; 
} 

總的來說,我喜歡用提前返回處理錯誤情況,並返回最後返回計算結果。

0

有兩個因素互相拉扯。

第一個因素是易於調試。如果你立即返回(如你的第二個代碼片段所示),有時很難調試一個大函數,因爲很難找到這些返回語句,特別是如果它們被錯誤地放在那裏。

第二個因素是易於實施。如果您在函數的開頭檢查參數的基本正確性,並且在函數完成之前有一段很長的代碼,則可能必須將整個代碼置於條件循環中。如果你不這樣做,在某些時候這個論點可能會被用來進行長時間的計算,浪費時間,因爲它最終會被拒絕。

所以,答案可能是這樣的:

If the function is small, 
     save the return status in a variable and return at the end. 
else 
     return immediately. 
4

唯一的一次,我會說你絕對不應該提前返回是,如果你不能很容易地看到在一個屏幕內的每個回報(不管標準可能適用於工作在相同代碼基礎上的人員),您至少應該添加註釋,指出如果提前返回,函數可以提前返回。

唯一的一次,我會說你一定要返回早期是如果你的代碼看起來像......

boolean valid = true; 
if(condition1) { 
    valid = false; 
} 
if(valid) { 
    ... 
    if(condition2) { 
     valid = false; 
    } 
} 
if(valid) { 
    ... 
    if(condition3) { 
     valid = false; 
    } 
} 
... (etc) 

如果你發現自己在這兩種情況下,但是......你也許應該重構功能。