Почему плохая практика использовать метки break / continue в ООП (например, Java, C#) [закрыто]

Мне сказали, что использование ярлыков break и continue на языке ООП не является стилем программирования ООП. Можете ли вы подробно объяснить, почему и в чем проблема? Фокус был в этом слове. Я имел в виду надпись 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 ответов


человек, который сказал вам, что, вероятно, означает, что break и continue являются разветвленными утверждениями, такими как goto, которые являются одним из механизмов императивного программирования.

перерыв / продолжить только позволяют перейти к внешней инструкции, что означает, что вы не можете идти везде в коде. Таким образом, вы остаетесь в том же объекте метода, поэтому он не несовместим с OOP.

в любом случае, говорить, что перерыв и продолжить не ООП-это не смысл. Мы можем обсудить их влияние на читаемость может быть, но это все.


Break и continue не функциональное стиль программирования. В ООП нет ничего, что предполагаетbreak, continue или даже goto внутри метода-плохая идея.

IMHO использование 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
}

Брюс Экель написал в" мышлении на Java "следующую идею:" важно помнить, что единственная причина использования меток в Java-это когда у вас есть вложенные циклы, и вы хотите сломать или продолжить через более чем один вложенный уровень."

на самом деле, когда вы не используете lables, рабочий процесс кода во многих случаях более ясен.


совет не использовать break / continue, вероятно, не связан с ООП. Он основан на том, что эти утверждения похожи на печально известный GOTO, который может сделать код полностью нечитаемым. Однако, догмы плохие советы. Основной парадигмой должна быть читаемость кода. Выпрыгивание из цикла в первой строке с помощью break или continue может быть намного яснее, чем помещение всего остального в условие if.


Я думаю, что основная причина в том, что код не так понятен с break и continue.

но также могут быть некоторые проблемы с производительностью (не связанные с ООП): CPU использует предикторы для загрузки инструкции в очередь перед обработкой этой инструкции. Предиктору легко определить, какие инструкции загружать дальше для условного прыжка, и будет сложнее для безусловного.