该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 了解更多 。
是否有充分的理由说明为什么在函数中仅包含一个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; }
(条件是精明的...)
条件越多,功能越大,则读取起来就越困难。 因此,如果您习惯了代码的味道,您就会意识到它,并希望重构代码。 两种可能的解决方案是:
- 多次退货
- 重构为单独的功能
多次退货
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); }
当然,它更长并且有点混乱,但是在以这种方式重构函数的过程中,我们已经
- 创建了许多可重用的功能,
- 使该功能更易于阅读,并且
- 函数的重点在于为什么值正确。
- *
我相信多次返回通常是好的(在我用C#编写的代码中)。 单返回样式是C的保留。但是您可能没有使用C进行编码。
在所有编程语言中,没有法律只要求一个方法的一个退出点。 有些人坚持这种风格的优越性,有时他们将其提升为“规则”或“法律”,但这种信念没有任何证据或研究的支持。
不止一种返回样式在C代码中可能是一个坏习惯,在C代码中必须显式地取消分配资源,但是Java,C#,Python或JavaScript之类的语言具有自动垃圾回收和try..finally
块等try..finally
(并using
C#中的代码块),并且该参数不适用-在这些语言中,需要集中手动分配资源非常罕见。
在某些情况下,单项退货更具可读性,而在某些情况下则不然。 看看它是否减少了代码行数,使逻辑更清晰或减少了花括号,缩进或临时变量的数量。
因此,请使用尽可能多的适合您的艺术敏感性的退货,因为这是一种布局和可读性问题,而不是技术性问题。