Scenario:
- Un feed di input di dati (chiama questo
Source
) - Più oggetti (chiama questi
Layer1
) leggi questoSource
e analizza il feed. Questa analisi è stateful. -
Gli oggetti
Layer1
hanno parametri di configurazione. Ad esempio,new FooLayer1(10, 20)
eseguirà un'analisi diversa danew FooLayer1(20, 20)
eseguirà un'analisi diversa danew FooLayer1(20, 30)
- L'analisi
Layer1
viene eseguita in modo asincrono.
- L'analisi
- Ancora altri oggetti (chiama questi
Layer2
) leggi solo l'output degli oggettiLayer1
ed elabora quei risultati. Questa analisi è anche stateful. - Gerarchia di creazione di oggetti Guice
- Gli oggetti
Layer1
necessari sono accessibili abbastanza spesso da non avere importanza se vengono creati pigramente, a condizione che rimangano in memoria dopo che sono stati creati la prima volta. - Le esigenze degli oggetti
Layer2
sono hardcoded; non è un buon modo per sapere in anticipo quali oggetti diLayer1
saranno necessari.
Voglio poter riutilizzare il lavoro degli oggetti Layer1
. Ad esempio, diciamo che ho:
-
AlphaLayer2
oggetto che legge l'output diFooLayer1
eBarLayer1
-
BetaLayer2
legge l'output diBarLayer1
eBazLayer1
-
QuuxLayer1
è implementato, ma non voglio che il mio server calcoli il valore diQuuxLayer1
a meno che non ci sia un oggettoLayer2
che ne ha bisogno.
Attualmente, ho una factory a cui tutti gli oggetti Layer2
hanno accesso, che crea solo l'oggetto Layer1
appropriato, se necessario, e memorizza tutti gli oggetti Layer1
creati in una mappa. Tuttavia, poiché gli oggetti Layer1
hanno anche parametri di configurazione, devo assicurarmi di memorizzare gli oggetti Layer1
in una buona struttura dati. Ma la funzionalità Layer1
deve essere flessibile, e immagino che quando creerò più tipi di oggetti Layer1
, questo tipo di Map
potrebbe diventare davvero complicato. Sto facendo questa domanda perché, mentre ora va bene, mentre la complessità cresce, mantenere la struttura dei dati in questo modo sembra diventare davvero difficile.
Il tentativo di creare una sorta di struttura di dati% co_de nidificata dovrebbe ottenere il tempo di accesso Map
alla ricerca di questi oggetti O(1)
, ma renderà la cache estremamente complicata. In alternativa, potrei tenerli in una struttura più piatta e scorrere l'elenco di tutti gli oggetti Layer1
e vedere se hanno i parametri corretti. Se nessuno trovato, crea il nuovo. Finché gli oggetti Layer1
mantengono il riferimento, questo dovrebbe accadere solo una volta.
Un'altra opzione potrebbe essere creare un Layer2
in modo che debba solo scorrere gli oggetti Map<Class, Set<Layer1>>
creati della classe corretta.
Qualcuno ha mai visto questo tipo di scenario? Quale delle opzioni che ho menzionato è preferita? O c'è qualcosa che non ho ancora menzionato? Inoltre, c'è un modo per usare Guice per creare Layer1
oggetti in un modo in cui posso riutilizzarli (cosa che devo fare, perché sono stateful)