2011-07-07 36 views
1

私はしばしばコーディングの際にこの問題に遭遇します。メソッド/関数を2回呼び出す変数に保存して一度呼び出す

次の例のどれが良い方法ですか?私は他の要因がどちらか一方がより良いかどうかに影響を与えることを認識しています。しかし、一般的には、どちらか一方の利点は何か。

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

対。

var a = object.method(x).Value; 
var b = object.method(x).Key; 

対:ここ

​​

は、別の同様の例であります言い換えれば

var y = object,method(x); 
var a = y.Value; 
var b = y.Key; 

、私の質問は:

は、それが二回メソッドを呼び出し、1つの以下の変数を持っている方が良いですか? または 変数に保存してメソッドを2回呼び出す方が良いですか?

もちろん、メソッドの処理が多い場合は、一度呼び出すほうが賢明かもしれませんが、メソッドがあまりにも厳しくなく、変数のスペースが大きすぎない場合は一般的ですなぜ?またはどちらかの利点は何ですか?

これらの違いは大きな違いはありませんが、私はより良い方法を見つけようとしており、経験豊富なプログラマーの意見を聞きたいと思います。

感謝

答えて

1

変数に値をキャッシュするのが基本的な最適化です(メモに関連します)。

本当に必要になったのは、関数への2回目の呼び出しがスタック上にかなりの時間がかかる場合です。

たとえば、その2番目の呼び出しが時間の10%または20%のスタックにある場合、それは最初の結果をキャッシュすることによって保存できる全体の時間です。

You can keep doing things like that, until the code is as fast as possible.

私は例を与えることができれば、年齢は前に私はこのようなコードを持っていたアプリに取り組んだ:Done()を呼び出すために、このような、短いクリーン、かつシンプルな機能であったため

if (!Done()){ 
    do some stuff 
} 
.... 
if (!Done()){ 
    do some other stuff 
} 

、それはたくさん呼ばれた。 DBからたくさんのものを照会し、大半を投げ捨てることを含めて、それが大変だったことに気をつけてください。 Stackshotsすぐに問題が見つかりました。

+0

アドバイスをいただきありがとうございます。新しいものを学ぶか、それをもっとうまくやることを学ぶのは良いことです – tif

1

あなたがスレッドセーフになりたい場合や関数呼び出しの間で変更することができればそれが依存。

プロパティのゲッターValueの実装は、2回目の呼び出しでヌルを返した場合

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

であなたは別の答えを持っているでしょう。メソッドの実装によって、またはプロパティの結果をnullにしたif文とreturn文の間の更新を別のスレッドが実行した場合に、2番目の呼び出しでnullを返すことがあります。

nullの場合はnullを返すため、このテストは実際には冗長です。私はあなたがif (object.getA() != null)を意味すると推測しています。前の段落は引き続き適用されますが、ValueではなくgetA()に適用されますが、getA()が2番目の呼び出しでnullを返した場合、if本体はnull参照例外をスローします。

したがって、呼び出しの間で値が変わるのを心配しているかどうかは分かりません。

1

一般的なルール:余分な変数を避ける(不必要に状態を導入する)。 (関数を2回呼び出すとオーバーヘッドが大きくなりすぎるとルールが破られる)

関連する問題