2012-01-25 9 views
0

プログラマがこのパターンを使用するという仕様を書いています。このパターンの名前は何ですか?

処理中のデータにいくつかのフィルタを適用する必要があります。この構成では、これらのフィルタを作成することができます。それらのいくつかが存在しても、存在しなくてもよい。私は輸出クラスでその論理を望んでいません(将来的に大きくなる可能性があるため、現在は予測できない種類のフィルタを使用しています)。私はそれらを順番に実行したいので、私はエクスポートクラスのメソッドを要求します: "addFilter"、内部配列にオブジェクトを格納し、実際のエクスポートプロセスが実行されるときにそれらを実行する必要があります。

質問が十分明確であるかどうかわかりません。それは連鎖された戦略のようですが、まったくフィルタを持つことは必須ではないため、まさに戦略ではありません。

また、質問は次のとおりです。このパターンを仕様でどのように呼び出す必要がありますか?


編集:私がやろうとしているものの例:

$report = new Report(); 
$report->addFilter(new RemoveSpaces()) 
     ->addFilter(new SubstituteText($predefined_substitutions_array) 
     ->addFilter(new FixCapitals()) 
     ->addFilter(new Encode("utf8")); 
echo($report->generate()); // filters are actually used during generation. 

たぶん、ユーザーが活用するかどうか、代用するテキスト、RemoveSpacesするかどうかを決定することができるはずですどのエンコーディングを使用するかなどを指定することができます。ユーザー(クライアント、実際)の要求には、今後いくつかのフィルターが必ず追加されます。

foreach($this->filters as $current_filter) { 
    $data = $this->filters[$current_filter]->applyTo($data); 
} 
+0

あなたが話していることを説明する擬似コードの例を追加できますか? –

+0

編集した質問をご覧ください。 –

答えて

1

実際には、あなたの目的を達成するためにどのパターンを使用できるかを判断するのに十分なコードが含まれていないと言います。なぜなら、Filterクラスのサンプルコードやシグネチャを表示していないからです。

ReportクラスはFilterクラスとどのようにやりとりしますか(またはその逆)?

この場合、各参加者は、通常、前後のいずれかのコードを実行して、次の参加者を呼び出す責任があります。 WindowsがWindProcをどのようにチェーン化しているのかを考えてみましょう.WindProcでは、WindProcの前または後にコードを実行でき、いつでも呼び出すことができます。

これらのフィルタオブジェクトは、コアオブジェクトと同じインタフェースを実装してお互いをラップする場合、デコレータになる可能性があります。しかし、コードサンプルにはオブジェクトが単純なリストに含まれていました。デコレータではあなたが頻繁にこの参照してくださいね。もちろん

FilterA fA = new FilterA(coreObject); 
FilterB fB = new FilterB(fA); 
FilterC fC = new FilterC(fB); 

を、これは私が言ったようなので、我々はそれがだったかどうかを知るために、よりコードを表示する必要があると思いコンストラクタを介して行う必要はありません。デコレータ。

「パイプとフィルタ」パターンを実行していると思う傾向がありますが、各操作の出力は次の入力になりますが、それ以上のことを知らなくても明確ではありません。各フィルターが同じもの(巨大なStringなど)で動作するのか、それぞれがReportオブジェクトモデルのいくつかの面と相互作用するのかどうかはわかりません。

たとえば、レポートに現在のEncoderのオブジェクトプロパティがある場合、おそらくEncode("utf8")フィルタは、ディスクの永続化戦略を処理するエンコーダサブクラスを構成/インストールするfcatoryとして機能します。一方、SubstituteText($predefined_substitutions_array)は、ランタイム値でスワップするためにレポートが所有するParametersコレクションに作用します。

私はあなたが達成したいことを説明し、それを達成する方法をそれほど説明することはお勧めしません。

+0

"パイプとフィルター"です! –

2

GoFの「責任の連鎖」はパターンが頭に浮かんだ:

は一度織り込み、フィルタは、レポートを呼ぶだろうシンプルなインターフェイスを持っている必要があります。ここにWikipediaの説明があります: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

1

Chain of responsibilityとよく似ています。各フィルターは連鎖を続行しないことを決定できます。また、通常、後続の各フィルタに渡される「チェーン」オブジェクトがあります。

これらのチェーンセマンティクスが必要ない場合は、ターゲットオブジェクトの周囲に単にproxiesと表示することができます。

+0

Hmm ...私は何かにアクセスしようとしていないので、プロキシではなく、エクスポートするデータに単純な変換やフィルタを適用します。私が@havexzに言ったように、私はそれをプログラマーにとって単純なものにするために、責任の連鎖のどちらかと呼ぶのではないでしょう。私はちょうどそのパターンを説明するだろうと思う。ありがとう! –

2

ほとんどの現実世界の問題のように、必ずしも1つのパターンを選択する必要はありません。あるパターンは一般的に実装全体をカバーしません。したがって、あなたの仕様では、インプリメンテーションに影響を受けたすべてのパターンを指定できます。また、インプリメンテーションで元のパターンとは異なるものを文書化することもできます。あなたの特定のケースで

、それはあなたにもまた、機能のようなフィルタを実装するためのものthatsのようDecoratorパターンを探すことができますChain of Responsibility

に似ています。

他のパターンはあなたのものに似ていますCommand Patternです。したがって、あなたのケースでは、generateReportのようなものは、executeCommandのようであり、フィルタはリスト内のコマンドです。

+0

+1: とにかく、デコレータパターンではないと確信しています。メソッドを追加したり、データオブジェクトのインターフェイスや機能を変更したりすることはありません。責任の連鎖も私の推測でしたが、私はプログラマーに、データへの単純なフィルタ/変換より複雑なものを求めていると誤解したくないので、仕様のためにそれを好きではありません。 –

+0

あなたが実装しようとしているもの(フィルタなど)もDecoratorを使用して実装することができます。デコレータは、同じインタフェースを持つ必要があるメソッドを追加する必要はありません。 BufferedInputStream、FileInputStreamなどの例( 'BufferedInputStream bin = new BufferedInputStream(new FileInputStream(filename));') – havexz

+0

あなたは正しいですが、デコレータはあまりにも複雑すぎるようです。私は、変換関数のためのラッパーオブジェクトを必要とし、それを適用するかどうかを設定する必要があります。 編集した質問を参照してください。 これは私が望むパターンであり、デコレータではありません。私はそれが名前であることを知りたい。 –

関連する問題