9

有人告诉我,在 OOP 语言中使用 break 和 continue 标签不是 OOP 编程风格。你能详细解释一下为什么以及是什么问题吗?

诀窍在于这个标签词。我的意思是标记中断/继续。

class BreakWithLabelDemo {
    public static void main(String[] args) {

        int[][] arrayOfInts = {
            { 32, 87, 3, 589 },
            { 12, 1076, 2000, 8 },
            { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

    search:
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;
                 j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor +
                               " at " + i + ", " + j);
        } else {
            System.out.println(searchfor +
                               " not in the array");
        }
    }
}

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

4

5 回答 5

27

告诉你的人可能意味着 break 和 continue 是分支语句,例如 goto ,这是命令式编程的一种机制。

中断/继续只允许您跳转到外部语句,这意味着您不能在代码中到处走。所以你留在同一个方法对象中,所以它与 OOP 不兼容。

无论如何,说break和continue不是OOP是无稽之谈。我们可以讨论它们对可读性的影响,但仅此而已。

于 2012-06-21T07:22:42.767 回答
19

break 和 continue 不是函数式编程。没有任何关于 OOP 的建议breakcontinue甚至goto在方法中也是一个坏主意。

恕我直言,在 OOP 语言中不鼓励使用 break 和 continue,因为它们会导致复杂性和混乱。由于标签很少使用,它们可能会进一步混淆。我会说,当您觉得它是解决问题的最简单方法时,您仍然应该使用它们。

// confusing use of LABEL
http://www.google.com/
do {
    if (condition) continue http;
} while(condition2)

另一个令人困惑的用途

GOTO: {
    // code
    if (condition)
         break GOTO; // without a loop
    // code
}

善用标签

OUTER: 
for(outer loop) {
   for(inner loop)
      if (condition)
         continue or break OUTER;
}

标签的奇怪使用

FOUND: {
   for(loop)
      if(found)
          break FOUND;

   // not found
   handle not found
}
于 2012-06-21T07:14:26.380 回答
5

不使用中断/继续的建议可能与 OOP 无关。这是基于这些语句类似于臭名昭著的 GOTO 的事实,它可以使代码完全不可读。然而,教条是不好的忠告。主要范式应该是代码的可读性。使用 break 或 continue 在第一行跳出循环比将整个其余部分放入 if 条件要清楚得多。

于 2012-06-21T08:35:14.670 回答
2

Bruce Eckel 在“Thinking in Java”中写道:“重要的是要记住,在 Java 中使用标签的唯一原因是当您有嵌套循环并且想要中断或继续通过多个嵌套级别时。”

实际上,当您不使用标签时,代码的工作流程在许多情况下会更加清晰。

于 2012-06-21T07:15:16.900 回答
-4

我认为主要原因是代码在中断和继续时不太清楚。

但也可能是一些性能问题(与 OOP 无关):CPU 在处理该指令之前使用预测器将指令加载到队列中。预测器很容易检测到接下来要为条件跳转加载哪些指令,而对于无条件跳转则更难。

于 2012-06-21T07:14:11.110 回答