Прерывание цикла for с помощью break это плоxo?

268
30 января 2017, 16:49

И снова я со своей книгой "Для про". Почему в цикле for не рекомендуется прерывание с помощью break? Как же тогда это сделать?

Answer 1

Мне этот совет кажется достаточно странным.

Представьте себе, что вы можете определить условие выхода только после какой-то работы. Например:

for (int i = 0; i < paths.length; i++) {
    File file = getFile(paths[i]);
    FileType ft = parseType(file);
    if (badTypes.contains(ft)) {
        break;
    }
    // ...
}

Этот код говорит сам за себя: если мы нашли плохой тип файла, обработку завершаем.

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

В хорошем языке вы пишете то, что думаете, а не пытаетесь сказать это хитрыми косвенными методами.

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

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

Дополнительно по теме: Donald Knuth, Structured Programming With Go To Statements.

Answer 2

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

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

Answer 3

Почему плохо goto? Эдсгер Дейкстра, в свое время очень хорошо написал про это

break плох примерно по тем же причинам. Он нарушает execution flow. Не так фатально как goto, но все же.

READ ALSO
Кастомные кнопки bxslider

Кастомные кнопки bxslider

Не получается настроить свои кнопки для переключения слайдов в bxslider, а точнее иконки с FontAwesomeНеобходимо их сделать по центру слайда с отступами...

470
Получить значение радиокнопки

Получить значение радиокнопки

Есть такая верстка

344
Проблема с подключением класа

Проблема с подключением класа

Значит стандартный код, для старта софта

272
Переименовать заголовок окна

Переименовать заголовок окна

Возможно ли силами C# отловить заголовок окна стороннего ПО и переименовать его на время сессииНапример найти процесс calculator

317