2

短絡評価に頼るとコードが壊れやすくなりますか? 基本的に次のようなコードを書きました。私の教授は私にそれを書き直してほしかった。

(注: どのストリームでも「次のトークン」は 1 つしかないため、4 つの条件のうち 1 つだけが true になることは確かですよね?)

foo getFoo()
{
        Bar bar;
        if ((bar = peekAndGet('x')) != null 
                || (bar = peekAndGet('y')) != null 
                || (bar = peekAndGet('z')) != null 
                || (bar = peekAndGet('t')) != null) 
            return produce(bar);
        else 
            return null;
}

これは本当に壊れやすいですか?完璧に機能していると思います。でもどうやって書き直せばいいの?

4

4 に答える 4

7

私はそれをリファクタリングして、次のように書きます。

char[] values = {'x', 'y', 'z', 't'};
for (char c : values) {
    Bar bar = peekAndGet(c);
    if (bar != null) return produce(bar);
}
return null;

注: それを行う正当な理由の 1 つは、最初にコードを読んだときに、質問を読むまでバグがあるように見えると思ったことです。本当に間違っていることについては、「何かがおかしいように見える」瞬間を維持したいと考えています。

于 2013-03-13T03:10:46.533 に答える
1

問題なのは短絡だけではありません。おそらくターゲットになるのは、短絡と副作用です。コードが理解しにくくなり、壊れやすくなるため、広く嫌われています。あなたの場合、それは少し面倒ですが、次の例を見てください:

if ((b && c++ > 1) || (c++ < 10)) { ... }

そのような場合に何が起こっているのかを追跡できるのは誰cですか?

于 2013-03-13T03:08:00.383 に答える
1

if ステートメント内で Bar オブジェクトを初期化している場合は、if ステートメントの外で初期化してみてください。

于 2013-03-13T03:01:10.687 に答える
1

コードは少しも壊れやすいわけではありません。その動作は Java 言語仕様によって完全に指定されており、意図したとおりに動作します。

複数の副作用、特に同じ変数への複数の割り当てがあると、コードが読みにくくなる可能性があるため、JLS では推奨されていません。

于 2013-03-13T03:15:04.507 に答える