一個函數應該只有一個return語句嗎?

該問題及其答案被鎖定,由於該問題是題外話,但具備歷史意義。 它目前不接受新的答案或互動。 瞭解更多 。
是否有充分的理由說明爲何在函數中僅包含一個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(並usingC#中的代碼塊),而且該參數不適用-在這些語言中,須要集中手動分配資源很是罕見。

在某些狀況下,單項退貨更具可讀性,而在某些狀況下則否則。 看看它是否減小了代碼行數,使邏輯更清晰或減小了花括號,縮進或臨時變量的數量。

所以,請使用盡量多的適合您的藝術敏感性的退貨,由於這是一種佈局和可讀性問題,而不是技術性問題。

相關文章
相關標籤/搜索