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


10

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

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

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

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

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

私の解決策では、これにより次のような結果になります。

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

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


2
「データ量を削減」してもよろしいですか?代わりに、必要な動作を実装するために作成する必要がある「重要なコードとロジックの量を減らす」方法を探していますか?(データの継続的な管理には、データベースと同様のリレーショナルデータ構造が必要であることに気づきました。)
rwong

@rwongはい、「重要なコードとロジックの量を減らす」ことが私の最終目標です。私にとって、それはデータの複雑さを何らかの方法で軽減することを意味しますが、それは必ずしも要件ではありません。それは非常に一般的なデータパターンになり、それを管理する簡単な方法があるかどうか疑問に思っています。
ニコラスピカリング

1
原則として、これはm:n関係の拡張バージョンです。「複雑なオブジェクトの関係を管理する方法」のようなタイトルはどうですか?
Thomas Junk、

1
膨大な量のデータは、膨大なレベルのデータの複雑さと同じではありません。構築しているものを管理することの難しさは、おそらくボリュームよりも複雑になるほど大きくなります。
Walter Mitty

1
面白い。私はこのパターンを持ついくつかのアプリケーションに取り組んできましたが、それがそのパターンであることに気付くことはありませんでした。また、この種のデータを管理する簡単な方法を見たいと思っています。
ジュール

回答:


6

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

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

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

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

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

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

優れたリファレンスは、私が言及したパターンとその実装をカバーするヘッドファーストデザインパターンです。Javaで動作します。


0

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

Studentが表示するために必要な部分構造を特定し、その元のインデックスをステートフルに dbに保存し、ビューとバックエンドdbの間で、ステートレスに更新します。


私はあなたの提案を理解しているとは思いません。空のサブオブジェクトを生成してから、ユーザーにサブオブジェクトの変更を許可する別のフォームを強制する必要がありますか?
ニコラスピカリング、

コンテンツとバックエンドデータベースの間のステートレストランザクションのみを実行している場合は、オブジェクト自体はあまり機能しないことをお勧めします。この場合は、それらを削除して、クライアントが直面しているものに固有のデータのトランザクションを実行します。
John P. Feltz、2015

編集:これは、トランザクションの特定のデータをキャプチャするオブジェクトを作成することを意味することもあります。
John P. Feltz、2015

私が誤解しているのでなければ、プロセスについて何もステートレスにできるとは思いません。それはすべて、ユーザーアクションのコンテキストに依存します。ユーザーがプライマリオブジェクトを作成すると、サブ構造がすぐに変更できることが期待されます。
Nicholas Pickering

-1

各学生用にカスタマイズされたコースは、元のコースが認識できなくなるまで、元のコースが単に「デフォルト」の参照であることを示しています。私がやろうとしていることは、CustomizedCourse(またはそれらのリスト)というクラスを作成し、それ(またはそのリスト)を学生のプロパティとして持つことです。CustomizedCourseは、「参照」用の元のコースへの参照を持つことができますが、主な作業とデータはCustomizedCourse自体にあります。


コメントに反対票を投じる?
frezq 2018

私は反対票を投じなかった(私はOPです)が、別の回答ですでに説明されているテンプレートまたは戦略パターンを説明しようとしているようです。
ニコラスピカリング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.