該問題及其答案被鎖定,由於該問題是題外話,但具備歷史意義。 它目前不接受新的答案或互動。 瞭解更多 。
是否有充分的理由說明爲何在函數中僅包含一個return語句是一種更好的作法?編程
仍是在邏輯上正確地從函數中返回就能夠,這意味着函數中可能有不少return語句?編程語言
這多是一個不一樣尋常的觀點,可是我認爲,任何認爲支持多個return語句的人都沒必要在僅支持4個硬件斷點的微處理器上使用調試器。 ;-)函數
儘管「箭頭代碼」問題是徹底正確的,可是在使用多個return語句時彷佛已經消失的一個問題是使用調試器的狀況。 您沒有方便的萬能位置放置斷點以確保您將看到出口以及返回條件。佈局
我強迫本身只使用一個return語句,由於它在某種意義上會產生代碼氣味。 讓我解釋:編碼
function isCorrect($param1, $param2, $param3) { $toret = false; if ($param1 != $param2) { if ($param1 == ($param3 \* 2)) { if ($param2 == ($param3 / 3)) { $toret = true; } else { $error = 'Error 3'; } } else { $error = 'Error 2'; } } else { $error = 'Error 1'; } return $toret; }
(條件是精明的...)調試
條件越多,功能越大,則讀取起來就越困難。 所以,若是您習慣了代碼的味道,您就會意識到它,並但願重構代碼。 兩種可能的解決方案是:code
屢次退貨ip
function isCorrect($param1, $param2, $param3) { if ($param1 == $param2) { $error = 'Error 1'; return false; } if ($param1 != ($param3 \* 2)) { $error = 'Error 2'; return false; } if ($param2 != ($param3 / 3)) { $error = 'Error 3'; return false; } return true; }
分開的功能資源
function isEqual($param1, $param2) { return $param1 == $param2; } function isDouble($param1, $param2) { return $param1 == ($param2 \* 2); } function isThird($param1, $param2) { return $param1 == ($param2 / 3); } function isCorrect($param1, $param2, $param3) { return !isEqual($param1, $param2) && isDouble($param1, $param3) && isThird($param2, $param3); }
固然,它更長而且有點混亂,可是在以這種方式重構函數的過程當中,咱們已經io
我相信屢次返回一般是好的(在我用C#編寫的代碼中)。 單返回樣式是C的保留。可是您可能沒有使用C進行編碼。
在全部編程語言中,沒有法律只要求一個方法的一個退出點。 有些人堅持這種風格的優越性,有時他們將其提高爲「規則」或「法律」,但這種信念沒有任何證據或研究的支持。
不止一種返回樣式在C代碼中多是一個壞習慣,在C代碼中必須顯式地取消分配資源,可是Java,C#,Python或JavaScript之類的語言具備自動垃圾回收和try..finally
塊等try..finally
(並using
C#中的代碼塊),而且該參數不適用-在這些語言中,須要集中手動分配資源很是罕見。
在某些狀況下,單項退貨更具可讀性,而在某些狀況下則否則。 看看它是否減小了代碼行數,使邏輯更清晰或減小了花括號,縮進或臨時變量的數量。
所以,請使用盡量多的適合您的藝術敏感性的退貨,由於這是一種佈局和可讀性問題,而不是技術性問題。