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. -
CategoryDataStructureha metodi di delega concatenati che inviano il metodo call sulla catena, tramiteSubCategoryDataStructure. -
CategoryDataStructurememorizza 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.
