一个函数应该只有一个return语句吗?

﹥>﹥吖頭↗ 提交于 2019-12-19 20:29:20

【推荐】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年前,我的一位同事因采用今天称为敏捷开发策略的工作而被解雇。 他有一个细致的增量计划。 但是他的经理对他大吼:“您不能向用户逐步发布功能!您必须坚持瀑布式设计 。” 他对经理的回应是,渐进式开发将更精确地满足客户的需求。 他相信要开发满足客户需求的产品,但经理相信要按照“客户要求”进行编码。

我们经常因违反数据规范化, MVPMVC界限而感到内gui。 我们内联而不是构造一个函数。 我们采取捷径。

我个人认为PHP是不好的做法,但是我知道什么。 所有理论上的争论归结为试图满足一套规则

质量=精度,可维护性和盈利能力。

所有其他规则逐渐淡出背景。 当然,这条规则永远不会消失:

懒惰是优秀程序员的美德。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!