たくさんのモジュールがあります。これらのモジュールを、完全で重複しないさまざまなカテゴリに分類できます。例えば、3つのように表すことができるIDを持つカテゴリ、Animal
、Vegetable
、およびMineral
。さらに、これらのカテゴリをサブカテゴリに分類します。サブカテゴリも、明確で完全であり、重複しません。例えば、のように表すことができるIDS Mammal
、Reptile
、Legume
、Root
、Rock
、Gem
。最後に、これらのカテゴリの下に、モジュール自体が存在し、例えばCat
、Dog
、Iguana
、Bean
、Quartz
、Emerald
、など
これが私の一般的な使用例です:
- すべてのモジュールでさまざまなメソッドを呼び出す必要があります。
- すべてのモジュールのすべてのデータの現在の状態のフラットスナップショットを取得する必要があります。
- 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールでさまざまなメソッドを呼び出す必要があります。
- 既知のIDに基づいて、特定のモジュールでさまざまなメソッドを呼び出す必要があります。
- これは、「何かをする」または「自分についてのデータを教えて」のいずれかです。
- 特定のカテゴリ(サブカテゴリではない)のすべてのモジュールに関する集約データを保存する必要があります。
このデータをどのように保存すればよいですか?
他のいくつかの関連する事実:
- カテゴリは実行時に確立されます
- そのため、最下位レベルのモジュールは共通のインターフェースを共有します。
- いったん設定されると、それらはその特定の実行で変更されません-それらは設定ファイルのデータに基づいています。
これが私が現在していることです:
- を含むクラスがあります
Map<Category, CategoryDataStructure>
。このクラスは、要件#2で使用するためのデータの個別のCollection<Module>
ビューも保持します。 CategoryDataStructure
を介して、メソッドコールをチェーンに送信するチェーンされた委譲メソッドがありますSubCategoryDataStructure
。CategoryDataStructure
要件#5で使用される集計データも格納します。
それは機能しますが、正直なところかなり扱いにくいです。全体はステートフル/ミュータブルであり、変更が困難です。新しい動作を追加したい場合は、多くの場所に追加する必要があります。現在、データ構造自体にも多くのビジネスロジックがあります。委任方法。また、親データ構造は、特定のモジュールと必要に応じてその親データ構造、および必要に応じてその親のデータ構造を作成するために、多くのビジネスロジックを実行する必要があります。
どういうわけか、データ管理ロジックをデータ構造自体から切り離そうとしていますが、ネストが複雑なためです。ここに私が検討してきた他のいくつかのオプションがあります:
- シンプルなを作成し、
Map<Category, Map<Subcategory, Module>>
すべてのコードを配置して、その状態を別のクラスに保持します。これを行う際の私の懸念は要件#1と#2です。同じデータを表す2つの異なるデータ構造があるので、ビューの一貫性を保つのは困難です。 - すべてをフラットなデータ構造で実行し、特定のカテゴリまたはサブカテゴリを探す場合は、構造全体をループします。
handleVisitor
クラスで何かが発生する必要があるかどうかを確認していますか?