5

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

以这个功能为例;

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

4

5 回答 5

5

是否有任何理由不是一个优先于另一个的问题?

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

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

不,通常情况并非如此。

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

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

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

如今,众所周知,降低循环复杂度更为重要,这通常是提早返回的情况。但是,对此持保留态度,并不是说如果您早点返回,情况就会自然而然。


当您谈论代码时,第一个示例应该在我看来:

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
        ; 
}

但这也会与您的示例背道而驰。

于 2012-10-07T11:34:52.060 回答
2

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

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

于 2012-10-07T11:27:55.467 回答
0

这些天的编译器足够聪明,可以以有效的方式编译这种代码,并且可能这两个都转换为相同的指令集,我个人认为更容易理解,因为返回是在末尾功能。

于 2012-10-07T11:32:18.687 回答
0

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

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

于 2012-10-07T11:35:05.613 回答
0

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

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

于 2012-10-07T11:29:24.187 回答