2011-05-27 16 views
0

私はポーリングシステムを持っています。私は、フィルタリングされた票のサブセットに基づいて結果を計算できるようにしたい。これを行うには、呼び出し側がサブクエリをモデルに渡し、結果を計算するときに投票のサブセットのみを選択するようにします。キャッシュされたフィルタリングされた集計方法

キャッシュの結果はキャッシュされ、クエリはキャッシュハッシュの恐ろしいキーのポイントまで柔軟になります。これは私があなたのところに来るところです:良いコードの練習、信頼できるキャッシング(つまり、物事がキャッシュされていることを容易に理解できる)とフィルターの柔軟性との間で最良のバランスを取るためには、結果メソッドにフィルターを渡すべきですか?

オプション1:それを吸うと、クエリと一緒に暮らす

をハッシュ法はこのような何かを見ているように、各メソッドに$ voteFilterを渡す:

class Poll { 
    getResults($voteFilter) {...} // Returns the poll results for passed filter 
    getWinner($voteFilter) {...} // Returns the winning result for passed filter 
    isTie($voteFilter) {...} // Returns tie status for passed filter 
} 

をメソッドがそれらのキャッシュをチェックしますそのフィルタクエリが使用されていた場合、それらの結果が使用されます。これは、わずかに異なるクエリによって生成された同じ結果セットを持つことができるため(つまり、反映する論理句の順序が入れ替えられるため)、危険です。私は、これはコーダーが意図的にキャッシュを使用していない可能性があることを意味します。

これは、私が必要としないときに多くのことをやりとりしているようにも感じます。おそらく、コーダはすべての結果メソッドで1つのフィルタセットを使用しています。勝者とネクタイの状態、それはおそらく、任意の時点で、同じ投票フィルタになります)

オプション2:現在されているの$ voteFilterを渡し別のクラスのメソッド

を使用してフィルタを設定します結果セッションを開始するsetFilter()メソッドを使用して使用されます。これにより、呼び出されるたびにキャッシュがリセットされ、次回setFilterが呼び出されるまで結果メソッドで使用されるフィルタが指示されます。このように見える:

class Poll { 
    setVoteFilter($voteFilter) {...} // Clears cache and sets vote filter 
    getResults() {...} // Returns the poll results for current filter 
    getWinner() {...} // Returns the winning result for current filter 
    isTie() {...} // Returns tie status for current filter 
} 

このオプションは、よりエレガントな感じ、私はそれが好き、私はそれが悪い形で、ものの一種であるならば、私は2ヶ月で見て、「これを言うだろうかわかりません。

「なぜ私は明示的なパラメータなしのメソッドを作ったであろう恐ろしいですオプション3:より剛性のフィルタリング技術を定義

私はフィルタリングすることができる方法を制限する場合は、私がする余地を持たないフィルタパラメータを作成することができますオプション1のあいまい性の問題を解決することができます。これにより、柔軟性が制限され、 dable API。私はこの選択肢が一番好きですが、誰かが強い考えを持っている場合に備えて、ここでそれを捨てて考えようとしました。

誰でも洞察力がありますか?その他のオプション?

答えて

1

Pollのようなシグネチャを持つ不変であることを想像して:あなたは注意してくださいしかしとして、与えられたフィルタは、(おそらく累積適用したポーリングオブジェクトを返しますwithFilter

class Poll { 
    withFilter(filter) 
    getFilter(...) 
    getResults(...) 
    getWinner(...) 
} 

、注意が必要 - などASTまたはコンテキストはハンドルでなければならず、フィルタはある種の制限に該当する必要があります)。返されるオブジェクトは、の新しい PollオブジェクトまたはのキャッシュされたのPollオブジェクトになります。Pollオブジェクトが不変の場合、それは問題ではありません。キャッシュが完全に到達可能な状態で維持されている場合は、これも「クリーンアップ」を処理する可能性がありますが、実際は言語に依存します。

ハッピーコーディング。