5
Switch(some case) {
    case 1:
           // compute something ...
           return something;
           break;
    case 2:
           // compute something ...
           return something;
           break;

/* some more cases ... */

    case X:
           // compute something ...
           return something;
           break;
    default:
           // do something
           return something;
           break;
}

在我看来:

假设这个 switch 语句是合理的,return 和 break 看起来不正确或感觉不正确。

中断显然是多余的,但遗漏是糟糕的风格(还是这种糟糕的风格开始?)?


我个人不这样做,但是代码库中有一些在工作。不,我不会自以为是并纠正代码库。

4

10 回答 10

21

不,遗漏不是糟糕的风格 -包含是糟糕的风格。这些是无法到达的陈述。摆脱他们。

我喜欢 case 直接返回而不是设置局部变量然后只在底部返回的事实——这意味着当您阅读代码时它非常清楚它只需要返回,仅此而已。

首先在切换方面的旁注:

至于在这里使用switch语句是否正确,这真的取决于其他事情。改用多态类型有意义吗?如果您使用 Java,您可以使用智能枚举吗?(您可以在 C# 中模仿这些,但没有那么多支持。)

我想说这至少应该提示考虑不同的设计——但这很可能是做你想做的最简单的方法。

于 2009-03-27T16:00:04.433 回答
11

如果您这样做,C# 编译器会发出警告,说明中断是无法访问的代码。所以在我的书中,既有返回又有休息是不好的形式。

于 2009-03-27T16:01:44.773 回答
5

在我看来,我会省略“break”关键字。我个人认为这有助于提醒人们‘执行已经结束!这里没什么可看的了!'。

于 2009-03-27T15:59:40.597 回答
5

我会做一个小改动:

switch(some case) {
    case 1:
           // compute something ...
           break;
    case 2:
           // compute something ...
           break;
/* some more cases ... */
    case X:
           // compute something ...
           break;
    default:
           // do something
           break;
}
return something;
于 2009-03-27T15:59:59.287 回答
1

我不确定该代码的字面意思如何,因此其中一些观察结果可能不适用...

“案例 1” 如果你真的像这样对数字进行硬编码,我认为它的风格很差,你应该考虑使用枚举。

如果您只是简单地返回一些东西并且在一部分案例中没有额外的逻辑,您可以考虑将“一些东西”放在一个数组或字典中,并简单地通过它们的索引而不是使用 switch 语句来寻址它们......

返回一些东西[索引]

于 2009-03-27T16:03:17.233 回答
0

代码异味意味着设计问题。这只是格式问题。我想大多数人都会同意省略断点的版本更好。

于 2009-03-27T16:01:31.297 回答
0

休息是多余的。

一些经验法则,只在一个地方退出一个函数总是好的,但是自从这个规则被制定后,Try-Catch 被发明了(oop goto)。

如果您在整个应用程序中保持相同的样式,我想您可以接受 switch 中的返回。

于 2009-03-27T16:02:13.417 回答
0

这里的代码气味是 case 语句中的硬编码值。

至于回报,更多的是品味和判断力的问题。当然,如果您的案例跨越多个页面,那么如果退货在案例中,则更容易阅读,但问题是开始时的大开关。

我个人更喜欢单一返回选项,因为如果您需要添加更多处理,那么重构比访问所有案例更便宜。此外,如果让其他人进行重构,他们不会有在每种情况下复制粘贴代码的诱惑,至少我希望如此......如果他们这样做,他们最好希望我不是进行代码审查的人(对于复制粘贴明显)。

于 2009-04-03T07:35:15.550 回答
0

Switch 语句本身就是一种代码味道。

就像 l99057j 所说的那样,如果您所做的只是将输入映射到常量值,那么这是一个适合查找结构的地方,例如用于顺序输入的数组/列表或用于稀疏输入的字典/映射,不是 switch 语句。如果您正在计算某些东西,那么该值将是您使用输入调用的委托。

于 2009-11-20T17:33:35.197 回答
0

其他人对其他方面发表了评论。至于返回后多余的中断:我会保留它们,与 { } 围绕单个语句 if 主体的推理相同:每个程序员都应该将这些刹车放在那里。最好有 100 个这样的冗余中断,而不是无意丢失一个。

于 2011-09-10T21:11:42.480 回答