1. ホーム

[解決済み】"while(true) "ループはそんなに悪いのか?[クローズド]

2022-04-21 09:50:47

質問

私は数年前からJavaでプログラミングをしていますが、つい最近、正式な学位を取得するために学校に戻ってきたところです。最後の課題で、以下のようなループを使うと減点されると知って、かなり驚きました。

do{
     //get some input.
     //if the input meets my conditions, break;
     //Otherwise ask again.
} while(true)

私のテストではコンソールの入力をスキャンしているだけですが、このようなループは推奨されないと聞きました。 break と同じようなものです。 goto しかし、私たちはそれをしないだけです。

の落とし穴は十分理解しています。 goto と、そのJava版である break:label そして、私はそれらを使わないという良識を持っています。また、より完全なプログラムであれば、例えばプログラムを終了させるなど、何か他の脱出方法を提供することになると思いますが、教授が挙げた理由はそれではなかったので、...。

の何が問題なのでしょうか? do-while(true) ?

解決方法は?

とは言いません。 悪い - でも、普通なら代替品を探すくらいはしますよね。

最初に書くような状況では、ほとんどいつも少なくとも 試みる より明確なものにするためにリファクタリングする必要があります。どうしようもない場合もあります(あるいは、代替案として bool 変数は、ループの終わりを示す以外には何の意味も持ちません。 break ステートメント)ですが、少なくとも試してみる価値はあります。

を使った方が分かりやすい例として break フラグよりも、考えてみてください。

while (true)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        break;
    }
    actOnInput(input);
}

では、強制的にフラグを使用するようにしてみましょう。

boolean running = true;
while (running)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        running = false;
    }
    else
    {
        actOnInput(input);
    }
}

私は、後者の方が読むのが複雑だと考えています。 else ブロックは actOnInput がよりインデントされていることを確認します。 testCondition を返します。 true がないことを確認するために、ブロックの残りの部分を注意深く見ていく必要があります。 else ブロックが作成されます。 running に設定されています。 false を表示するかどうかを設定します。

は、その break ステートメントを使用すると、意図がより明確に伝わり、ブロックの残りの部分は以前の条件を気にすることなく、必要な処理に取り掛かることができるようになります。

これは、メソッド内に複数のreturnステートメントがある場合と全く同じ種類の議論であることに注意してください。たとえば、最初の数行でメソッドの結果がわかる場合 (たとえば入力が null や空、ゼロなど)、その結果を直接返すほうが、結果を格納する変数や他のコードのブロック全体、そして 最後に a return ステートメントを使用します。