【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
是否有充分的理由说明为什么在函数中仅包含一个return语句是一种更好的做法?
还是在逻辑上正确地从函数中返回就可以,这意味着函数中可能有很多return语句?
#1楼
这可能是一个不同寻常的观点,但是我认为,任何认为支持多个return语句的人都不必在仅支持4个硬件断点的微处理器上使用调试器。 ;-)
尽管“箭头代码”问题是完全正确的,但是在使用多个return语句时似乎已经消失的一个问题是使用调试器的情况。 您没有方便的万能位置放置断点以确保您将看到出口以及返回条件。
#2楼
我强迫自己只使用一个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);
}
当然,它更长并且有点混乱,但是在以这种方式重构函数的过程中,我们已经
- 创建了许多可重用的功能,
- 使该功能更易于阅读,并且
- 函数的重点在于为什么值正确。
#3楼
我相信多次返回通常是好的(在我用C#编写的代码中)。 单返回样式是C的保留。但是您可能没有使用C进行编码。
在所有编程语言中,没有法律只要求一个方法的一个退出点 。 有些人坚持这种风格的优越性,有时他们将其提升为“规则”或“法律”,但这种信念没有任何证据或研究的支持。
不止一种返回样式在C代码中可能是一个坏习惯,在C代码中必须显式地取消分配资源,但是Java,C#,Python或JavaScript之类的语言具有自动垃圾回收和try..finally
块等try..finally
(并using
C#中的代码块),并且该参数不适用-在这些语言中,需要集中手动分配资源非常罕见。
在某些情况下,单项退货更具可读性,而在某些情况下则不然。 看看它是否减少了代码行数,使逻辑更清晰或减少了花括号,缩进或临时变量的数量。
因此,请使用尽可能多的适合您的艺术敏感性的退货,因为这是一种布局和可读性问题,而不是技术性问题。
#4楼
不,因为我们不再生活在1970年代 。 如果您的函数足够长而导致多次返回是一个问题,那就太长了。
(除了以下事实外,语言中的任何多行函数(除例外情况外)都将具有多个出口点。)
#5楼
你知道格言- 情人在旁观者眼中 。
有些人对NetBeans发誓,有些人对IntelliJ IDEA发誓,有些人对Python发誓,而有些人对PHP发誓。
如果坚持这样做,在某些商店中,您可能会失业:
public void hello()
{
if (....)
{
....
}
}
问题全在于可见性和可维护性。
我沉迷于使用布尔代数来简化和简化逻辑以及使用状态机。 但是,有些同事认为我在编码中使用“数学技术”是不合适的,因为它不可见且不可维护。 那将是一个坏习惯。 抱歉,我使用的技术对我来说是非常明显和可维护的-因为六个月后我回到代码时,我会清楚地理解代码,而不会看到一团混乱的意大利面条。
嘿哥们(就像以前的客户曾经说过的)会做您想做的事情,只要您知道如何修复它,当我需要您修复它时即可。
我记得20年前,我的一位同事因采用今天称为敏捷开发策略的工作而被解雇。 他有一个细致的增量计划。 但是他的经理对他大吼:“您不能向用户逐步发布功能!您必须坚持瀑布式设计 。” 他对经理的回应是,渐进式开发将更精确地满足客户的需求。 他相信要开发满足客户需求的产品,但经理相信要按照“客户要求”进行编码。
我们经常因违反数据规范化, MVP和MVC界限而感到内gui。 我们内联而不是构造一个函数。 我们采取捷径。
我个人认为PHP是不好的做法,但是我知道什么。 所有理论上的争论归结为试图满足一套规则
质量=精度,可维护性和盈利能力。
所有其他规则逐渐淡出背景。 当然,这条规则永远不会消失:
懒惰是优秀程序员的美德。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3145097