在开关盒内打开其他分支确定

Is opened else branch inside a switch-case ok?

本文关键字:其他 分支 开关      更新时间:2023-10-16

我的代码意外地以以下结构结束。我不确定这是否可以。

switch (msg.type)
{
  case Msg::Type::One:
  case Msg::Type::Two:
    // do nothing
    break;
  case Msg::Type::Open:
    if (msg.isBad())
      break;
    else // opened else branch is ok here??
    // intended fall through
   case Msg::Type::Close:
     goodMsg.push_back(msg);
     doSomethingOther();
     blaBla();
     break;
}

它可能有效,但如果您打算失败,我会完全删除其他内容,并发表评论说这是故意失败。

我建议不要这样做。 在编码方面,每个人都应该遵循三点重要性层次结构:

  1. 可读性
  2. 功能性
  3. 效率

我认为你在这里试图做的是试图通过减少编写的代码量来使其更具可读性,但问题是它实际上起到了相反的作用。

尝试

想出另一种方法来完成您正在尝试完成的任务,这对于完全熟悉您的代码的人来说更容易理解。

一个建议是省略空白的else,只使用if语句。 虽然这可以说仍然不是可读性的最佳选择,但它比 else 语句更好,并且在工作场所实际上是可以容忍的。

让我们标记代码的某些区域:

switch (msg.type) {
  case Msg::Type::One:
  case Msg::Type::Two:
    // (1)
    break;
  case Msg::Type::Open:
    if (msg.isBad()) {
      // (2)
      break;
    } else {
      // (3)
      // intended fall through
    }
   case Msg::Type::Close:
     // (4)
     goodMsg.push_back(msg);
     doSomethingOther();
     blaBla();
     break;
}

下表显示了将运行哪些代码:

                         (1) (2) (3) (4)
Msg::Type::One            ✔︎
Msg::Type::Two            ✔︎
Msg::Type::Open && Bad        ✔︎       
Msg::Type::Open && !Bad           ✔︎   ✔︎
Msg::Type::Close                      ✔︎

话虽如此,此代码的大多数读者都会认为失败条件是一个错误。因此,我强烈建议重构此代码。

if语句的语法为:

if (expression) statement

if (expression) statement else statement

在代码中,与 else 关键字关联的语句goodMsg.push_back(msg);整个switch语句(恰好具有与之关联的大小写标签)。

我无法从您的问题中判断这是否是您的意图,尽管您的缩进表明您的意思是switch语句独立于if/else

如果这是您的意图,则else没有用。您的逻辑将更清楚地表达为:

if (condition) break;
case ...

我的建议:始终对条件语句和循环语句使用大括号。这使您可以避免首先提出这样的问题:

if (condition) {
    statement
}
else {
    statement
}

if/else if/.../else链是一个特例。从语法上讲,它是一组嵌套的 if/else 语句,但惯例是将其视为线性链,这样写道:

if (condition) {
    statement
}
else if (condition) {
    statement
}
else {
    statement
}

而不是:

if (condition) {
    statement
}
else {
    if (condition) {
        statement
    }
    else {
        statement
    }
}

请注意,我使用的是 K&R 风格的大括号放置,每个{都在一行的末尾。另一种非常常见的样式将{}单独放在线条上。这两种选择都是有效的(我显然有自己的偏好),只要你保持一致

相关文章: