次のようにしたいので、私は実際にそれを設計する方法に関するアドバイスを探しています。私は、特定のエンティティタイプ上で実行することができますFilter
の Symfony2 Doctrine2フィルタとルールのための適切なエンティティの設計
Filter
sが自分のルールを使用して、彼らの行動を定義するRule
のFilter
のプロセスエンティティを持っている、とブール- 与えられたフィールドの正規表現が拒否され、ルールを定義することができるというフィルタを適用する具体的な例です。私は同じフィルターで簡単なプレフィックスマッチングを使う違う規則を持つこともできます。
interface FilterInterface
{
/**
* Load the rules for this filter
*/
function loadRules();
/**
* Filter an entity in an optional context
* @param mixed $entity Should return true for $this->supportsEntity($entity)
* @param array $context Other information
*
* @return boolean True if the $entity passes this filter
*/
function filter($entity, $context = array());
/**
* Check if filter supports the entity type
* @param mixed $entity
*
* @return boolean true if this Filter can be run for that entity type
*/
function supportsEntity($entity);
}
を作ってみた:データベースからルールをロードし、フィルタを実装します
class ImageFilter implements FilterInterface
。
だから最初Iしかし
FilterRule
ようなエンティティを有する:
- 範囲(同様に、ルールの異なるタイプを持つことができ正規表現と前に述べた接頭辞)
- 値(文字列はルールの種類によって異なる)
ImageFilter
は、FilterRule
をロードします。スコープは、一定の定数に設定されています。その後、ImageFilter
は、フィルタのタイプをチェックし、それを次々にエンティティに適用するという重い作業を行います。次のコードはこれを示しています。
public function filter($entity)
{
foreach ($this->rules as $rule) {
switch($rule->getType()) {
case RULE_TYPE_REGEX:
$this->doRegex();
break;
case RULE_TYPE_PREFIX:
$this->doPrefix();
break;
}
}
}
しかし、私は、企業が上記switch
ブロックを担当する必要があり、疑問に思いましたか?新しいルールとどのように限り、「スコープ」は正しいようにそれらを処理するために気にしない
public function filter($entity)
{
foreach ($this->rules as $rule) {
$rule->process($entity);
}
}
これは私には思えるクリーナー、Filter
:だからそれは次のようになります。 しかし、エンティティはシンプルなPOPOでなければならないという印象を受けました。この種のロジックが悪いパターンであるように思われます(しかし、エンティティが本当にやるべきことを100%確信できませんでした)。
私もと考えていたので、それぞれRule
"type"は別のクラスになる可能性があり、ロジックはかなりシンプルになりました。最後に、別のタイプのRule
が、何らかの形で実際の作業を行う「動作」や何かを使用する必要があるかもしれないと考えていました。そこでここでは、まとめての
は私の現在の考えです:
Filter
は、すべての作業がRule
の種類を確認し、それに従って行動しません。Rule
はいくつかの文字列を保持する単なる "ダム"エンティティですRule
与えられたエンティティに対して独自の型をチェックして何かを行うすべての作業を行います。今Rule
エンティティは、ビット「太っ」であるが、それはFilter
とFilter
から実装が新しいRule
タイプRule
、上記を行うために、継承を使用しない効果的に同じ考えが、switch
これ以上を追加して変更する必要はありません非表示になります声明- 2.または3.しかし
Rule
どちらかがタイプごとに異なる「行動」のオブジェクトをインスタンス化し(実際に依存性の注入を使用していないことは悪いと思われる、振る舞いをカプセル化するかの良いデザインのように思える) - 1と4を組み合わせます。したがって、
Filter
はRule
から適切な動作を得ることができます(依存関係注入を使用できるようになりましたイオンは「行動」工場のように)
私はそれについてもっと考えていると思いますが、この分野のベストプラクティスはわかりません。私はこれが比較的一般的な例であると確信していますので、どの方向へ進むべきかについていくつかの情報を得たいと考えています。 Rules
、Filters
とRuleProcessing
- 私はあなたがここに与えた説明から何を得る
それはあなたが扱っているドメインに関するいくつかのより多くの情報を入力しないで答えを与えるには少し難しいですと。あなたが解決しようとしている実際の問題について、聴衆にもっと教えてください。 –