这个切换声明味道不好吗?

时间:2009-03-27 15:56:40

标签: c# switch-statement

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语句是合理的,返回和中断看起来不正确或感觉正确。

休息显然是多余的,但是遗漏的风格很差(或者这种风格很差?)?


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

10 个答案:

答案 0 :(得分:21)

不,遗漏不是穷人的风格 - 包含风格很差。那些是无法达成的陈述。摆脱它们。

我喜欢这样的事实:案例直接返回而不是设置局部变量然后只返回到底部 - 这意味着当你正在阅读所做的代码时它非常清晰需要返回,就是这样。

关于首先切换的侧面说明:

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

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

答案 1 :(得分:11)

如果您这样做说C#编译器中断了无法访问的代码,则会发出警告。因此,在我的书中,返回和休息都是不好的形式。

答案 2 :(得分:5)

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

答案 3 :(得分: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;

答案 4 :(得分:1)

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

“案例1” 如果你是真正的硬编码这样的人,我认为这是一种糟糕的风格,你应该考虑使用枚举。

如果您只是返回一些内容并且在一部分案例中没有其他逻辑,您可以考虑将“somethings”放在数组或字典中,并简单地通过索引来解决它们而不是使用switch语句。

返回某事[index]

答案 5 :(得分:0)

代码气味意味着设计问题。这只是格式化问题。我想大多数人会同意省略休息的版本是优越的。

答案 6 :(得分:0)

休息是多余的。

一些经验法则,仅在一个地方退出一个函数总是好的,但是由于这个规则被发明了,所以发明了Try-Catch(oop goto)。

如果你在整个应用程序中保持相同的风格,我想你可以接受交换机中的返回。

答案 7 :(得分:0)

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

至于回报,更多的是品味和良好的判断力。当然,如果您的案例跨越多个页面,如果返回的话更容易阅读,但问题是开始时的大转换。

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

其他人对其他方面发表了评论。至于在返回之后多余的中断:我会保持它们,沿着与{}相同的推理围绕单个语句,如果正文:它应该是每个程序员将​​那些制动器放在那里的第二天性。最好有100个这样的冗余休息,而不是一个无意中遗漏。