web-dev-qa-db-ja.com

`switch`以外のループで` continue`、 `break`を使用していて、`?: `は悪い習慣ですか?

大学に戻ったとき、break;およびcontinue;外部switchステートメント(たとえば、forまたはwhileループをエスケープするため)は、ループを作成できないことを意味するだけであるため、間違っており、習慣と習慣が同時にありません。正しく。本当か?

私の友人も条件付きの?:も悪い習慣ですが、70行未満のコードで記述できるため、これを使用しないと、200行のコードのようになるため、これをより頻繁に使用し始めました。それは私が取り組んでいるほとんどすべてのプロジェクトで非常に役立ち、私はそれをかなり頻繁に使用しています。やめるべきか?

4
user84585

breakおよびcontinue

breakcontinueに根本的な問題はないと思います。それらを回避する動機は、本当に何よりも読みやすさを向上させることだと思います。次のループを検討してください(厳密にはc/c ++コードではありません)。

// loop 1
for(int i = 0; i < a.length; i++)
{
    if (!found(a[i]))
        continue;

    result = a[i];
    break;
}

// loop 2
for(int i = 0; i < a.length; i++)
{
    if (found(a[i]))
    {
        result = a[i];
        break;
    }
}

// loop 3
{
    bool resultFound = false;
    for(int i = 0; !resultFound && i < a.length; i++)
    {
        if (found(a[i]))
        {
            result = a[i];
            resultFound = true;
        }
    }
}

これら3つのループはすべて基本的に同じコードを実行しますが、少し異なる方法で記述されています。本当の質問は、著者の意図を最も効果的に伝えるものはどれですか?

  • ループ1-非常に悪い。ここでのロジックは逆になっているようで、continueはかなり無償です。英語に翻訳すると、次のようになります。

    アイテムが見つからないときにリストをループしますが、設定されている場合は結果を停止します。

  • ループ2-良い。これは、そのようなループが一般的に記述される方法です。英語に翻訳すると、次のようになります。

    リストをループし、アイテムが見つかった場合、結果を設定して停止します。

  • ループ3-やや悪い。中断/継続ロジックはforループの条件にありますが、あまり一般的ではありません。つまり、コードを読んでいる人が次に何が起こるかを知りたい場合は、ループの先頭に戻る必要があります。 break(ループ2と同様)は、ロジックを1か所に指定します。英語に翻訳すると、次のようになります。

    アイテムが見つからないときにリストをループし、アイテムが見つかった場合は結果を設定します。

?:演算子

繰り返しますが、根本的に問題はありません。それは本当に個人的なスタイルと読みやすさの問題です。

// Good uses of conditional operator
string result = (someBool) ? "YES" : "NO";
string oddness = (someInt % 2 == 0) ? "even" : "odd";

// Bad use of conditional operator
int result = ConditionA() ? (ConditionB() ? 0 : 1) : (ConditionC() ? 2 : 3);

ここでも、プログラマーの意図は最初の2つの例ではかなり明確ですが、最後の例でははるかに曖昧です。

13
p.s.w.g

breakcontinueは非常に貴重です。コードを短くして読みやすくすることがよくあります。

まあ、そうでない場合を除いて。 1つのブロックでそれらを頻繁に使用したり、複数回使用したりする場合は、ループ本体を関数(つまり、OO用語の「メソッド」)にしたい場合があります。場合によっては、複数のブレークと継続を含むブロックよりも、早期に復帰する関数を使用する方が適切です。

?:に関しては、これは実際にはifステートメントの機能上のいとこです。関数型プログラミングはおしゃれなので、はい、使用してください。しかし、ここで他の人が言っているように、関数型コードには副作用がないはずです。

4
Ingo

それはプログラマーの単なるツールです。それ自体が悪いまたは良いツールはありません。それは、ユーザーがそのツールをどれだけ効率的に使用できるか、およびそれを使用して何を生成できるかがユーザーにあります。

最適化されたコードを記述したい場合や、ループにさらに進む必要がない場合に必要になります。

Breakステートメントを使用する非常に一般的な例は、バブルソートアルゴリズムです。ループ内でスワップが行われていない場合は、配列が既にソートされているため、それ以上のループを停止することを確認してください。

ネストされたループにうまく使用されず、フローを忘れてネストされたループにあまりにも多く埋め込んでしまうと、コードに論理エラーが発生する可能性が高くなります。

?: ---コードを記述する方法です。ほんの短い手であり、ツールでもあり、どこで使用するかによって異なります。一部の場所でコード行を減らすことができると同時に、コードの可読性を低下させる可能性があります。

1
Abdul Rehman