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

Продолжить считается вредным?

Должны ли разработчики избегать использования продолжить в С# или его эквиваленте на других языках для принудительной следующей итерации цикла? Могут ли аргументы для или против совпадения с аргументами о Goto?

4b9b3361

Ответ 1

Я думаю, что нужно больше использовать продолжение!

Слишком часто я сталкиваюсь с кодом вроде:

for (...)
{
   if (!cond1)
   {
      if (!cond2)
      {
          ... highly indented lines ...
      }
   }
}

вместо

for (...)
{
   if (cond1 || cond2)
   {
      continue;
   }

   ...
}

Используйте его, чтобы сделать код более удобочитаемым!

Ответ 2

Является continue более опасным, чем, скажем, break?

Во всяком случае, в большинстве случаев, когда я сталкиваюсь/использую его, я нахожу, что он делает код более понятным и менее спагетти-подобным.

Ответ 3

Вы можете написать хороший код с или без продолжения, и вы можете писать плохой код с или без продолжения.

Вероятно, существует некоторое совпадение с аргументами о goto, но, насколько мне известно, использование continue эквивалентно использованию операторов break (в циклах) или оператора return из любого места в теле метода - если оно правильно используется, оно может упростить код (с меньшей вероятностью содержать ошибки, проще в обслуживании).

Ответ 4

Нет вредоносных ключевых слов. Там их только вредное использование.

Goto не является вредным как таковым, и не продолжается. Их нужно тщательно использовать, чтобы все.

Ответ 5

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

Ответ 6

Мне нравится использовать continue в начале циклов для обработки простых условий if.

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

Является ли та же причина, что я буду использовать goto? Может быть. Я иногда использую их для удобочитаемости и останавливаю вложение кода, но я обычно использую их больше для очистки/обработки ошибок.

Ответ 7

Я бы сказал: "это зависит".

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

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

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

Ответ 8

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

Ответ 9

Если вы выполняете итерацию через любой набор результатов и выполняете операции с указанными результатами, например, внутри a для каждого, и если какой-то конкретный результат вызвал проблему, он весьма полезен для захвата ожидаемой ошибки (через try- catch), протоколирование и переход к следующему результату посредством продолжения. Continue особенно полезно, imo, для автоматизированных служб, выполняющих задания в нечетные часы, и одно исключение не должно влиять на другое количество записей x.

Ответ 10

Что касается этого программиста, Вложенный, если /else считается вредным.

Ответ 11

  • Использование continue в начале цикла, чтобы избежать итерации по ненужным элементам, не является вредным и может быть очень полезным, но использование его в середине вложенных ifs и elses может превратить код цикла в сложный лабиринт, понимать и проверять.

  • Я думаю, что его предотвращение использования также является результатом семантического недоразумения. Люди, которые никогда не видят/не записывают ключевое слово "продолжить" на свой код, когда просмотр кода с продолжением может интерпретировать его как "продолжение естественного потока". Если вместо продолжения мы имели next, например, я думаю, что больше людей оценят эту ценную функцию курсора.

Ответ 12

goto может использоваться как продолжение, но не наоборот.

Вы можете "перейти" в любом месте, тем самым произвольно отрегулируйте управление потоком.

Таким образом, продолжайте, не так уж вредно.

Ответ 13

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

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

Ответ 14

Continue - действительно полезная функция в большинстве языков, поскольку она позволяет пропускать блоки кода для определенных условий.

Один из вариантов - использовать логические переменные в операторах if, но после каждого использования они должны быть reset.

Ответ 15

Я бы сказал, да. Для меня это просто ломает "поток" написанного с жидкостью фрагмента кода.

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

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

Ответ 16

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

С другой стороны, вы можете эмулировать continue с break (по крайней мере, в Java).

for (String str : strs) contLp: {
    ...
       break contLp;
    ...
}

(Эта публикация имела явную ошибку в приведенном выше коде более десяти лет. Это не выглядит хорошо для break/continue.)

continue может быть полезно в некоторых обстоятельствах, но оно все еще кажется мне грязным. Возможно, пришло время представить новый метод.

for (char c : cs) {
    final int i;
    if ('0' <= c && c <= '9') {
        i = c - '0';
    } else if ('a' <= c && c <= 'z') {
        i = c - 'a' + 10;
    } else {
        continue;
    }
    ... use i ...
}

Такое использование должно быть очень редким.

Ответ 17

Я считаю, что аргумент нижней строки для продолжения состоит в том, что это затрудняет ПРОВЕРИТЬ, что код верен. Это доказывается в математическом смысле. Но это, вероятно, не имеет значения для вас, потому что у кого-то нет ресурсов, чтобы "доказать" сложную компьютерную программу.

Введите инструменты статического анализа. Вы можете усложнить их...

И goto, это звучит как кошмар по тем же причинам, но в любом случайном месте в коде.