И снова я со своей книгой "Для про". Почему в цикле for не рекомендуется прерывание с помощью break? Как же тогда это сделать?
Мне этот совет кажется достаточно странным.
Представьте себе, что вы можете определить условие выхода только после какой-то работы. Например:
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.
Скорее всего в книге имелось ввиду то, что не следует использовать прерывание цикла for с помощью break в нормальных ситуациях, так как естественное условие выхода из цикла for задается непосредственно при объявлении цикла.
А при возникновении каких-то исключительных ситуаций, когда из цикла необходимо выйти раньше, чем было задумано изначально, использование break вполне нормально и оправдано.
Почему плохо goto? Эдсгер Дейкстра, в свое время очень хорошо написал про это
break плох примерно по тем же причинам. Он нарушает execution flow. Не так фатально как goto, но все же.
Продвижение своими сайтами как стратегия роста и независимости