【问题标题】:Continue Considered Harmful? [closed]继续 被认为是有害的? [关闭]
【发布时间】:2010-09-08 15:02:48
【问题描述】:

开发人员是否应该避免在 C# 中使用 continue 或在其他语言中使用它来强制循环的下一次迭代?支持或反对的论点会与关于Goto 的论点重叠吗?

【问题讨论】:

  • 这势必会在两个阵营之间掀起一场火焰战。这是个人决定,在其他地方可以找到很多支持和反对的论据。
  • 到目前为止的答案都是片面的,我至少看到了两个我从未想过或在其他地方看到过的论点。

标签: language-agnostic loops goto continue


【解决方案1】:

continue 我觉得不对劲。 break 让你离开那里,但 continue 似乎只是意大利面。

另一方面,您可以用break 模拟continue(至少在Java 中)。

for (String str : strs) contLp: {
    ...
       break contLp;
    ...
}

(这个帖子在上面的代码中有一个明显的错误已经有十多年了。这对break/continue来说看起来不太好。)

continue 在某些情况下可能很有用,但我仍然觉得它很脏。可能是时候引入一种新方法了。

for (char c : cs) {
    final int i;
    if ('0' <= c && c <= '9') {
        i = c - '0';
    } else if ('a' <= c && c <= 'z') {
        i = c - 'a' + 10;
    } else {
        continue;
    }
    ... use i ...
}

这些用途应该很少见。

【讨论】:

  • 我同意。对我来说,这似乎是程序性的。
【解决方案2】:
  1. 在循环的开头使用 continue 来避免迭代不必要的元素是无害的并且非常有用,但是在嵌套的 if 和 else 中间使用它会使循环代码变成一个复杂的迷宫,理解和验证。

  2. 我认为它的用法避免也是语义误解的结果。从未在他们的代码上看到/写过“继续”关键字的人,当看到带有 continue 的代码时,可以将其解释为“自然流的延续”。例如,如果我们使用 next 而不是 continue,我想更多的人会喜欢这个有价值的光标功能。

