私はデザインパターンで自分のスキルを向上させようとしていますので、簡単にしてください:)私の仕事では、アルゴリズムが定義されている問題に対処しなければならないことがよくあります。適用するデザインパターンは?
私はカウンタークラスを持っているとしましょう。カウンタークラスは、特定の条件に一致するアイテムを単純にカウントすることです(大きな単純化)。これらの項目は、そう例えば、異なる構造を有していてもよい:
- のカウンターが「テキスト」の項目のために実行されている場合、カウンタは "のために実行されている場合、その長さはX
- よりも大きい場合は、私が唯一の項目を数えます「画像」アイテムの場合は、JPEG画像の場合にのみアイテムをカウントします。
これは、カウンタが上に働くだろうAbstractItem
クラスを持っている(私のために)右に感じるが、基準はアイテムの種類ごとに異なる方法で評価されているので、それはまた、関連するAbstractCriteria
を必要とします。
擬似コードのいくつかの並べ替え:
class Counter
{
AbstractItemFactory factory; // initialized in constructor
AbstractCriteria criteria; // initialized in constructor
DataProvider provider; // initialized in constructor
int count()
{
int result;
while((Data data = provider.get()) != null)
{
AbstractItem item = factory.create(data);
if(criteria.match(item))
{
result++;
}
}
return result;
}
}
ここでの問題はもちろんAbstractCriteria
のAbstractItem
を処理する方法を知らないだろうということです。オーバーライドされたmatch()
メソッドの中でベースから派生したキャストを使用してこれを解決することは可能ですが、それは非常に良い設計ではありません。テンプレートを使用することも可能ですが、コードが複雑になるため、私が望むことを達成するために使用できるデザインパターンがあるかどうかを最初に知りたいのです。あるいは、この問題に対する私のアプローチはまったく間違っていて、私が見逃しやすい簡単な解決策がいくつかあります。
ありがとうございます!
どう一部functionnalプログラミング手法を借り程度とのcriterias(基本的には関数参照)を表現するためにブールラムダ式を使うのか?たとえばJSでは、次のように簡単になります。 'function filteredCount(items、filter){ return items.filter(filter).length;} filteredCount([1,2,3]、function(num){return num%2}); – plalx
条件をハードコードすることはできますか?あるいは、再コンパイルせずに、つまり設定ファイルを通して基準を更新できるようにしたいですか? – denniskb
@plalx残念ながら、私は型付き言語を使用していますので、 'function(num)'と 'function(str)'は2種類あります。それらを使うために、私はそれらをいくつかの一般的なタイプから継承させなければなりません。私の例では、 'AbstractItemFactory'によって生成された項目の内容について何も知らないので、パラメータとして抽象型を受け入れる必要があります。この時点で私は元の問題に戻ってきました。これらの関数の中で抽象型を派生したものに戻す必要がありました。それを回避したいと思います: – xba