Использование break
оператора внутри for
цикла - плохая практика ?
Скажем, я ищу значение в массиве. Сравните внутри цикла for и, когда значение найдено, break;
чтобы выйти из цикла for.
Это плохая практика? Я видел альтернативу использованию: определить переменную vFound
и установить его истинным , когда обнаруживается значение и проверьте vFound
в for
инструкции условия. Но нужно ли для этого создавать новую переменную?
Я спрашиваю в контексте обычного цикла for на C или C ++.
PS: Руководство по кодированию MISRA не рекомендует использовать break.
break
goto
Ответы:
Здесь много ответов, но я еще не видел этого:
Большинство «опасностей», связанных с использованием
break
илиcontinue
в цикле for, устраняются, если вы пишете аккуратные, легко читаемые циклы. Если тело вашего цикла охватывает несколько длин экрана и имеет несколько вложенных субблоков, да, вы можете легко забыть, что некоторый код не будет выполняться после разрыва. Однако если цикл короткий и по существу, цель оператора break должна быть очевидна.Если цикл становится слишком большим, используйте вместо этого один или несколько хорошо названных вызовов функций внутри цикла. Единственная реальная причина избегать этого - узкие места в обработке.
источник
Нет, перерыв - правильное решение.
Добавление логической переменной затрудняет чтение кода и добавляет потенциальный источник ошибок.
источник
goto
для выхода из вложенных циклов Уровня 2+ - потому что их нетbreak(level)
Вы можете найти всевозможные профессиональные коды с операторами break. Совершенно разумно использовать это всякий раз, когда это необходимо. В вашем случае этот вариант лучше, чем создание отдельной переменной только для выхода из цикла.
источник
Использование
break
какcontinue
вfor
цикле - это нормально.Это упрощает код и улучшает его читаемость.
источник
В отличие от плохой практики, Python (и другие языки?)
for
Расширил структуру цикла, поэтому его часть будет выполняться только в том случае, если цикл не работаетbreak
.Вывод:
Эквивалентный код без
break
и того под рукойelse
:источник
Нет ничего плохого в использовании оператора break, но вложенные циклы могут сбивать с толку. Для улучшения читаемости многие языки ( по крайней мере, Java ) поддерживают разбиение на метки, что значительно улучшит читаемость.
Я скажу, что операторы break (и return) часто увеличивают цикломатическую сложность, что затрудняет доказательство того, что код делает правильные вещи во всех случаях.
Если вы планируете использовать перерыв при повторении последовательности для определенного элемента, вы можете пересмотреть структуру данных, используемую для хранения ваших данных. Использование чего-то вроде Set или Map может дать лучшие результаты.
источник
for
циклам.break - вполне приемлемый оператор (как и continue , кстати). Все дело в удобочитаемости кода - пока у вас нет слишком сложных циклов и тому подобного, все в порядке.
Не то чтобы они были из той же лиги, что и Гото . :)
источник
Общее правило: если следование правилу требует от вас сделать что-то более неудобное и трудное для чтения, а затем нарушить правило, нарушите правило.
В случае зацикливания до тех пор, пока вы что-то не найдете, вы столкнетесь с проблемой различения найденного и не найденного, когда вы выберетесь. То есть:
Итак, хорошо, вы можете установить флаг или инициализировать "найденное" значение нулевым. Но
Вот почему я предпочитаю выполнять поиск в функциях:
Это также помогает не загромождать код. В основной строке «find» становится единственным оператором, а когда условия сложные, они записываются только один раз.
источник
break
, я пытаюсь найти способ преобразовать код в функцию, чтобы я мог использовать ееreturn
вместо этого.Это зависит от языка. Хотя вы можете проверить здесь логическую переменную:
это невозможно сделать при обходе массива:
В любом случае
break
сделал бы оба кода более читабельными.источник
В вашем примере вы не знаете количество итераций для цикла for . Почему бы не использовать то время как цикл вместо, что позволяет число итераций быть неопределенными в начале?
Именно поэтому не стоит использовать перерыв statemement в целом, так как цикл может быть лучше сказать , как в то время цикла.
источник
Я согласен с другими, кто рекомендует использовать
break
. Возникает очевидный вопрос: почему кто-то может рекомендовать иное? Что ж ... когда вы используете break, вы пропускаете остальную часть кода в блоке и оставшиеся итерации. Иногда это вызывает ошибки, например:ресурс, полученный наверху блока, может быть освобожден внизу (это верно даже для блоков внутри
for
циклов), но этот шаг освобождения может быть случайно пропущен, когда «преждевременный» выход вызванbreak
оператором (в «современном» C ++, "RAII" используется для надежной и безопасной обработки исключений: в основном деструкторы объектов надежно освобождают ресурсы независимо от того, как выходит из области видимости)кто-то может изменить условный тест в
for
операторе, не заметив других делокализованных условий выходаВ ответе ndim отмечается, что некоторые люди могут избегать
break
s для поддержания относительно согласованного времени выполнения цикла, но вы сравнивалиbreak
с использованием логической переменной управления ранним выходом, где это не выполняетсяВремя от времени люди, наблюдающие за такими ошибками, понимают, что их можно предотвратить / уменьшить с помощью этого правила «без перерывов» ... действительно, существует целая связанная стратегия для «более безопасного» программирования, называемая «структурированное программирование», где каждая функция должна иметь единая точка входа и выхода (т.е. без перехода, без досрочного возврата). Он может устранить некоторые ошибки, но, несомненно, приведет к появлению других. Почему они это делают?
источник
break
. Они избежали этого, но не смогли продумать условия, которые заменили использование перерыва.Его вполне допустимо использовать
break
- как отмечали другие, он нигде не в той же лиге, что иgoto
.Хотя вы можете использовать
vFound
переменную, когда хотите проверить вне цикла, было ли значение найдено в массиве. Также с точки зрения ремонтопригодности может быть полезно наличие общего флага, сигнализирующего о критериях выхода.источник
Я провел некоторый анализ кодовой базы, над которой сейчас работаю (40 000 строк JavaScript).
Я нашел только 22
break
утверждения, из них:switch
операторов (всего у нас всего 3 оператора switch!).for
циклов - код, который я сразу классифицировал как подлежащий рефакторингу в отдельные функции и замененныйreturn
оператором.break
внутреннегоwhile
цикла ... Я побежалgit blame
посмотреть, кто написал эту хрень!Итак, согласно моей статистике: если
break
используется внеswitch
, это запах кода.Я тоже искал
continue
заявления. Не нашел.источник
Я не вижу причин, по которым это было бы плохой практикой, ПРЕДОСТАВЛЯЕМЫЙ, когда вы хотите завершить обработку STOP на этом этапе.
источник
Во встроенном мире есть много кода, который использует следующую конструкцию:
Это очень общий пример, многие вещи происходят за кулисами, в частности, прерывания. Не используйте это как шаблонный код, я просто пытаюсь проиллюстрировать пример.
Мое личное мнение состоит в том, что нет ничего плохого в написании цикла таким образом, если приняты соответствующие меры, чтобы не допустить бесконечного пребывания в цикле.
источник
continue
внутри логики приложения нет операторов. Здесь?Зависит от вашего варианта использования. Есть приложения, в которых время выполнения цикла for должно быть постоянным (например, чтобы удовлетворить некоторым временным ограничениям или скрыть внутренние данные от атак, основанных на времени).
В этих случаях имеет смысл даже установить флаг и проверять значение флага только ПОСЛЕ того
for
, как фактически будут выполнены все итерации цикла. Конечно, все итерации цикла for должны запускать код, который занимает примерно одинаковое время.Если вас не волнует время выполнения ... используйте
break;
и,continue;
чтобы код было легче читать.источник
В правилах MISRA 98, которые используются в моей компании в C-dev, оператор break не должен использоваться ...
Изменить: перерыв разрешен в MISRA '04
источник
Конечно,
break;
это решение для остановки цикла for или цикла foreach. Я использовал его в php в foreach и for loop и обнаружил, что работает.источник
Я не согласен!
Почему вы игнорируете встроенные функции цикла for, чтобы создать свои собственные? Не нужно изобретать велосипед.
Я думаю, что имеет смысл размещать ваши чеки в верхней части цикла for, например
или если вам нужно сначала обработать строку
Таким образом, вы можете написать функцию для выполнения всего и сделать код более чистым.
Или, если ваше состояние сложное, вы также можете убрать этот код!
«Профессиональный кодекс», изобилующий перерывами, мне не кажется профессиональным. Похоже на ленивое кодирование;)
источник
break
утверждают, что это сделано для удобства чтения кода. А теперь посмотрите еще раз на сумасшедшие условия длиной в 5 миль в петлях выше ...