2016-10-29 9 views
0

Webベースのアプリケーションを使用する場合、頻繁に変更されないクエリ結果(または計算能力がかなり必要な複雑な計算結果)は、メモリまたはファイルベースのデータストアにキャッシュされます。 これらの結果は、リクエストごとに変更される可能性がありますが、アプリケーション内のいくつかのクラスによって消費される場合、SOLIDを維持しながらリクエストの間この情報をキャッシュするにはどうすればよいでしょうか?リクエスト中に再計算や二重クエリを避けるための良い設計パターンは何ですか?

私が見ている最も単純な解決策、そして私が今実装しているのは、結果がすでに計算/取得されているかどうかをチェックしているかどうか、そうでない場合は計算して変数に格納することです。次のように私はこのアプローチを見

public function getSomething() 
{ 
    if(! isset($this->something)) 
    { 
     $this->something = $this->calculateSomething(); 
    } 

return $this->something; 
} 

問題は、次のとおりです。

  • 私はどこでも私は「何か」を必要とすることを確認する必要があり、私は、同じオブジェクトインスタンスへのアクセス権を持っている(または私は使用することができます静的変数はさらに悪化する)。これは、依存関係注入を使用し、そのクラスからインスタンスを要求するたびに同じものが返されることを確認することで実現できますが、どういうわけか私は間違った問題に大丈夫な解決策を適用していると感じています。最終的に私のアプリは特定のインスタンスの依存関係で満たされます。私はこれが悪いことかどうか本当にわからない、私を修正するために自由に感じる。
  • 私のクラスは、本質的に同じことをしているこれらのif文で満たされます。 (変数が設定されているかどうかをチェックし、設定されていない場合は変数を設定して返します)。

私はもっと良い解決策を探していましたが、リクエストを1回だけキャッシュするだけでは(デコレータパターンを使用してクラスをきれいに保つ)こともできませんでした。

この共通の問題を解決するうえで、どのような方法で実装することができますか?

答えて

1

私自身の質問に対する答えを見つけたようです。

メモと呼ばれるテクニック(または、それを呼びたい場合のパターン)。

エドマンによるこの記事は1つが、それを実装する方法で良い実用的な例を提供します。

http://eddmann.com/posts/implementing-and-using-memoization-in-php/

この例のコードは手続きですが、簡単にオブジェクト指向環境での使用に適合させることができます。

これはすべて、特定のシナリオでかなりのパフォーマンスを引き出すことができる非常に単純な手法です。私は確かにこれを他の誰かに説明しようとするときに私が使用できる言葉を持っていることを嬉しく思います! :-)

+0

ご質問ありがとうございます!私はあなたがこれを尋ねたので好奇心旺盛でしたが、私は自分で答えを見つけませんでした。 – CodeShark

関連する問題