web-dev-qa-db-ja.com

使い捨ての一時変数を使用する必要があるのはなぜですか?

「Automobile」というクラスがあり、「myCar」というそのクラスのインスタンスがあるとします。メソッドが返す値を変数に入れる必要があるのはなぜですか?メソッドを呼び出さないのはなぜですか?

たとえば、なぜ次のように記述する必要がありますか。

string message = myCar.SpeedMessage();
Console.WriteLine(message);

の代わりに:

Console.WriteLine(myCar.SpeedMessage());
7
Goma

短い答え:ありません。どちらの例もまったく問題ありません。

とにかく一時的な変数を使用する理由は3つあります(最初の例のように)。

  1. 中間値に明示的な名前を付けます(これは、古い文字列だけでなく、messageであることがわかりました)。
  2. これにより、ステートメントが長くなりすぎたり複雑になったりするのを防ぐことができます。
  3. 各部分を個別にステップオーバーできるため、ステップデバッグが容易になります(ただし、サブラインの精度で動作するステップデバッガーはあります)。
49
tdammers

ほとんどの言語では必要ありませんが、ゲッターを使用してメソッドに渡したい場合に便利です。

bar.doBaz(faa.getFoo())

しかし、特にそれが重要な関数である場合、呼び出しを分離することで読みやすさを向上させることができます

また、追加の行を犠牲にして呼び出しの水平フットプリントを削減します(新しい変数の名前が短い場合)

4
ratchet freak

特にif内の長い式や、コードを画面の右側から外す関数呼び出しを評価するときに、追加の変数が一般的な読みやすさを向上させる場合があります。

Java 5以降(および多くの同様の言語))では、追加の変数がnullポインター例外の原因を見つけるのに役立ちます。次のJavaを検討してくださいJavaの「オートボクシング」に依存してIntegerオブジェクトをintプリミティブに変換するコード:

public int add(Integer firstIntObj, Integer secondIntObj) {
    return firstIntObj + secondIntObj;
}

初期化されていない(nullIntegerオブジェクトをプリミティブintに変換すると、NullPointerExceptionがスローされますが、この例外は、2つの考えられる原因は同じ行にあります。次の例では、null入力ごとに異なる行が表示されるため、例外の行番号は、どちらがnullだったかを示します。

public int add(Integer firstIntObj, Integer secondIntObj) {
    int first = firstIntObj;
    int second = secondIntObj;
    return first + second;
}

これを処理するためのより良い方法は、このメソッドを呼び出す誰かがソースコードを必要とせずに自分の問題を診断できるように、独自の説明的な例外をスローすることです。

public int add(Integer firstIntObj, Integer secondIntObj) {
    if (firstIntObj == null) {
        throw new IllegalArgumentException("First argument was null!");
    }
    if (secondIntObj == null) {
        throw new IllegalArgumentException("Second argument was null!");
    }
    return firstIntObj + secondIntObj;
}

この手法は、複数の例外をスローする可能性のある行を分割するために使用できます。個別の変数を使用すると、説明的な例外をスローするよりもタイピングが少なくなります。すばやく簡単に行えます。

4
GlenPeterson

この場合は問題ではありませんが、より大きなシステムで作業している場合、次のような問題が発生する可能性があります。

  1. デバッグがはるかに簡単になります
  2. あなたが私のところまであなたのコードを圧縮する習慣があるなら、それはそれを実際に読みやすくします:すなわち:

square(getNum1(var1,var2[(param1+(param2%2))]),obj1.getNum2(((ptr1+dynamicOffset1)+5)(getMult(NULL))))

2
Inverted Llama