5

シナリオは、値に少なくとも 2 回アクセスする必要があるというものです。つまり、ロガーを使用して、アプリケーションで何が起こっているかを追跡しています。オブジェクトの名前をログに記録したいのですが、その関数は機能しており、後でまったく同じ名前で何かを行います(つまり、文字列が含まれているかどうかを確認するか、配列に入れます)。

名前を変数に格納する:

foo(Bar bar){
    String name = bar.getName();
    logger.info("I am working with "+name);
    this.doSomethingWith(name);
}

または getName() を 2 回呼び出します。

foo(Bar bar){
    logger.info("I am working with "+bar.getName());
    this.doSomethingWith(bar.getName());
}

最初のシナリオでは、新しい文字列を作成し、それに値を割り当ててから、この値を 2 回取得することを理解しています。このようにして、より多くのメモリ リソースを使用していますよね?

2 番目のシナリオでは、オブジェクト バーに 2 回アクセスしてから、その名前に 2 回アクセスしていますか。これは DRY アプローチではないと思います。しかし一方で、私は記憶の中で自分自身を繰り返していませんよね?

どちらのアプローチが優れていますか?

4

3 に答える 3

3

Stringは不変オブジェクトであるため、最初の例ではより多くのメモリを使用していません。そのため、String への参照は、メモリ内の同じオブジェクトへのポインタにすぎません。

後者のオプションにはgetName()、呼び出し間で の結果が変わる可能性があるスレッド セーフの問題もあります。可能性は低いかもしれませんが、考慮に入れる必要があるかもしれません。

それを念頭に置いて、私は最初のオプションをお勧めします。

注: がgetName()計算によって生成される可能性もあります。その場合、実際には最初の方法よりも多くのメモリを使用する 2 番目の方法になります。

于 2012-10-05T13:33:02.383 に答える
1

不変Barクラスにする必要があります(ほとんどの場合)。不変クラスの場合、これらのアプローチは同じであるため、好きなものを選択してください。

実際の問題は が変更可能な場合Barにのみ発生するため、 の値はbar.name2 回の読み取り間で変化する可能性があります。しかし、この場合Bar、ドメインオブジェクトとして使用することは意味がありません。barの上部に のローカル コピーを作成することで、このようなケースを回避できますfoo()。次に、オリジナルのローカル コピーをbar取得したら、好きな方法を選択できます。

ですから、これは好みの問題です。はい、最初のケースではローカル参照のためにわずかなメモリを浪費する可能性がありますが、ほとんどの場合、JVM はそれを最適化して、バイトコード レベルで 2 番目の方法のように見せます。

于 2012-10-05T13:31:24.310 に答える
1

個人的には、2 番目のアプローチを好みます。実際、私は通常、必要な場合にのみ一時変数を作成します。

Martin Fowler ( http://en.wikipedia.org/wiki/Martin_Fowler ) もこのガイドラインに従っています。彼は、私が読んだ本の中で次のように述べています。

http://www.amazon.fr/Refactoring-Improving-Design-Existing-Code/dp/0201485672

このトピックに関する本の無料の抜粋は次のとおりです。

http://sourcemaking.com/refactoring/replace-temp-with-query

一時変数を削除するとパフォーマンスの問題が発生する可能性があると主張する人もいます。

マーティン・ファウラーは次のように述べています。

この場合、パフォーマンスが心配になる場合があります。他のパフォーマンスの問題と同様に、しばらくスライドさせてください。10回のうち9回は問題ありません。それが重要な場合は、最適化中に問題を修正します。コードをより適切にファクタリングすると、リファクタリングを行わなければ見逃していた、より強力な最適化が見つかることがよくあります。さらに悪化した場合、温度を元に戻すのは非常に簡単です。

しかし、とにかく、それは好みの問題です。最初のアプローチの方が読みやすいと感じる人もいれば、2 番目のアプローチの方が読みやすいと感じる人もいます。一時変数が実際の値のない行を追加するのが嫌いなので、私は2番目を本当に好みます:)

于 2012-10-05T13:32:48.850 に答える