纠正不一致的返回点

Rectifying inconsistent return points

提问人:Viscountess of the Junkyard 提问时间:9/26/2023 最后编辑:LazyOneViscountess of the Junkyard 更新时间:9/27/2023 访问量:56

问:

我有一个无数的行方法,别人写了我想使用 PhpStorm 重构。假设在高度缩写的形式中,它的基本结构看起来像这样:

myMethodName($input){
    if ($input === self::STRING_THAT_PROMPTS_ERROR) {
        //Branch One
        return new ErrorResponse('You messed up.');
    } elseif ($input === self::HAPPY_STRING_ONE) {\
        //Branch Two
        if(!$someOtherThing) {
            return new HappyResponse('Some other thing made us happy-happy.');
        }
        //We do lots of verbose stuff here and then, finally ...
        $output = new HappyResponse('some value');
    } elseif ($input === self::HAPPY_STRING_TWO) {
        //Branch Three
        //We do lots of verbose stuff here and then, finally ...
        $output = new HappyResponse('some other value');
    } else {
        //Branch Four
        return new ErrorResponse('Oh no, default.');
    } 
    return $output;
}

如果我尝试将 Branch Two 提取到自己的方法中,PhpStorm 会正确地抱怨由于提前返回而导致返回点不一致。

所以我的问题是:我如何继续对我的第一个进行早期返回,并仍然将我的详细代码提取到它自己的方法中?我考虑过抛出并抓住一个例外以提前返回,但由于在这种情况下没有任何问题,因此抛出异常感觉像是一种非常可怕的气味。HappyResponse

有没有一种简单的方法可以使这种事情起作用?

PHP 异常 架构 重构 phpstorm

评论


答:

0赞 Barmar 9/27/2023 #1

由于整体结构是,因此您不需要在每个分支中返回。每个分支都应该分配最后返回的变量。if/else if/...$output

function myMethodName($input){
    if ($input === self::STRING_THAT_PROMPTS_ERROR) {
        //Branch One
        $output = new ErrorResponse('You messed up.');
    } elseif ($input === self::HAPPY_STRING_ONE) {\
        //Branch Two
        if(!$someOtherThing) {
            $output = new HappyResponse('Some other thing made us happy-happy.');
        } else {
            //We do lots of verbose stuff here and then, finally ...
            $output = new HappyResponse('some value');
        }
    } elseif ($input === self::HAPPY_STRING_TWO) {
        //Branch Three
        //We do lots of verbose stuff here and then, finally ...
        $output = new HappyResponse('some other value');
    } else {
        //Branch Four
        $output = new ErrorResponse('Oh no, default.');
    } 
    return $output;
}

当您将分支代码移动到其自己的函数中时,该函数可以返回该值,您将这样做$output

$output = new_function(...);