单个返回语句与多个? [关闭]

Posted

技术标签:

【中文标题】单个返回语句与多个? [关闭]【英文标题】:Single return statement vs multiple? [closed] 【发布时间】:2012-09-27 22:00:43 【问题描述】:

经常有人告诉我,我不应该使用多个返回点,而应该只使用一个:

以这个函数为例;

function data($item)
    switch($item)
        case 'one':
            return 1;
        case 'two':
            return 2;
        case 'three':
            return 3;
        case 'different_type':
            return 'Something Different';
        default:
            return false;
    

显然这是一种更好的写法;

function data($item)
    $value = false;
    switch($item)
        case 'one':
            $value = 1;
            break;
        case 'two':
            $value = 2;
            break;
        case 'three':
            $value = 3;
            break;
        case 'different_type':
            $value =  'Something Different';
            break;
        default:
            $value = false;
    
    return $value;

有什么理由不是偏向于一个的问题吗?

我想第二个让一些 IDE 有更好的机会来提示返回值?但是这里也存在性能问题吗?

【问题讨论】:

这个问题以前曾被问过(不幸的是,在另一个 StackExchange 站点上)。您可以在此处阅读回复:programmers.stackexchange.com/questions/118703/… 好问题,但不具建设性,因为意见会有所不同。 好的 IDE 可以毫无问题地键入多个返回语句。在性能方面,所谓的“提前返回”或“提前返回”可能会带来好处。 从理论上讲,多返回解决方案的低级指令较少(例如,没有额外的变量和赋值)。 您会经常听到,当我们谈论优化时,您首先要问的问题不是“是否更快”,而是“是否需要优化”。更好的解决方案通常不是更快。我知道 php 编译器/vm 不好,但这不是质疑声明新变量或具有多个返回的性能问题的理由。如果有区别,我不会打赌第二种解决方案会更快,这可能只是纳秒的问题。您不想针对这么小的性能提升进行优化。 【参考方案1】:

有什么理由不是偏向于另一个的问题吗?

有时,但这取决于具体的代码。

我想第二个让一些 IDE 有更好的机会来提示返回值?

不,通常情况并非如此。

但是这里也存在性能问题吗?

提前返回可以缩短代码中更长的路径,因此会有好处。

如今,一个好的编码指南通常不会严格控制这一点,在早期语言不那么灵活的时候,保持严格的方法可能是有意义的(函数的最后一行必须是单个返回命令)。

现在众所周知,减少Cyclomatic Complexity 更为重要,这通常是提早返回的情况。但是,对此持保留态度,并不是说如果您早早返回,就会自动出现这种情况。


当你谈到代码时,第一个例子应该在我眼里:

function data($item) 

    static $map = [
        'one'   => 1,
        'two'   => 2,
        'three' => 3,
        'different_type'
                => 'Something Different',
    ];

    # return @$map[$item] ?: false;
    return isset($map[$item])
        ? $map[$item] 
        : false
        ; 

但这也会与你的例子背道而驰。

【讨论】:

皱眉是我在那儿看到的静音操作员吗?!? ::拉出scream 大声笑,这确实是静音运算符,它是用来减轻开发负担的。如果您喜欢正常路径上的警告,请远离它。如果您认为isset 更好,请使用常见的isset 检查:isset($map[$item]) ? $map[$item] : false; @hakre 奇怪 .. 你使用的是静音操作符......无论如何都要 +1 来解释【参考方案2】:

这只是为了便于阅读。 IDE 会做得很好,它不会对性能造成太大影响,您应该担心它。只是具有多个返回点的代码通常更难阅读和调试。

但话又说回来,这也是一个品味问题,很大程度上取决于你的习惯。

【讨论】:

【参考方案3】:

如今的编译器足够聪明,可以以有效的方式编译这种代码,并且可能两者都转换为相同的指令集,我个人认为更容易理解,因为返回是函数结束。

【讨论】:

PHP 是一种解释型语言。 同意,但它仍然被编译成字节码,他们在这个过程中做了这些技巧。特别是在 php5 加速器中,只需缓存字节码以加快执行速度。【参考方案4】:

第一种方法不应该存在性能问题,因为一旦您的函数返回某些内容,该函数中的其余行将不再执行。它应该比其他任何东西都更具可读性。

已编辑: 事实上,从技术上讲,第二次迭代应该使用更多资源,因为它必须将值分配给变量,然后返回该变量,但这种差异简直可以忽略不计!

【讨论】:

【参考方案5】:

我更喜欢任何一天都有一个返回点的方法。这样做的原因是更容易理解代码。这可能看起来微不足道,但我相信我们都尝试过阅读别人的意大利面条代码。这使得更容易理解整个方法中发生的事情,尤其是在代码路径更难理解的更高级的情况下。我想说,多个返回点也更难调试。但是对于非常简单的方法,我觉得有两个返回点是可以的,但是对于更复杂的场景,我会尽量避免。

关于性能,我认为大多数情况下的差异很小(尽管这取决于在返回点之后必须执行多少代码)。我认为具有更好可读性的优势几乎总是超过性能方面,因为有很多其他领域可以通过比这些小的调整更大的幅度来提高性能。例如,如果在返回点之后有数据库、Web 服务或 I/O 调用,那么对性能的影响会更大。在这种情况下,“早”返回会显着提高性能,但是您始终可以确保在给定场景中永远不会进行这些调用,从而避免多个返回点。但是,如果您真的想优化低级,那么您最终会得到更多带有单个返回点的指令。但正如我所说,还有更重要的事情需要优化。

【讨论】:

以上是关于单个返回语句与多个? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL 表获取的数组中的单个 IF 语句与多个 IF 语句 [关闭]

具有多个连接的 mysqli Prepared 语句不断返回 false [关闭]

组合查询

Sass 函数返回多个字体 url [关闭]

Atitit  jdbc 处理返回多个结果集

MySQL ----- 组合查询 UNION(十五)