Вопрос

Следует ли разработчикам избегать использования продолжать в C# или его эквиваленте на других языках, чтобы принудительно выполнить следующую итерацию цикла?Будут ли аргументы за или против пересекаться с аргументами о Идти к?

Это было полезно?

Решение

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

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

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

вместо

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

   ...
}

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Так продолжайте, не так вредно.

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

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

Я бы сказал да.На мой взгляд, это просто нарушает «поток» плавно написанного фрагмента кода.

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

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

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

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

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

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

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

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

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 ...
}

Я считаю, что основной аргумент против продолжения заключается в том, что из-за него сложнее ДОКАЗАТЬ правильность кода.Это доказательство в математическом смысле.Но для вас это, вероятно, не имеет значения, потому что ни у кого нет ресурсов, чтобы «проверить» компьютерную программу, которая является достаточно сложной.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top