質問

開発者は使用を避けるべきか 続く C# または他の言語の同等の言語でループの次の反復を強制するにはどうすればよいですか?賛成または反対の議論は、次のことについての議論と重複しますか? 後藤?

役に立ちましたか?

解決

もっとコンティニューを活用すべきだと思います!

次のようなコードに遭遇することがよくあります。

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

の代わりに

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

   ...
}

コードを読みやすくするために使用してください。

他のヒント

continue たとえば、 break?

むしろ、私がこれに出会ったり使用したりするほとんどのケースでは、コードがより明確になり、スパゲッティのようなものが少なくなっていることがわかります。

継続の有無にかかわらず、良いコードを書くこともできますし、継続の有無にかかわらず、悪いコードを書くこともできます。

おそらく goto に関する引数と重複する部分もありますが、私が知る限り、 continue の使用は、メソッド本体の任意の場所から Break ステートメント (ループ内) または return ステートメントを使用するのと同等です。正しく使用すると、コードを簡素化できます。 (バグが含まれる可能性が低く、保守が容易です)。

有害なキーワードはありません。有害な使用法しかありません。

Goto 自体は有害ではありませんし、継続することもできません。慎重に使用する必要がある、それだけです。

continue によって読みやすさに問題が発生する場合は、他の問題が発生している可能性があります。たとえば、for ループ内の大量のコードなどです。大きな for ループを記述する必要がある場合は、for ループの先頭近くで continue を使用することに固執するようにします。そうしないと、for ループの途中に深く埋め込まれた continue が簡単に見落とされてしまう可能性があります。

私は単純な if 条件を処理するためにループの先頭で continue を使用することを好みます。

私にとっては、余分な入れ子がないためコードが読みやすくなり、これらのケースに明示的に対処していることがわかります。

これは goto を使用する理由と同じですか?多分。読みやすくするためやコードのネストを止めるためにこれらを使用することもありますが、通常はクリーンアップやエラー処理のために使用します。

私ならこう言います:"場合によります"。

ループ コードがかなり小さい場合 (スクロールせずにループ コード全体が表示される場合)、通常は continue を使用しても問題ありません。

ただし、ループ本体が大きく (大きなスイッチなどによる)、フォローアップ コード (たとえばスイッチの下など) がある場合は、Continue を追加してそのコードをスキップすることにより、簡単にバグが発生する可能性があります。私は、バイトコード インタプリタの中心部でこの問題に遭遇しました。この問題では、一部のケース分岐での続行が原因で、一部のインストルメンテーション コードが実行されないことがありました。

これはやや人為的に構築されたケースかもしれませんが、私は通常は continue を避けて if を使用するようにしています (ただし、Rob のサンプル コードのようにネストが深すぎないようにします)。

continue は goto ほど難しいものではないと思います。

あらゆる種類の結果セットを反復処理し、たとえば for each 内でその結果に対して操作を実行する場合、および 1 つの特定の結果が問題を引き起こした場合、予期されるエラー (try-catch 経由) をキャプチャするのにかなり役立ちます。それをログに記録し、続行を通じて次の結果に進みます。Continue は、奇数の時間にジョブを実行する無人サービスの場合に特に便利で、1 つの例外が他の x 個のレコードに影響を与えるべきではありません。

  1. 不要な要素の反復を避けるためにループの先頭で continue を使用することは有害ではなく、非常に便利ですが、ネストされた if と else の途中で使用すると、理解して検証するためにループ コードが複雑な迷路に変わる可能性があります。

  2. その使用回避も意味上の誤解の結果だと思います。コード上に「Continue」キーワードを見たり書いたりしたことがない人でも、Continue が含まれるコードを見ると、それを「自然な流れの続き」と解釈してしまう可能性があります。続行する代わりに , たとえば、この貴重なカーソル機能をより多くの人が評価すると思います。

goto は続行として使用できますが、その逆は使用できません。

どこでも「goto」できるため、フロー制御を任意に破ることができます。

したがって、それほど有害ではなく継続します。

他の人もそれを示唆していました...ただし、続行と中断は、 コンパイラ 独自の関連ルールがあります。Goto にはそのような制限はありませんが、最終的な効果は次のとおりです。 かもしれない 状況によってはほぼ同じです。

私は continue や Break がそれ自体有害であるとは考えていませんが、どちらも賢明なプログラマーであればギャグになるような使い方を誤る可能性があると確信しています。

そうだと思います。私にとって、それは流れるように書かれたコードの「流れ」を壊すだけです。

もう 1 つの議論は、ほとんどの最新言語でサポートされている基本的なキーワードに固執すれば、プログラム フロー (ロジックやコードではない場合) を他の言語に移植できるということです。サポートされていないキーワード (Continue または goto) を使用すると、それが壊れます。

これは実際には個人的な好みですが、私はこれを使用する必要があったことは一度もありませんし、新しいコードを書くときにそれがオプションであるとは考えていません。(gotoと同じです。)

このプログラマーに関する限り、 ネストされた if/else 有害であると考えられています。

Continue は、特定の条件でコードのブロックをスキップできるため、ほとんどの言語で非常に便利な機能です。

代替の 1 つは、if ステートメントでブール変数を使用することですが、これらは使用するたびにリセットする必要があります。

続けるのは私には間違っていると感じます。休憩すればそこから抜け出すことができますが、続けるのは単なるスパゲッティのようです。

一方、(少なくとも Java では) Break with continue をエミュレートできます。

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

continue に対する最も重要な議論は、コードが正しいことを証明するのが難しくなるということだと思います。これは数学的な意味で証明されます。しかし、非常に複雑なコンピューター プログラムを「証明」するリソースを持っている人は誰もいないため、おそらくそれはあなたにとっては重要ではありません。

静的解析ツールを導入します。あなたは彼らにとって物事をさらに難しくするかもしれません...

そして goto は、同じ理由で悪夢のように聞こえますが、コード内のランダムな場所にあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top