继续认为有害?[关闭]
-
09-06-2019 - |
解决方案
我认为应该更多地使用 continue!
我经常遇到这样的代码:
for (...)
{
if (!cond1)
{
if (!cond2)
{
... highly indented lines ...
}
}
}
代替
for (...)
{
if (cond1 || cond2)
{
continue;
}
...
}
使用它可以使代码更具可读性!
其他提示
是 continue
比说更有害的, break
?
如果有的话,在我遇到/使用它的大多数情况下,我发现它使代码更清晰并且不像意大利面条一样。
无论是否继续,您都可以编写出好的代码,无论是否继续,您都可以编写糟糕的代码。
关于 goto 的参数可能有一些重叠,但就我而言, continue 的使用相当于在方法体中的任何位置使用break语句(在循环中)或return语句 - 如果使用正确,它可以简化代码(不太可能包含错误,更容易维护)。
没有有害的关键字。它们只有有害的用途。
Goto 本身并无害处,Continue 也无害。它们需要小心使用,仅此而已。
如果继续导致可读性问题,那么很可能您还有其他问题。例如,for 循环内有大量代码。如果您必须编写大型 for 循环,我会尝试坚持使用靠近 for 循环顶部的 continue 。否则,深埋在 for 循环中间的 continue 很容易被错过。
我喜欢在循环开始时使用 continue 来处理简单的 if 条件。
对我来说,它使代码更具可读性,因为没有额外的嵌套,并且您可以看到我已经明确处理了这些情况。
这与我使用 goto 的原因相同吗?也许。我有时确实使用它们来提高可读性并停止代码嵌套,但我通常更多地使用它们来进行清理/错误处理。
我会说:“这取决于”。
如果您有相当小的循环代码(您可以在不滚动的情况下看到整个循环代码),通常可以使用 continue。
但是,如果循环体很大(例如由于一个大开关),并且有一些后续代码(例如在开关下面),则您可能会通过添加 continue 来轻松引入错误,从而有时会跳过该代码。我在字节码解释器的核心遇到过这种情况,其中一些检测代码有时由于某些情况分支中的继续而未执行。
这可能是一个有点人为构造的情况,但我通常会尽量避免继续并使用 if (但不要像 Rob 的示例代码中那样嵌套太深)。
我认为 continue 不会像 goto 一样困难,因为 continue 永远不会将执行移出它所在的代码块。
如果您正在迭代任何类型的结果集,并对所述结果执行操作,例如在每个结果中,并且如果一个特定结果导致问题,那么它在捕获预期错误(通过 try-catch)方面非常有用,记录它,并通过继续转到下一个结果。在我看来,“继续”对于在非正常时间执行作业的无人值守服务特别有用,并且一个异常不应影响其他 x 条记录。
在循环开始时使用 continue 来避免迭代不必要的元素并不是有害的,而且非常有用,但在嵌套的 if 和 else 中间使用它可以将循环代码变成复杂的迷宫,以便于理解和验证。
我认为它的使用回避也是语义误解的结果。那些从未在代码中看到/写过“Continue”关键字的人,当看到带有 continue 的代码时,可以将其解释为“自然流程的延续”。如果我们不继续 下一个, ,例如,我认为更多的人会欣赏这个有价值的光标功能。
goto 可以用作继续,但反之则不行。
你可以“转到”任何地方,从而任意打破流量控制。
这样继续下去,就不会那么有害了。
其他人已经暗示了...但继续和中断是由 编译器 并有自己的相关规则。Goto 没有这样的限制,尽管净效应 可能 在某些情况下几乎是相同的。
我不认为 continue 或 break 本身是有害的,尽管我确信任何一个使用不当都会让任何理智的程序员感到恶心。
我会说是的。对我来说,它只是破坏了一段流畅编写的代码的“流程”。
另一个论点还可能是,如果您坚持使用大多数现代语言支持的基本关键字,那么您的程序流(如果不是逻辑或代码)可以移植到任何其他语言。使用不受支持的关键字(即 continue 或 goto)会破坏这一点。
这实际上更多的是个人喜好,但我从来没有必要使用它,并且在编写新代码时并不真正认为它是一个选项。(与转到相同。)
对于这位程序员来说, 嵌套 if/else 被认为是有害的。
在大多数语言中,Continue 是一个非常有用的函数,因为它允许在某些条件下跳过代码块。
一种替代方法是在 if 语句中使用布尔变量,但每次使用后都需要重置这些变量。
继续对我来说感觉不对。休息可以让你离开那里,但继续似乎只是意大利面条。
另一方面,你可以用break来模拟继续(至少在Java中)。
for (String str : strs) contLp: {
...
continue contLp;
...
}
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 ...
}
我认为反对继续的底线论点是它使得证明代码正确变得更加困难。这是数学意义上的证明。但这对你来说可能并不重要,因为没有人有资源来“证明”一个非常复杂的计算机程序。
输入静态分析工具。你可能会让他们变得更难......
出于同样的原因,这听起来像是一场噩梦,但在代码中的任何随机位置。