アイテムのコレクションをフィルタリングするためのデザインパターン?

StackOverflow https://stackoverflow.com/questions/1622474

質問

さまざまなプロパティを持つアイテムのリストがある典型的なタイプのアプリケーションを想像してください。例えば。 100個のアイテムを持つツリービュー。各アイテムには name rating rank-within-the-the-hottest-items-on-the-the-plane など。おそらく、 items item-catalogs の間、または items の間に多対多の関係もあります。アイテム作成者など。

このアプリケーションには当然、フィルタリングシステムが必要です。例えば。ここでは、さまざまな関係のデータ間で、あらゆる種類の複数の条件を持つ複雑なフィルターを構築できます。

このようなフィルタリング機能を作成する設計タスクは、多くの開発者が行ったものである必要があり、そのタスクに最適な何らかの設計パターンが必ずあるはずです。

誰ですか?

編集:これに使用されている業界要因のパターンはないと思われるため、コミュニティWikiに切り替えました。あまりにも一般的に定式化された質問だと思います。

役に立ちましたか?

解決

実際にあなたが望むものを指摘するのは少し難しいので、私は自分の仮定を取ります。

  1. フィルタリング後、基礎となるコレクションは変更されません
  2. 結果は永続的ではありません

古典的なアプローチは、ビューの使用です。これは基本的に遅延プログラミングであり、元のコレクションにアクセスでき、適用するフィルタを知っているが、何も必要ない限り計算を行わないオブジェクトを作成します。

コレクションでは、多くの場合、ビューはイテレータで実装され、フィルタリングのために、もちろん既に指摘したように戦略パターンがあります。

例:

Collection myCollection;
Predicate myFilter;

// Nothing is computed here
View<Predicate> myView(myCollection, myFilter);

// We iterate until we find the first item in the collection that satisfies
// the Predicate, and no more, to initialize `begin`
View<Predicate>::Iterator begin = myView.begin(), end = myView.end();

最終的な利点は、(たとえば)最初の10個の項目のみが必要な場合、それらの10個を最初に見つけるために必要なだけ述語を適用し、それ以上は適用しないことです。

また、関連する要素のコピーはなく、 myCollection を変更してもビューが更新されることが保証されますが、これはイテレータの有効性に影響する可能性があります(通常)。

問題は、(キャッシュを実装しない限り)結果が毎回計算されることです。

より永続的な結果が必要な場合は、フィルターされたアイテム(またはそれらへの参照)のみを含む新しいコレクションを構築することをお勧めします。 「フィルター済み」リストの使用方法に依存するため、ここには一般的なパターンはありません。

提案されている戦略パターンに関しては、通常、複合パターンを使用してブロックごとにフィルターを構築し、構築されたオブジェクトを戦略として渡すことができます。

Composite Patternは、たとえば解析された式の結果を表すのに特に適しています。たとえば、式ツリーを見てアイデアを得ることができます。

他のヒント

そのデザインパターンについては知りませんが、並べ替えのために作られたアプローチのいくつかを見ることができます。それらのいくつかを説明し、それらが好きではない理由があれば役立つでしょう例として。

たとえば、LINQには、式ツリーを使用して並べ替えを行う便利な方法があります。

関数型言語で行われる並べ替えを見ることができます。特定の並べ替えをハードコーディングするのではなく、関数を渡して実際に並べ替えを行うことができます。

javascriptのようなもので作業している場合、ソート関数はその場で作成できます。

SQLを使用できるリレーショナルデータベースを探しています。完全なものを立ち上げてアプリケーションから接続するか、完全なデータベースとストレートオブジェクトの間で何かを行うことができます。たとえば、Javaでは、HSQLDB / JavaDBなどのメモリ内データベースを使用し、その機能を使用できます。 JoSQL を使用することもできます。これにより、データベースをまったく使用せずにオブジェクトでSQLを直接操作できます。

また、自分でプログラムを作成したい場合は、データのコピーを2つ保持することから始めます。 1つはデータの完全なセット、もう1つはフィルタリング後のデータのビューです。次に、データを並べ替え、並べ替えられたリスト内の位置を維持することにより、各列のデータにインデックスを作成します。同じ設定がフィルター一致に対しても機能します。列のフィルターに一致するものがある場合は、1を指定し、そうでない場合は0を指定します。次に、誰かが並べ替え順序を切り替えると、データを完全なリストからビューリストにコピーするか、フィルター情報を変更すると、一致したデータのみを取得します。

これらの関係がRDFおよびOWLとして表現できる場合、SPARQLエンドポイント(Jenaなど)またはPelletなどの推論ツールを使用できます。しかし、詳細がなければ、これが最善のアプローチであるかどうかは明らかではありません。

http://en.wikipedia.org/wiki/Criteria_Pattern が役立つかどうかを確認する君は。 仕様パターンに基づいています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top