4

一段时间以来,我一直在为如何格式化 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;
}

我知道很多代码风格是优先的,所以我将我的官方问题设置为:

只要在整个代码中保持一致,使用第二个或第三个选项有什么根本错误吗?

4

6 回答 6

5

As per Oracle Docs;

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;
}

The important thing here, is to be consistent, when you follow a format.

Hope this helps.

于 2013-08-14T16:52:16.153 回答
4

使用第二个或第三个选项有什么根本错误,只要它在整个代码中保持一致。

不——只要你的语言允许这种格式,它就没有“根本上”的错误。与所有代码格式一样,这纯粹是个人或团队的偏好。

第一种格式有充分的理由,例如:

  • case和语句开始之间的视觉中断。
  • 看到break;它自己的路线来区分跌倒案例等)
  • 有多个语句与单个语句时的一致性。

话虽如此,这三个选项中的任何一个都没有错。

于 2013-08-14T16:55:32.360 回答
2

恕我直言,问题是您并不总是每个案例只有一次陈述,这是真正的问题 - 您正在制造不一致。有时您在下面有多个语句,有时没有。

当你浏览一个大型代码库时,第二种风格可能会让你认为 switch 没有做任何事情就中断了,而第三种风格可能会让你认为这是故意省略 break 的情况之一。

当然,一旦您更仔细地查看代码并弄清楚它和/或习惯了不一致(因此它在您的脑海中变成了一致性),这两者都会消失,但是编码风格/标准的重点是这样你就不必这样做了。

这与“if (condition) statement;”类似。与“if (condition) {statement;}”相比——后者更通用,因此阅读大型代码库所需的精力更少,这就是大多数风格指南坚持使用它的原因。

于 2013-08-14T16:55:26.830 回答
1

只要您遵循您正在使用的代码库的标准,就可以了。如果您想定义更好的做事方式,这完全取决于您自己的喜好。有些人更容易阅读,有些人更喜欢其他标准。如果是这种情况(为新项目定义新标准),您应该尝试使用最常见的格式。

话虽如此,当交换机中只有 1 行代码时,我通常会选择第 3 行。我发现可读性比一致使用标准更重要(可能是因为一致使用标准是为了帮助阅读)。

于 2013-08-14T16:58:50.830 回答
1

几个重要的参考文献给出了缩进case语句的例子:

这与您的第 1 和第 2 样式相匹配,与第 3 样式相反,第 3 样式的case语句与switch.

缩进case语句的一个论点是在局部范围内声明变量的地方,这需要大括号。这是一个适应您的第一种风格的示例:

switch (x) {
    case 1:
        DoSomething(0);
        break;
    case 2:
    {
        int superNum = GetSuperNumber();
        DoSomething(superNum);
        break;
    }
}

如果没有缩进,final caseordefault语句的右大括号具有相同的缩进并“落入”父类的右大括号,switch如下所示:

switch (x) {
case 1:
    DoSomething(0);
    break;
case 2:
{
    int superNum = GetSuperNumber();
    DoSomething(superNum);
    break;
}
}

这掩盖了层次结构,在我看来,更难阅读。除非您出于一致性的原因被迫使用现有的代码样式或该样式是您的强制要求,否则第一种样式是一个不错的选择(也是我的最爱)。

于 2020-07-16T13:51:23.830 回答
1

我个人在不会将其自动格式化为您提供的第一个选项的语言/文本编辑器/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;
}

就像大多数人所说的那样,这纯粹是选择,但一致性是关键。

于 2018-05-11T03:07:04.717 回答