-->

为什么这是一个糟糕的做法是使用中断/继续OOP(例如,Java,C#)的标签? [关闭](Why

2019-06-25 15:15发布

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

诀窍是这个标签词。 我的意思是带标签的break /继续。

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

Answer 1:

谁告诉你的,那真的意味着突破,并继续像goto语句分支语句这是命令式编程的一个机制的人。

一休/继续只允许你跳转到一个外部声明,这意味着你不能去无处不在的代码。 所以,你留在同一个方法对象,所以它不是不符合OOP。

无论如何,他说,休息一下,继续不OOP是无感。 我们可以对他们的可读性可能影响讨论,但仅此而已。



Answer 2:

突破并继续不起作用的编程风格。 有一个关于OOP没有这表明breakcontinue甚至goto内的方法是一个坏主意。

恕我直言,利用休息,继续在OOP语言气馁,因为它们会导致复杂性和混乱。 由于标签是很少使用甚至还可以进一步混淆。 我说你还应该使用它们,当你觉得它的这个问题最简单的办法。

// 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
}


Answer 3:

布鲁斯·埃克尔在“在Java编程思想”以下的想法中写道:“要记住,在Java中使用标签的唯一理由是,当你有嵌套的循环,你想中断或继续超过一层嵌套是很重要的。”

其实,当你不使用标贴的代码工作流程在很多情况下更清晰。



Answer 4:

建议不要使用中断/继续大概没有真正涉及到OOP。 正是基于这样的事实,这些声明类似于臭名昭著的GOTO,它可以使代码完全不可读。 然而,教条,是坏的计谋。 主要模式应该是代码的可读性。 用break跳出循环的第一行或继续可以不是将所有的剩余成,如果条件更清晰。



Answer 5:

我认为主要的原因是该代码是不休息,继续如此清晰。

但是,也可能会出现一些性能问题(不涉及OOP):CPU使用预测到队列中加载指令之前,该指令将被处理。 它容易预测,以检测什么指令到明年的条件跳转加载,将成为无条件更难。



文章来源: Why it is a bad practice to use break/continue labels in OOP (e.g. Java, C#)? [closed]