Выход из цикла в Java - PullRequest
       3

Выход из цикла в Java

6 голосов
/ 09 марта 2011

Я использую Java, но я думаю, что этот вопрос относится к любому языку.Я просто хочу спросить, лучше ли выходить из цикла, используя логическое значение, которое я переключаю внутри цикла, или просто использовать разрыв;

Например, я просто писал метод, чтобы получить действительные шагиКоролева в шахматах.

private static final int[][] DIRS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {-1, 1}, {1, -1}};

public Vector<Move> getValidMoves() {
    Vector<Move> validMoves = new Vector<Move>();

    for (int i = 0; i < DIRS.length; i++) {
        boolean stopped = false;
        int newX = x + DIRS[i][0];
        int newY = y + DIRS[i][1];
        while (!stopped && newX >= 0 && newX < 8 && newY >= 0 && newY < 8) {
            if (board[newX][newY] == null) {
                validMoves.add(new Move(x, y, newX, newY));
                newX += DIRS[i][0];
                newY += DIRS[i][1];
            } else {
                if (board[newX][newY].getColour() == colour) {
                    stopped = true;
                } else {
                    validMoves.add(new Move(x, y, newX, newY));
                    stopped = true;
                }
            }
        }
    }

    return validMoves;
}

Если я выйду из цикла while, используя break;вместо того, чтобы устанавливать остановку в true, как я делаю, я понимаю, что она работает более эффективно, но это не лучший стиль кода.

Ответы [ 10 ]

13 голосов
/ 09 марта 2011

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

8 голосов
/ 09 марта 2011

С точки зрения производительности, это не имеет большого значения, вы выделяете 1 логическое значение в стеке и добавляете 1 сравнение на каждой итерации цикла, так что не о чем беспокоиться.

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

Если вам не нужно заканчивать итерацию цикла, ваш код будет легче читать, если вы используете break

2 голосов
/ 09 марта 2011

Поскольку использование здесь логической переменной не сильно влияет на производительность, речь идет о читабельности. Некоторые считают, что использование оператора break снижает читабельность кода по двум причинам.

Одна из них заключается в том, что пользователь иногда не может читать код последовательно (необходимо перейти на чтение), когда используется оператор break. Это может сбивать с толку, так как читателю нужно определить, куда оператор break приводит к следующей операции.

Другое дело, что использование переменной для условия остановки помогает читателю понять, почему она остановлена, если вы осмысленно называете переменную. Например, если вы используете логическую переменную isEmpty для условия остановки, очень ясно, что цикл остановился, потому что все пустое.

Я не против использования оператора break, но я думаю, что вы должны сделать его максимально читабельным.

1 голос
/ 09 марта 2011

Возможно, вы захотите прочитать об использовании break на веб-странице оракула

Обучающее руководство по ветвлению

с использованием Break для выхода из цикла принимается какхорошая практика.тогда, если вы используете это или нет, зависит от вас.

Теперь, если вы хотите улучшить читабельность своего кода и его гибкость, вы можете разбить сложные циклы на функции.

1 голос
/ 09 марта 2011

Точка, которая еще не была поднята:

В Java (не только) выход из вложенных циклов будет более элегантнее с break, чем при одинаковом условии, вложенном на каждом уровне. Это также сделает код более понятным.

Кроме того, это может сделать логику цикла намного более простой, потому что, как только вы достигнете критического состояния, вы сможете действовать, а не продолжать выполнение кода. Это также способствует модульности в теле цикла.

1 голос
/ 09 марта 2011

Как и вышеупомянутые пользователи, обязательно используйте break. Для этого созданы выходные циклы.

1 голос
/ 09 марта 2011

Именно поэтому в языке перерыв .Я бы просто использовал это.

1 голос
/ 09 марта 2011

Зависит от того, с кем вы говорите. У меня есть профессор колледжа, который поклялся, что пристрелит любого студента, который не выйдет из контрольной структуры (такой как цикл) с проверкой нормального выражения.

Однако я видел, что как бы это ни было «дисциплинировано», бывают моменты, когда желательно выйти из цикла или другой структуры управления на ранней стадии. Имея это в виду, я говорю «пойти на это». Вы по-прежнему можете быть дисциплинированными и иметь читаемый код, который не имеет неожиданного поведения при досрочном выходе (при условии, что этот выход будет действительной причиной выхода из этой структуры.

1 голос
/ 09 марта 2011

Определенно используйте перерыв.Вот для чего используется ключевое слово: оно генерирует более лаконичный код, не заставляет кого-то читать ваш код, удивляться, откуда взялась эта «остановка» в цикле, и, вероятно, также быстрее.

1 голос
/ 09 марта 2011

Я предлагаю вам сделать то, что вы считаете самым ясным.ИМХО Использование логического значения может быть понятнее для вложенных циклов, но для простых циклов использование флага ненужно многословно.

while (0 <= newX && newX < 8 && 0 <= newY && newY < 8) {
    if (board[newX][newY] == null) {
        validMoves.add(new Move(x, y, newX, newY));
        newX += DIRS[i][0];
        newY += DIRS[i][1];
    } else {
        if (board[newX][newY].getColour() != colour) 
            validMoves.add(new Move(x, y, newX, newY));
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...