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

我被告知在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

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

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

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

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 } 

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

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

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

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

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