Ho un sacco di moduli. Posso rompere questi moduli in diverse categorie che sono complete e non si sovrappongono. Ad esempio, tre categorie, con ID che possono essere espressi come Animal
, Vegetable
e Mineral
. Rompo ulteriormente queste categorie in sottocategorie, che ancora sono distinte, complete e non si sovrappongono. Ad esempio, id che possono essere espressi come Mammal
, Reptile
, Legume
, Root
, Rock
, Gem
. Infine, al di sotto di queste categorie, ci sono i moduli stessi, ad es. Cat
, Dog
, Iguana
, Bean
, Quartz
, Emerald
, ecc.
Eccoicasidiutilizzocomune:
- Devochiamarevarimetodisututtiimoduli.
- Hobisognodiottenereun'istantaneapiattadellostatocorrentedituttiidatisututtiimoduli.
- Devochiamarevarimetodisututtiimoduliinunaparticolarecategoria(manonnellasottocategoria).
- HobisognodichiamarevarimetodisuunparticolaremodulospecificobasatosulsuoIDnoto.
- Questopotrebbeessereun"fai qualcosa" o un "dimmi alcuni dati su di te"
- Ho bisogno di archiviare dati aggregati su tutti i moduli in una particolare categoria (ma non nella sottocategoria).
Come dovrei memorizzare questi dati?
Alcuni altri fatti rilevanti:
- Le categorie sono stabilite in runtime
- Pertanto, i moduli di livello inferiore condividono un'interfaccia comune.
- Una volta impostati, non cambiano in quella particolare esecuzione, sono basati sui dati nei file di configurazione.
Ecco cosa faccio attualmente:
- Ho una classe che contiene
Map<Category, CategoryDataStructure>
. Questa classe mantiene anche unCollection<Module>
separato visualizza dei dati da utilizzare con il requisito # 2. -
CategoryDataStructure
ha metodi di delega concatenati che inviano il metodo call sulla catena, tramiteSubCategoryDataStructure
. -
CategoryDataStructure
memorizza anche i dati aggregati utilizzati nel requisito # 5.
Funziona, ma è onestamente abbastanza ingombrante. Il tutto è stato / mutevole e difficile da cambiare. Se voglio aggiungere un nuovo comportamento, devo aggiungerlo in molti posti. Attualmente le strutture di dati stesse hanno anche molta logica di business; i metodi di delega. Anche la struttura dei dati genitore deve fare molta logica aziendale per creare un particolare modulo e la sua struttura di dati padre se necessario e la struttura dei dati del genitore, se necessario.
Sto cercando di scomporre in qualche modo la logica di gestione dei dati dalla struttura dei dati stessa, ma a causa del nesting è complicato. Ecco alcune altre opzioni che ho preso in considerazione:
- Crea un semplice
Map<Category, Map<Subcategory, Module>>
e metti tutto il codice per mantenere il suo stato in una classe diversa. La mia preoccupazione per questo è i requisiti # 1 e # 2, sarà difficile mantenere la vista coerente poiché ora avrò due diverse strutture di dati che rappresentano gli stessi dati. - Fai tutto in una struttura di dati piatta e fai un ciclo attraverso l'intera struttura quando cerco una particolare categoria o sottocategoria.