Design Architetturale
Pattern Architetturale MVC
Il progetto si basa sul pattern architetturale MVC (Model-View-Controller), che consente una chiara separazione tra la logica di business, l'interfaccia utente e il controllo del flusso dell'applicazione. Questa scelta facilita la manutenzione e l'estendibilità del sistema, rendendolo capace di adattarsi facilmente a esigenze future. Il model rappresenta lo stato della simulazione, la view gestisce l'interfaccia utente e il controller coordina le interazioni tra model e view.
Architettura del Progetto
Di seguito è riportato il diagramma che mostra l'architettura del progetto, evidenziando le principali classi coinvolte per ogni package e le loro relazioni:
Per semplicità il diagramma evidenzia solo i principali componenti di ogni package, i quali verranno approfonditi nei paragrafi successivi.
Model
Contiene le classi che rappresentano il modello dei dati e la logica di business dell'applicazione. Al suo interno sono definite le entità base che rappresentano complessivamente il dominio della simulazione.
L'intero package è pensato per essere immutabile. Durante lo svolgimento della simulazione, ogni stato sarà rappresentato da una nuova istanza di SimulationState, garantendo così l'integrità dei dati e facilitando il debug e la tracciabilità delle modifiche.
Controller
Contiene le classi che gestiscono la logica di controllo e coordinano l'interazione tra il modello e la vista. Al suo interno sono presenti:
SimulationEngine: il motore computazionale che applica la logica di simulazione, responsabile dell'aggiornamento dello stato della simulazione.SimulationController: coordina l'interazione tra il modello e la vista, gestendo gli eventi e aggiornando lo stato della simulazione.SimulationScheduler: gestisce il ciclo di vita della simulazione, schedulando l'esecuzione periodica dell'aggiornamento di stato.
All'interno del SimulationController viene anche istanziato un SimulationStore, che si occupa di salvare il SimulationState durante lo svolgimento.
View
Gestisce l'interfaccia utente e l'interazione con essa. Al suo interno sono presenti diversi componenti sfruttati per la creazione di vari pannelli, che permettono di rappresentare l'interfaccia grafica dell'applicazione. Il package è strutturato per essere modulare e facilmente estendibile, consentendo l'aggiunta di nuove funzionalità senza impattare significativamente sul codice esistente.
È organizzata in maniera gerarchica, con NavigationController che funge da controller principale per la navigazione tra i diversi pannelli dell'applicazione.
Concretamente la simulazione avviene all'interno del SimulationPanel, che rappresenta il pannello principale, con il quale l'utente può interagire.
Svolgimento della simulazione
Durante lo svolgimento della simulazione, tenendo a mente la natura immutabile del model, viene emessa una nuova istanza di SimulationState, ad ogni tick temporale. Il SimulationState è composto da tutti gli elementi del modello.
Nello specifico, il ciclo della simulazione è composto da una serie di fasi che coinvolgono il modello, la vista e il controller:
- Setup dei parametri: l'utente seleziona i parametri della simulazione definendo:
- Dimensione della mappa
- Percentuale di celle con meteo avverso
- Soglia di allagamento della singola cella
- Percentuale di allagamento della mappa per terminare la simulazione
- Inizializzazione: lo stato iniziale della simulazione viene generato da
SimulationEnginee l'utente può eventualmente modificare la mappa tramite l'interfaccia utente, aggiungendo o modificando le celle. IlSimulationControllercoordina le modifiche alla mappa, permettendo l'emissione di un nuovoSimulationStatedi conseguenza. - Esecuzione: il singolo tick della simulazione prevede l'aggiornamento dello stato della simulazione applicando la logica di propagazione del meteo e dell'acqua. La view viene quindi aggiornata per riflettere il nuovo stato. L'esecuzione dei task della simulazione (aggiornamento dello stato, aggiornamento del tempo trascorso) è affidata al
SimulationScheduler. - Terminazione: la simulazione continua fino a quando non viene raggiunta la condizione di terminazione. A questo punto, l'utente può eventualmente generare un report contenente il risultato.
Il SimulationController coordina l'interazione tra il modello e la vista, gestendo gli eventi e aggiornando lo stato della simulazione.