单一退货声明与多个?

时间:2012-10-07 11:25:51

标签: php optimization return

我经常被告知我不应该使用多个返回点,而应该只使用一个:

以此函数为例;

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更好的机会来暗示返回值?但这里也有性能问题吗?

5 个答案:

答案 0 :(得分:5)

  

是否有任何理由不是对另一方的偏好?

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

  

我想第二个给出一些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
        ; 
}

但这也会违背你的榜样。

答案 1 :(得分:2)

这只是为了可读性。 IDE会很好,它不会影响性能,你应该担心它。只是具有多个返回点的代码通常难以读取和调试。

但话说回来,这也是一种品味问题,而且很大程度上取决于你习惯的东西。

答案 2 :(得分:0)

第一种方法不应该存在性能问题,因为一旦你的函数返回一些东西,该函数中的其余行就不再执行了。它应该是可读性比什么都重要。

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

答案 3 :(得分:0)

这些天的编译器足够聪明,能够以有效的方式编译这种代码,并且可能是这两种代码转换为同一组指令的情况,我个人认为它更容易理解,因为返回是在功能结束。

答案 4 :(得分:-1)

我希望任何一天都有一个返回点的方法。原因是它更容易理解代码。这看似微不足道,但我相信我们都试过读别人的意大利面条代码。这使得更容易理解整个方法中发生的事情,特别是在更高级的情况下,代码路径可能更难以理解。我会说,多个返回点也很难调试。但是,对于非常简单的方法,我认为有两个返回点是可以的,但对于更复杂的情况,我会尽力避免它。

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