2

この例は C++ で書きましたが、このコード リファクタリングの質問は、Java など、OO を支持するすべての言語にも当てはまります。

基本的に私はクラスAを持っています

class A
{
public:
  void f1();
  void f2();
  //..
private:
  m_a;
};

void A::f1()
{
  assert(m_a);
  m_a->h1()->h2()->GetData();
  //..
}

void A::f2()
{
  assert(m_a);
  m_a->h1()->h2()->GetData();
  //..
}

m_fポインターを保持する新しいプライベート データ メンバーを作成しますm_a->h1()->h2()か? 私が見ることができる利点は、コードを大幅に簡素化するマルチレベル関数呼び出しを効果的に排除することです。

しかし、別の観点から見ると、別の既存のデータメンバーから推測できる「不要な」データメンバーが作成されますがm_a、これはちょっと冗長ですか?

ここでジレンマに陥ります。断然、どちらか一方を使用するように自分に納得させることはできません。

皆さんはどちらが好きですか、理由はありますか?

4

3 に答える 3

6

この手法のファンシーな言葉はキャッシングです。2つのアウェイリファレンスを1回計算し、それをオブジェクトにキャッシュします。一般に、キャッシュを使用すると、計算を高速化するためにコンピュータメモリで「支払う」ことができます。

プロファイラーが、の繰り返し呼び出しにコードがかなりの時間を費やしていることを通知したm_a->h1()->h2()場合、の戻り値が変更さh1h2ない限り、これは正当な最適化である可能性があります。ただし、最初にプロファイリングせずにそのような最適化を行うことは、ほとんどの場合、時期尚早の最適化の悪い兆候です。

パフォーマンスが問題にならない場合は、オブジェクトに格納されている他のメンバーから計算できるメンバーを格納しないようにすることをお勧めします。わかりやすくしたい場合は、適切な名前のメソッド(メンバー関数)を導入して、2アウェイ参照を保存せずに計算できます。保存は、パフォーマンスにとって重要なまれなケースでのみ意味があります。

于 2012-12-17T02:15:22.620 に答える
0

わたしは・・・しないだろう。私はそれがあなたの考案された例の中にあるだけであることに同意します、しかしそれm_a->h1()->h2()は固有の意味を持っていないからです。適切に設計されたアプリケーションでは、使用されるメソッド名は、行われる呼び出しについて定性的なものを示す必要があり、それは自己文書化コードの一部である必要があります。適切に設計されたコードでは、それを呼び出すプライベートメソッドにリダイレクトするよりも、読みやすく理解しやすいm_a->h1()->h2()はずだと私は主張します。

ここで、m_a->h1()->h2()が結果の計算にかなりの時間がかかる高価な呼び出しである場合、@dasblinkenlightが示唆するようにキャッシュの引数がある可能性があります。しかし、数回のキー押下のためにメソッド呼び出しの記述性を捨てることは悪いことです。

于 2012-12-17T02:19:26.407 に答える
0

このようなものがあるときはいつでも、関数の本体で後で再び使用される可能性が高いため、通常、関数スコープで意味のある名前の変数に m_a->h1() を格納します。

于 2012-12-17T07:09:02.390 に答える