PHP编码样式返回; 在开关/箱子里

opH*_*AME 52 php coding-style

我们正在尝试为我们的团队实现新的编码风格指南,当没有找到"break"时,php codeniffer会在switch case语句上打印警告:

switch ($foo) {   
    case 1:
      return 1;   
    case 2:
      return 2;   
   default:
       return 3; 
}
Run Code Online (Sandbox Code Playgroud)

有什么好的理由可以使用:

   switch ($foo) {
       case 1:
         return 1;
         break;
   }
Run Code Online (Sandbox Code Playgroud)

?? 永远不会到达休息日?

Joh*_*ter 86

break当你return从一个人那里离开时,完全有效switch.

但是它是相当常见的做法是明确的添加breaks到每case一个防御性的编程实践.

switch ($foo) {
    case 1:
        return 1;
        break;

    case 2:
        return 2;
        break;
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,如果您以后更改代码case 1并删除return语句,您可能会忘记添加一个break.

那会不小心导致程序流程掉进去case 2.

switch ($foo) {
    case 1:
        somethingDifferent();

    case 2:
        return 2;
        break;
}
Run Code Online (Sandbox Code Playgroud)

落入案例陈述有点不寻常,您应该在代码中添加注释,以表明它是有意的.

switch ($foo) {
    case 1:
        somethingDifferentAndWeWantToDoCase2AsWell();
        // fallthrough

    case 2:
        return 2;
        break;
}
Run Code Online (Sandbox Code Playgroud)

与许多防御性编程实践一样,您必须平衡代码是否膨胀 - 这可能会使代码混乱并使其可读性降低 - 是否值得.


Che*_*ass 7

如果您的“php 代码嗅探器正在打印警告”,请尝试使用另一个更好的代码嗅探器,并且不要忘记尝试使用最新的 PHP 稳定版本。当然,你可以写一个breakafter one return,但这没有意义,因为它永远不会被读取。你的代码没问题。

看这个:

$fun = function(int $argument): string {
    switch ($argument) {
        case 1:
            return "one";
        case 2:
            return "two";
        default:
            return "more than two";
    }
};
$str = $fun(4); // return "more than two"
Run Code Online (Sandbox Code Playgroud)

在我看来,这更简单更好:更少的行 => 更少的代码维护:-)


Jam*_*mes 7

要回答您的问题,没有充分的理由去做一些什么都不做的事情。这样想,在 之后的评论return而不是break说“不要忘记”将具有相同的影响 - 没有。这么说听起来很傻,对吧?

除非您需要设置一个 var 以供以后使用,否则我建议您采用的方法非常好。我在查看代码的 2 秒内就知道代码的意图。有一个break公正会造成混乱。

没有一种尺寸适合所有人。正确的方法取决于适合场景的方法。在每个变量中设置一个变量case并使用 abreak可能是正确的方法,或者也许只是 return 有意义。

 
 


对答案中其他建议的一些观察:

1) 没有breakafterreturn意味着如果以后更改代码可能会出现问题

只要有可能,代码应该是明确的,以及可读和清晰的。我们还可以通过某种方式编写代码,使将来的更改更容易。但是在像 aswitch这样简单的事情中,它应该没问题,并且不需要安全网来重构 acase以后添加或删除 areturnbreak

事实上,如果您删除了 areturn并且“没有注意到没有break”,那么这是一个糟糕的错误,并且可能在编码的任何部分发生。没有任何问题检查可以避免您这样做。并且应该非常小心地为未来的潜力编码,因为这种潜力可能永远不会发生,或者其他事情可能会发生,而你最终只会维护过时的代码多年。

同样,这也被认为是未来变化的安全网——如果你在本应该移除它的时候把它拿掉了return,但不小心留在了那个安全网里break怎么办?

即使这个 switch 语句是生死攸关的场景,真正严肃的代码,我也反对在返回后添加“毫无意义”的中断。只要确保编写代码的人都知道他们在做什么,并且代码经过足够多的人审查并经过全面测试。
如果情况如此严重,那么您将有比提议的安全网更好的额外检查来捕获草率的开发人员。

争论返回后中断会增加安全网,意味着您没有正确编码或测试。如果这是一个被认为有用的安全网,那么代码中可能存在大量潜在更严重的错误。

“防御性编程”的维基文章被链接到,但这里不相关:

防御性编程是一种防御性设计形式,旨在确保在不可预见的情况下软件的持续功能。

留下安全网break不是不可预见的情况,也不是防御性编程。这只是糟糕的编码,你不能用备份代码乱扔你的代码,以防你在改变某些东西时没有正确编码。这是一种非常糟糕的编码方法。“如果有人删除返回它不起作用”的论点,那么你也可能在 case var 中有错字,或者忘记写 case,或者......

return回报的,你不编码“防守”,以避免一回失败。这意味着 PHP 已损坏,并且您不会用安全网填充您的代码来满足这一点。这是你在更高层次上的东西。

2) breakreturn保持明确之后

但这显然是错误的。的return回报,所以破就不会发生。对我来说,这是头疼的时间,想知道我是否错过了意图 - 不是很清楚发生什么,但会有一段时间我会思考它以确保我没有错过任何东西。

虽然在同一个 中使用returnand then并不是无效或错误,但它完全没有意义,因为什么都不做。这是无意义的代码,需要查看、维护和弄清楚,因为它不合逻辑。breakcasebreak

如果显式是核心目标并且有一个breakafter a returnurks 你因为它毫无意义,那么我会说最好设置一个变量 and break,然后在断开开关后返回变量。
像@RageZ 回答/sf/answers/100623351/

 

3) 设置一个变量,switch语句完成后返回

这种方法完全没有错,但是如果没有理由将值存储在变量中(以后使用等),那么当不需要做任何其他事情时立即返回是很好的。

这表明了明确的意图 - 一旦案例匹配就返回一个值。