Ich habe ein paar Module. Ich kann diese Module in verschiedene Kategorien unterteilen, die vollständig sind und sich nicht überschneiden. Zum Beispiel drei Kategorien mit IDs, die als ,, und ausgedrückt Animal
werden Vegetable
können Mineral
. Ich zerlege diese Kategorien weiter in Unterkategorien, die wiederum unterschiedlich, vollständig und nicht überlappend sind. Zum Beispiel ids , die ausgedrückt werden kann als Mammal
, Reptile
, Legume
, Root
, Rock
, Gem
. Schließlich unterhalb dieser Kategorien gibt es die Module selbst, zum Beispiel Cat
, Dog
, Iguana
, Bean
, Quartz
, Emerald
, usw.
Hier sind meine häufigsten Anwendungsfälle:
- Ich muss verschiedene Methoden für alle Module aufrufen.
- Ich muss einen flachen Schnappschuss des aktuellen Status aller Daten über alle Module hinweg erhalten.
- Ich muss verschiedene Methoden für alle Module in einer bestimmten Kategorie (aber nicht für eine Unterkategorie) aufrufen.
- Ich muss verschiedene Methoden für ein bestimmtes Modul basierend auf seiner bekannten ID aufrufen.
- Dies kann ein "etwas tun" oder ein "mir einige Daten über sich selbst erzählen" sein.
- Ich muss aggregierte Daten zu allen Modulen in einer bestimmten Kategorie (aber nicht in einer Unterkategorie) speichern.
Wie soll ich diese Daten speichern?
Einige andere relevante Fakten:
- Die Kategorien werden zur Laufzeit festgelegt
- Daher teilen sich die Module der untersten Ebene eine gemeinsame Schnittstelle.
- Sobald sie eingerichtet sind, ändern sie sich in diesem bestimmten Lauf nicht mehr - sie basieren auf Daten in Konfigurationsdateien.
Folgendes mache ich derzeit:
- Ich habe eine Klasse, die a enthält
Map<Category, CategoryDataStructure>
. Diese Klasse verwaltet auch eine separateCollection<Module>
Ansicht der Daten zur Verwendung mit Anforderung Nr. 2. CategoryDataStructure
hat Delegierungsmethoden verkettet, die den Methodenaufruf über die Kette sendenSubCategoryDataStructure
.CategoryDataStructure
speichert auch die in Anforderung 5 verwendeten aggregierten Daten.
Es funktioniert, aber es ist ehrlich gesagt ziemlich unhandlich. Das Ganze ist zustandsbehaftet / veränderlich und schwer zu ändern. Wenn ich neues Verhalten hinzufügen möchte, muss ich es an vielen Stellen hinzufügen. Derzeit haben die Datenstrukturen selbst auch viel Geschäftslogik; die Delegierungsmethoden. Außerdem muss die übergeordnete Datenstruktur viel Geschäftslogik ausführen, um ein bestimmtes Modul zu erstellen, und bei Bedarf die übergeordnete Datenstruktur und bei Bedarf die übergeordnete Datenstruktur.
Ich möchte die Datenverwaltungslogik irgendwie von der Datenstruktur selbst trennen, aber aufgrund der Verschachtelung ist es kompliziert. Hier sind einige andere Optionen, die ich in Betracht gezogen habe:
- Erstellen Sie einen einfachen
Map<Category, Map<Subcategory, Module>>
Code und legen Sie den gesamten Code in einer anderen Klasse ab, um seinen Status beizubehalten. Mein Anliegen dabei sind die Anforderungen Nr. 1 und Nr. 2. Es wird schwierig sein, die Ansicht konsistent zu halten, da ich jetzt zwei verschiedene Datenstrukturen habe, die dieselben Daten darstellen. - Machen Sie alles in einer flachen Datenstruktur und durchlaufen Sie die gesamte Struktur, wenn Sie nach einer bestimmten Kategorie oder Unterkategorie suchen.
handleVisitor
Klasse etwas passieren muss ?