我对于如何设置 switch 语句的格式一直很矛盾。我看到了三个可行的选项,虽然我经常使用第一个选项(因为这是我最常看到的形式),但我发现第二个和第三个更直观。
第一:
switch(x) {
case 1:
DoSomething();
break;
case 2:
DoSomething();
break;
}
第二:
switch(x) {
case 1: DoSomething();
break;
case 2: DoSomething();
break;
}
第三:
switch(x) {
case 1: DoSomething(); break;
case 2: DoSomething(); break;
}
我知道很多代码风格是优先的,所以我将我的正式问题设置为:
只要在整个代码中保持一致,使用第二个或第三个选项有什么根本错误吗?
根据 Oracle 文档;
A switch statement should have the following form:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
这里重要的是
to be consistent
,当你遵循格式时。
使用第二个或第三个选项有什么根本性的错误吗,只要它在整个代码中保持一致即可。
不 - 只要您的语言允许这种格式,就没有什么“根本”错误。与所有代码格式一样,这纯粹是个人或团队的偏好。
采用第一种格式有充分的理由,例如:
case
和语句开始之间的视觉中断。break;
以区分跌倒情况等)话虽这么说,这三个选项都没有任何问题。
一些重要参考文献给出了带有缩进
case
语句的示例:
这与您的第一种和第二种样式相匹配,而不是第三种样式,后者具有与
case
相同缩进的 switch
语句。
缩进
case
语句的一个参数是使用局部范围声明变量,这需要大括号。这是适应您的第一种风格的示例:
switch (x) {
case 1:
DoSomething(0);
break;
case 2:
{
int superNum = GetSuperNumber();
DoSomething(superNum);
break;
}
}
如果没有缩进,最后一个
case
或 default
语句的右大括号具有相同的缩进,并且“落入”父级 switch
的右大括号中,如下所示:
switch (x) {
case 1:
DoSomething(0);
break;
case 2:
{
int superNum = GetSuperNumber();
DoSomething(superNum);
break;
}
}
这掩盖了层次结构,并且在我看来,更难阅读。除非您出于一致性的原因被迫使用现有的代码样式或者该样式是您强制使用的,否则第一种样式是一个不错的选择(也是我最喜欢的)。
恕我直言,问题在于每个案例并不总是只有一次陈述,这才是真正的问题 - 你正在造成不一致。有时您在下面有多个陈述,有时则没有。
当您浏览大型代码库时,第二种风格可能会让您认为 switch 不执行任何操作就中断了,而第三种风格可能会让您认为这是故意省略中断的情况之一。
当然,一旦您更仔细地查看代码并弄清楚它和/或习惯了不一致(因此它在您的头脑中变成了一致性),这两者都会消失,但是编码风格/标准的全部要点这样您就不必这样做。
这与“if(条件)语句;”的处理类似。与“if (condition) {statement;}”相比 - 后者更通用,因此需要更少的精力来阅读大型代码库,这就是大多数风格指南坚持使用它的原因。
我个人在语言/文本编辑器/IDE 中使用它,这些语言/文本编辑器/IDE 不会将其自动格式化为您提供的第一个选项。
switch(x) {
case 1:
DoSomething();
break;
//Line separator here depends on how big the line-heights are with the IDE I'm working with
case 2:
DoSomething();
break;
}
就像大多数人所说,这纯粹是选择,但一致性是关键。
只要您遵循您正在使用的代码库的标准,就可以了。如果您想定义更好的做事方式,这完全取决于您自己的喜好。有些对某些人来说更容易阅读,而另一些则更喜欢其他标准。如果是这种情况(为新项目定义新标准),您应该尝试使用最常见的格式。
话虽如此,当交换机中只有 1 行代码时,我通常会选择第三行。我发现可读性比一致使用标准更重要(可能是因为一致使用标准旨在帮助阅读)。