web-dev-qa-db-ja.com

多対多の深い関係を管理するための設計パターンはありますか?

複数のアプリケーションで作業しているこのデータパターンを定義するのに問題があります。

それはで構成されています:

  1. 多くのオブジェクト自体から構成されるオブジェクトタイプ
  2. 2番目のオブジェクトタイプ。各インスタンスは最初のオブジェクトの「多く」を持っています
  3. また、最初のオブジェクトの各サブオブジェクトは、2番目のオブジェクトタイプへの関連付けごとに変更できます。

簡単な例は次のとおりです。

  1. 一連のレッスンで構成されるプログラミングコース
  2. レッスンはセットの割り当てで構成されています。
  3. コースを学生に割り当てることができます。
  4. ただし、コースが生徒に割り当てられると、各レッスンおよび/または課題をその生徒にカスタマイズして、削除および追加して、元のコースが認識できなくなる可能性があります。

私の解決策では、これがもたらす結果は次のとおりです:

コースを生徒に割り当てると、コースはメモリにロードされます。次に、各サブオブジェクトについて、適切なメタデータを使用して生徒/サブオブジェクト関係オブジェクトが生成されます。基本的に、元のオブジェクトをテンプレートとして使用して、必要なカスタマイズ可能なオブジェクトを生成しています。

これにより、サブオブジェクトがより複雑になり、番号が付けられるため、大量のデータが生成されます。このデータパターンを操作するために必要なロジック/複雑さの量を削減するための最適化またはパターンがあるかどうかと思います。

10

必要に応じていくつかのオプションが表示されます:(1)共通のアルゴリズムに従う多くの一意のインスタンスがある場合、(2)多くの類似したオブジェクトがあるか、実行時にオブジェクトを生成する場合、および(3)場合実行中にオブジェクトの動作を動的に変更したい。注:必要に応じて、ここで説明するすべてのパターンを組み合わせることができます。

  1. 各「2番目のオブジェクトタイプ」は一意であるが、同様の動作パターンに従う場合、テンプレートパターンを使用できます。これを行っているようです。しかし、それを明示的にするために、抽象基底クラスには一般的なアルゴリズムがプログラムされています。このアルゴリズムの特定のステップは、派生クラスに実装されています。

  2. 多くのオブジェクトを作成する場合、または実行時にオブジェクトを作成することが重要な場合は、Factory Patternを使用できます。

  3. また、動的に動作を変更したい場合は、Stategy Patternが機能します。たとえば、通常のカリキュラムの学生が特別なニーズがある、または加速プログラムに参加することが決定された場合。これは、カリキュラムの基本クラスを表すオブジェクトの「学生」を構成することによって機能します。カリキュラムは、生徒の作成時に(奇妙に聞こえる)派生カリキュラムに割り当てられ、後で別の派生カリキュラムに再割り当てされる可能性があります。

(参考までに、C++で(3)戦略パターンを使用する場合、構成にはR値を指定する必要があります。)

オブジェクトと2番目のオブジェクトを保存するには、イテレーターパターン(循環、追加、削除、並べ替えなど)を検討する価値があります。

良いリファレンスは Head First Design Patterns で、これは私が言及するパターンとその実装をカバーしています。 Javaで動作します。

6
audrow

データストアまたは永続性の存在下では、ランタイムの任意の時点でこのような深さのオブジェクトが必要であるとは信じがたいと思います。これはCRUD GUI用ですか?その場合は、最初からアプローチを変更することをお勧めします。 IE:

Studentが表示するために必要な部分構造を特定し、statefully Originインデックスをdbに保存し、statelessly更新して、ビューとバックエンドdbの間で移動。

0
John P. Feltz