【讨论】:

    【解决方案3】:

    就这位程序员而言,嵌套 if/else 被认为是有害的。

    【讨论】:

      【解决方案4】:

      我会说:“这取决于”。

      如果您的循环代码相当小(无需滚动即可看到整个循环代码),通常可以使用 continue。

      但是,如果循环体很大(例如由于一个大开关),并且有一些后续代码(比如在开关下方),您可能很容易通过添加 continue 来引入错误,因此有时会跳过该代码.我在字节码解释器的核心中遇到过这种情况,在某些情况下,由于在某些情况下分支的继续,有时无法执行某些检测代码。

      这可能是一个人为构造的案例,但我通常会尽量避免 continue 并使用 if(但不会像 Rob 的示例代码中那样嵌套太深)。

      【讨论】:

        【解决方案5】:

        如果您正在迭代任何类型的结果集,并对所述结果执行操作,例如在 for each 中,并且如果一个特定结果导致问题,则它在捕获预期错误方面非常有用(通过 try- catch),记录它,然后通过 continue 转到下一个结果。 imo,对于在奇数时间执行工作的无人值守服务,Continue 特别有用,并且一个异常不应影响其他 x 条记录。

        【讨论】:

          【解决方案6】:

          我会说是的。对我来说,它只是破坏了一段流畅编写的代码的“流程”。

          另一个论点也可能是,如果您坚持大多数现代语言支持的基本关键字,那么您的程序流程(如果不是逻辑或代码)可以移植到任何其他语言。使用不受支持的关键字(即 continue 或 goto)会破坏这一点。

          这实际上更多是个人喜好,但我从来没有使用过它,并且在我编写新代码时也没有真正考虑过它。 (与 goto 相同。)

          【讨论】:

            【解决方案7】:

            我相信反对 continue 的底线论点是它更难证明代码是正确的。这是数学意义上的证明。但这对你来说可能无关紧要,因为没有人有资源“证明”一个非常复杂的计算机程序。

            进入静态分析工具。你可能会让他们更难……

            还有 goto,出于同样的原因,这听起来像是一场噩梦,但在代码中的任何随机位置。

            【讨论】:

            • 通常会中断并继续,以避免需要辅助变量或代码重复。因此,它们应该更容易证明代码。并不是说证明代码是我可能会尝试的。
            • 不,not "any random place in code"。也许您想到的是longjmp,它与goto相同。
            【解决方案8】:

            其他人已经暗示过...但是 continue 和 break 由 编译器 强制执行,并且有自己的相关规则。 Goto 没有这样的限制,尽管在某些情况下,净效果可能几乎相同。

            我不认为 continue 或 break 本身是有害的,尽管我确信任何一个使用不当都会让任何理智的程序员感到厌烦。

            【讨论】:

            • continue and break are enforced by the compiler and have their own associated rules. Goto has no such limitations 呃,那怎么样?你认为goto 违反了范围规则吗?因为that's a myth...
            • @LightnessRacesinOrbit - 关于在 C++ 中使用 goto 的帖子的链接很吸引人,但比我想的要详细得多!显然,我不准确地建议 goto 关于它的使用几乎没有编译器规则,但我想我的意思是继续和中断去最近的封闭循环中的定义位置,这些位置通常可以通过代码的缩进来识别 - 松散地说打破你向下看,继续向上看。
            【解决方案9】:

            我喜欢在循环的开头使用 continue 来处理简单的 if 条件。

            对我来说,它使代码更具可读性,因为没有额外的嵌套,您可以看到我已经明确处理了这些情况。

            这与我使用 goto 的原因相同吗?可能。我有时确实使用它们来提高可读性并停止代码的嵌套,但我通常更多地使用它们来进行清理/错误处理。

            【讨论】:

              【解决方案10】:

              没有有害的关键字。它们只有有害用途。

              Goto 本身并无害,continue 也无害。它们需要小心使用,仅此而已。

              【讨论】:

              【解决方案11】:

              如果 continue 导致可读性问题,那么您可能还有其他问题。例如,for 循环中的大量代码。如果您必须编写大型 for 循环,我会尝试坚持在 for 循环顶部附近使用 continue。否则,很容易错过深埋在 for 循环中间的 continue。

              【讨论】:

                【解决方案12】:

                goto 可以用作 continue,但不能反过来。

                您可以“转到”任何地方,从而任意中断流控制。

                这样继续下去,几乎没有那么有害。

                【讨论】:

                【解决方案13】:

                在大多数语言中,Continue 是一个非常有用的功能,因为它允许在某些条件下跳过代码块。

                另一种方法是在 if 语句中使用布尔变量,但每次使用后都需要重置这些变量。

                【讨论】:

                  【解决方案14】:

                  无论有没有继续,你都可以写出好的代码,有或没有继续,你可以写出糟糕的代码。

                  可能与关于 goto 的参数有一些重叠,但就我而言,使用 continue 等同于使用 break 语句(在循环中)或从方法体中的任何位置使用 return 语句 - 如果使用正确,它可以简化代码(不太可能包含错误,更易于维护)。

                  【讨论】:

                    【解决方案15】:

                    continue 是否比 break 更有害?

                    如果有的话,在我遇到/使用它的大多数情况下,我发现它使代码更清晰,不像意大利面条。

                    【讨论】:

                    • 当且仅当使用 RAII。中断和继续可能会导致内存泄漏或更糟。
                    • @Fox:这是任何搞砸对象所有权/生命周期的人的错。不是继续或中断。
                    • @LightnessRacesinOrbit 完全同意。大多数优秀的编程团队只是碰巧编写了这些规则。
                    • @Fox:迟到总比不到好? :)
                    【解决方案16】:

                    我认为应该更多地使用 continue!

                    我经常遇到如下代码:

                    for (...)
                    {
                       if (!cond1)
                       {
                          if (!cond2)
                          {
                              ... highly indented lines ...
                          }
                       }
                    }
                    

                    而不是

                    for (...)
                    {
                       if (cond1 || cond2)
                       {
                          continue;
                       }
                    
                       ...
                    }
                    

                    用它使代码更具可读性!

                    【讨论】:

                    • 甚至:for (...) { if (cond1 || cond2) continue; ... } 我一直这样使用它,让你的突破在一条线上
                    • 该死,如果 (cond1 || cond2) continue 的话,上面的评论会更好地使用换行符;一行
                    • 为什么不使用if (!cond1 &amp;&amp; !cond2) { execute code } 而不是if (cond1 || cond2) continue
                    • @Dennis - 关键是将“执行代码”块中的有趣代码尽可能地放在屏幕左侧。我还发现大多数情况下不带否定句的条件句更容易阅读。
                    • @Dennis:因为你想避免“上帝”条件,它在语义上包含少量逻辑,但在物理上似乎包含了整个代码。
                    【解决方案17】:

                    我认为 continue 不会像 goto 那样困难,因为 continue 永远不会将执行移出它所在的代码块。

                    【讨论】:

                      猜你喜欢
                      • 2010-12-26
                      • 2015-09-09
                      • 2011-12-28
                      • 1970-01-01
                      • 2014-11-24
                      • 2010-12-22
                      • 2010-11-08
                      • 1970-01-01
                      • 2011-10-08
                      相关资源
                      最近更新 更多