UI Composition :: Thread.Start()
- Deve essere possibile scomporre l’applicazione in moduli funzionali:
- I moduli funzionali devono essere independenti l’uno dall’altro;
- I mdouli funzionali possono avere delle dipendenze logiche tra loro ma l’assenza di una dipendenza non deve precludere il funzionamento dell’applicazione o del modulo stesso;
- I moduli funzionali devono poter essere rimpiazzati/aggiunti a caldo;
- L’applicazione deve poter essere installata in varie configurazioni, quindi non necessariamente con tutti i moduli funzionali;
- L’utente non si deve rendere conto che l’applicazione è una composizione di moduli funzionali:
- I moduli funzionali devono poter iniettare logica nell’applicazione e/o in altri moduli;
- I moduli funzionali devono poter iniettare parti dell’interfaccia utente nell’applicazione e/o di altri moduli;
- Lo sviluppo dei moduli funzionali deve poter procedere in parallelo e in maniera indipendente;
- I moduli funzionali devono poter essere sviluppati da team diversi;
- PRISM: Prism è un’ottima soluzione direttamente dal team di Pattern & Practices di Microsoft, la v1 ha alcune lacune che verranno probabilmente risolte dalla v2 che è attualmente in beta;
- Caliburn: è un toolkit open source che sembra realizzato proprio su misura per le mie necessità;
- decidere se il toolkit risolverà tutte le nostre necessità;
- quale toolkit scegliere conoscendone pregi e difetti, perchè una volta fatta la scelta ci si lega mani e piedi a quel toolkit;
- L’utente deve poter cercare all’interno dell’anagrafica dei soggetti;
- L’utente deve poter visualizzare in contemporanea i risultati di diverse query nell’anagrafica dei soggetti;
- L’utente, a seguito di una ricerca, deve poter visualizzare il dettaglio di uno dei soggetti;
- Il dettaglio di un soggetto deve contenere una sintesi della situazione del soggetto selezionato (ndr: ad esempio contratti in essere, preventivi, situazione contabile, etc..);
- L’utente deve poter “aprire” un soggetto e visualizzarne i dettagli completi (ndr: quindi non una sintesi);
- L’utente deve poter “aprire” più di un soggetto in contemporanea;
…Il dettaglio di un soggetto deve contenere una sintesi della situazione del soggetto selezionato…Se ci pensiamo qui siamo di fronte ad un problema; immaginamo, per semplicità, una UI simile a quella di Outlook:
Abbiamo una list view che contiene il risultato di una ricerca, alla selezione di un elemento viene visualizzato un dettaglio dell’elemento selezionato… ma noi abbiamo la necessità che quel dettaglio contenga informazioni che arrivano da moduli diversi, informazioni che devono essere “meshed-up” in maniera totalmente trasparente all’utente. Potremmo andare avanti con questo giochetto all’infinito, il p-o-c che ho realizzato credo che affronti e risolva tutte le possibilità, reportistica compresa, e sicuramente affronta e risolve tutte le mie necessità.
Cominciamo quindi con il mettere un po’ di puntini sulle “i”, gli attori in questo gioco sono:
- Un contenitore, che è poi l’applicazione, che ospita la UI: introducing the Shell;
- Un bootstrapper che è responsabile dello startup dell’applicazione e generalmente orchestra il caricamento dei moduli;
- Uno o più moduli che rappresentano le aree funzionali che dovranno soddisfare i bisogni dell’utente:
- Un modulo anagrafiche;
- Un modulo fatturazione;
- Un modulo inserzioni/pubblicità;
- Un mdoulo pubblicazione;
Le scelte tecnologiche sono ricadute su:
- WPF: i vantaggi sono spaventosi, se solo penso a quello che le attached properties mi hanno permesso di fare…;
- M-V-VM: come pattern architetturale per la gestione dell’interazione tra UI e Modello, spettacolo ;-);
- Castle Windsor, il primo amore non si scorda mai, per la gestione dell’infrastruttura;
Abbiamo delle aree all’interno dell’applicazione che devono poter ospitare altre aree, che a loro volta potrebbero ospitarne altre e via dicendo…, la cosa interessante è che queste aree possono essere:
- Statiche: aka note a priori, nell’immagine ad esempio l’area che opsita le “Toolbars” o l’area che ospita i “Documents”;
- Dinamiche: aree che nascono a runtime e che sono legate a quello che sta succedendo: si è contorto ma capiremo cosa vuol dire;
Dopo un bel po’ di lavoro, fatto anche di moltissime elucubrazioni notturne, sono giunto a questo:
Come?
bhe… adesso volete troppo, maeriale per le prossime puntate direi che ce ne è decisamente parecchio.
In questa sede mi limito a dare un paio di dettagli “contabili”:
- studio:
- dei requisiti;
- dei toolkit esistenti;
- realizzazione dell’architettura;
- realizzazione e test del concept che soddisfasse tutti i requisiti di cui sopra;
- refactoring per estrarre un toolkit;
Questa esperienza mi permette di asserire che:
- Ho capito fino al “midollo” come funziona il gioco e quali sono le regole;
- Ho capito quali sono i limiti di PRISM e perchè la v1 non va bene nel mio scenario e questo mi fa dire che queste 8 giornate sono state spese decisamente bene perchè scoprire un dettaglio come questo in itinere sarebbe stato un bagno di sangue;
- Ho un toolkit funzionante e utilizzabile da cui consegue che non ho bisogno di affrontare l’eventuale “problema” Caliburn;
- Fine settimana prossima probabilmente riesco a chiudere l’iterazione…e sono felice perchè sto imparando: ship it;
- un dettaglio… ho vinto la scommessa con il mio collega ottantaseienne: Paolo un uomo, un mito;
.m