Подтвердить что ты не робот

Разрыв цикла "за" с использованием "перерыва" считается вредным?

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

Он добавил, однако, что я найду несколько случаев операторов break внутри циклов for в исходном коде ядра Linux, но это было только потому, что ему разрешили использовать только Линус Торвальдс и Чак Норрис, и никто другой.

Как вы думаете? Я не вижу проблемы при использовании break внутри цикла for. На мой взгляд, эмуляция поведения break с использованием логических переменных или что-то подобное добавляет много накладных расходов и делает код менее простым.

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

4b9b3361

Ответ 1

Я не вижу проблем с использованием перерывов. Всегда будут ситуации, когда вы хотите прекратить обработку цикла, а использование break; имеет гораздо больший смысл (и делает его более читаемым!), Чем установка вашего счетчика циклов до значения, которое сделает ваш цикл остановленным на следующем итерации.

Ответ 2

Обязательно:

XKCD Goto

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

Все о ясности. Как вы сказали, вам никогда не придется использовать его, но в некоторых случаях это способствует удобочитаемости. Это полезно, когда цикл обычно заканчивается нормально, но в редких случаях вам приходится выручать. Петли, которые обычно (или всегда) ломаются, скорее являются запахами кода (но все равно могут быть подходящими). ​​

Ответ 3

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

break - это языковая функция, используемая для прерывания цикла - вы можете использовать goto, но затем вы подвергаетесь (соответствующему) гневу комикса XKCD ниже. Вы можете использовать флаг в состоянии, но это затрудняет читаемость. break - это не только самый простой, но и самый ясный способ много раз вырваться из цикла. Используйте его так, как оно предназначено для использования.


Изменить: Чтобы получить увеличенное изображение здесь: Когда вы пишете код, руководящим принципом "Должен ли я использовать языковые функции X или Y" должно быть "в каком случае это приведет к более элегантному коду"? Элегантность, в коде, - это в значительной степени искусство, но я бы положил его как прекрасный баланс между читабельностью и алгоритмической (читай: не микро-оптимизацией) эффективностью. Читаемость будет определяться длиной, сложностью кода и т.д. Однострочный boost:: bind может быть очень трудным для чтения и понимания, чем трехстрочный цикл.

Если функция языка может помочь вам написать код, который легче понять, выполняя задание, используйте его. Это относится к исключениям break, goto, С++ и т.д. Не следуйте "X (злой | считается вредным)" слепо - каждый раз применяйте здравый смысл и логику.

Ответ 4

Нет проблем с break, а также ОК, чтобы использовать goto, когда break недостаточно. Не бойтесь нескольких возвратов.

Все вышеизложенное применяется только в том случае, если код упрощает понимание *.

* И если ваш PHB позволяет это...

Ответ 5

Я думаю, что ваш помощник сумасшедший. break является совершенно приемлемым, прекрасно читаемым и прекрасно поддерживается. Период.

Ответ 6

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

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

Ответ 7

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

Фактически, в некоторых случаях я бы рекомендовал его. Например, если вы использовали линейный поиск, в любом случае (кроме самого худшего случая), break улучшит вашу скорость. Я думаю, что выйдя из цикла, когда вы нашли свой игла была бы вполне приемлемой, и она была бы более читаемой, чем возиться с переменной цикла (которая может не использоваться исключительно для цикла, в зависимости от вашей программы) или обертывания тела цикла в блоке if. (И другой вариант, if, который содержит continue, объединяет худший из двух миров: обертывание логики цикла в блоке if и плохой стиль кодирования, созданный против таких людей, как ваши друзья, которые не любят break.)

Ответ 8

Увеличение счетчика циклов вместо использования break также означает, что вы закончите выполнение текущей итерации цикла, что может быть или не быть желательным.
Конечно, вы можете обернуть остальную часть в предложении if, а затем повторите это, когда поймете, что вам нужно проверить, прекращать ли цикл несколько раз, и вы быстро поймете, почему люди используют break;

Ответ 9

Я предлагаю этот алгоритм, если вы планируете использовать данную технику.

  • Если считается хорошей практикой:
    • используйте его.
  • Если это не считается хорошей практикой:
    • используйте его, только если вы считаете, что это лучшее долгосрочное решение.
  • Если это считается злом:
    • используйте его, только если вы считаете, что это лучшее долгосрочное решение, и вы очень уверены в своем суждении. Остерегайтесь: вещи, которые считаются злыми, как правило, обманчиво привлекательны.

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