该问题及其答案被锁定,由于该问题是题外话,但具备历史意义。 它目前不接受新的答案或互动。 了解更多 。
是否有充分的理由说明为何在函数中仅包含一个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#中的代码块),而且该参数不适用-在这些语言中,须要集中手动分配资源很是罕见。
在某些状况下,单项退货更具可读性,而在某些状况下则否则。 看看它是否减小了代码行数,使逻辑更清晰或减小了花括号,缩进或临时变量的数量。
所以,请使用尽量多的适合您的艺术敏感性的退货,由于这是一种布局和可读性问题,而不是技术性问题。