为什么在OOP中使用break / continue标签是不好的做法(例如Java,C#)?

时间:2012-06-21 07:03:36

标签: c# java oop break continue

我被告知在OOP语言中使用break和continue标签不是OOP编程风格。你能详细解释为什么和问题是什么?

诀窍在于这个标签词。我的意思是标记为break / continue。

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

5 个答案:

答案 0 :(得分:24)

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

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

无论如何,说打破并继续不是OOP是无意义的。我们可以讨论它们对可读性的影响,但这就是全部。

答案 1 :(得分:16)

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
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:-4)

我认为主要原因是代码不是那么明确的中断和继续。

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