Stiamo sviluppando un framework che ha diversi livelli e che verrebbe distribuito in un ambiente multi-thread. Ogni livello può avere il proprio tipo di dati di input / output. Il livello superiore prende l'input, esegue alcune azioni sui dati e lo passa al livello successivo. In base all'output del livello successivo, il livello superiore eseguirà un'altra serie di operazioni sui dati. Interazioni simili si verificano tra altri livelli.
Ci sono due casi d'uso che non abbiamo incorporato nella progettazione originale:
-
Generazione di metriche sulle operazioni eseguite da ciascun livello sui dati.
-
La modifica dei dati in un livello influisce sulle operazioni in un altro livello, le modifiche dovrebbero essere registrate e ogni livello dovrebbe avere la capacità di recuperare l'elenco delle modifiche.
Dopo un po 'di riflessione abbiamo trovato due approcci per soddisfare questi requisiti nel progetto esistente:
-
Usa il pattern di osservatore e lascia che ogni layer riporti le sue modifiche. Queste modifiche possono essere quindi tirate dal livello che deve utilizzarlo.
Pro:
- Poiché abbiamo già creato un progetto per il framework e gran parte del lavoro è completo. Questo approccio non richiederebbe modifiche significative al design esistente, se esiste.
Contro:
- Diventa difficile gestire (registrare e riportare) le modifiche corrispondenti a ciascun livello.
- Esiste una classe centrale che aggrega tutti i dati per ogni richiesta. Questa classe si comporta come una variabile globale. Deve essere inizializzato e cancellato dal livello superiore. L'aggiunta di un altro strato superiore potrebbe essere soggetta a errori.
-
Estendere le classi di dati correnti usando un'interfaccia equivalente a EventContainer. In questo modo tutti i layer registreranno le loro modifiche e le sputeranno nel loro output.
Pro:
- Questo approccio è molto più pulito ed estendibile rispetto al modello di osservatore.
Contro:
- Richiederebbe modifiche di progettazione significative.
- Anche il concetto di dati con eventi unisce due preoccupazioni separate in una e non sembra una buona idea.
Vorremmo sapere se esiste un modello di progettazione o qualsiasi altra soluzione che risolva questo problema?
Quale delle due soluzioni di cui sopra dovrebbe essere data maggiore preferenza considerando che vorremmo una soluzione flessibile, estensibile e più pulita?