UI Composition: parte teorica

UI Composition è un pattern architetturale che permette di creare interfaccie grafiche completamente modulari.

Che io sappia ad oggi le uniche tecnologie che riescono ad applicare perfettamente questo pattern nella realtà sono Microsoft WPF e SIlverlight.
In particolare Microsoft stessa fornisce un insieme di librerie chiamato Microsoft Prism che ci consente di semplificare di molto la creazione di interfacce grafiche modulari.

Cos’è UI composition?

Per UI composition intendiamo un’interfaccia grafica completamente dinamica e che si adatti automaticamente ai moduli che decidiamo di avviare a runtime senza che ci siano relazioni tra gli stessi.
Faccio un esempio banale, in un gestionale abbiamo il modulo anagrafiche ed il modulo fatturazione.
Entrambi i moduli sono autonomi, cioè, non hanno una relazione di dipendenza diretta tra di loro e possono essere avviati senza che l’altro sia installato.
All’avvio ognuno dei due moduli esegue un processo di bootstrap e comunica (a prism o altri framework) le “region” dove altri moduli posso iniettare componenti.
Ad esempio il modulo anagrafiche in fase di boot comunicherà a prism che contiene una region AnagraficheToolbar dove altri moduli possono iniettare contenuti (pulsanti, testo ecc…).
Allo stesso modo il modulo Fatturazione, in fase di bootstrap comunicherà a Prism di mettere 1-2-3 pulsanti o etichette varie o altro nella region AnagraficheToolbar.
Prism farà il resto, ovvero, popolerà le region con i componenti a runtime fornendo a tutti gli effetti un ambiente completamente modulare, estendibile e disaccoppiato.
Questo diciamo che è solo il primo step per mettere in piedi un software di questo tipo, di fatto, in corso d’opera ci scontreremo con altre problematiche tipo, la comunicazione tra moduli che non si conoscono.

Comunicazione

Prism per ovviare alle comunicazione tra moduli mette a disposizione l’infrastruttura che implementa il pattern publisher/subscribe.
Nello stesso modo in cui qualcuno registra una region senza sapere chi la utilizzerà a runtime e qualcuno registra dei componenti per una region, con publisher/subscriber qualcuno registra un evento e qualcun’altro registra l’handler a quell’evento.
Per esempio, mettiamo a disposizione nel form principale dell’applicativo un unico tasto stampa, questo tasto a runtime dovrà attivarsi e disattivarsi ogni volta che qualcosa a schermo compare qualcosa di stampabile.
Inutile dire che fare riferimento direttamente al tasto disabilitandolo e attivandolo è errato perchè:

  • non centralizza le logiche dietro a quel comportamento in un solo punto del software
  • se faccio riferimento direttamente a quel tasto, cambiando anche solo una virgola tutti i moduli smetteranno di funzionare
  • ho una relazione di dipendenza tra due progetti che sono separati e non devono conoscersi

Dunque l’approccio corretto è: creare un evento SelectedItemChanged, a cui il modulo con il tasto stampa è registrato.
Ora qualsiasi modulo del programma, mentre l’utente seleziona e naviga nel software, scatenerà l’evento SelectedItemChanged avvisando anche il tasto stampa.
Dico “anche” perchè di fatto, X moduli possono stare in ascolto di quell’evento e fare qualcosa quando lo stesso viene scatenato.
Il tasto stampa quindi, dopo aver piazzato un handler sull’evento SelectedItemChanged, riceverà in tempo reale una notifica di ogni cosa che l’utente fa a schermo ed in base ad una logica (centralizzata), gestirà se deve abilitarsi o disabilitarsi.

Navigazione

Il nostro software è attualmente disaccoppiato nelle viste e nelle comunicazioni ma ci accorgeremo ben presto che, essendo tutto disaccoppiato, non sappiamo se una view è già stata aperta da qualcuno oppure bisogna materializzarla.
Prism mette a disposizione nel framework l’infrastruttura per gestire lo stato delle view.
Per esempio abbiamo una listbox con tutti i clienti, con il doppio click su un item della listbox dobbiamo visualizzare una form con il dettaglio relativo a quel cliente.
Può sembrare banale ma in questo caso devo gestire il fatto che il dettaglio sia una view non singleton ma transient, ovvero che verrà creata una view ad ogni richiesta.
Inoltre devo gestire il fatto che se quel cliente ha già un form con il dettaglio aperto e devo soltanto farlo comparire in primo piano.
Prism come detto mi da la possibilità di fare tutto ciò gratis, attraverso il suo framework.

Commanding

Prism mette a disposizione l’infrastruttura per raggruppare, eseguire in maniera asicrona, eseguire in maniera disaccoppiata qualsiasi implementazione di un comando all’interno delle view.

Conclusione

Chi decide di avventurarsi nel mondo della UI composition dovrà inevitabilmente scontrarsi con una serie di concetti completamente nuovi e inizialmente dovrà essere pronto a fare retromarcia e buttare via delle parti di codice che non seguono la logica del “tutto disaccoppiato”.
Inoltre la curva di apprendimento è molto bassa, chi approccia UI composition deve avere bene chiari in testa i concetti di inversion of control, aspect oriented programming e soprattutto model view view-model.
Come se non bastasse c’è da conoscere WPF, ed i comandi asincroni async await.
Il lavoro finale sarà egregio, un software scritto con questa forma-mentis avranno bisogno di pochissima manutenzione, sono molto flessibili, veloci, espandibili e le personalizzazioni non impatteranno sugli aggiornamenti.
Se ne raccomanda l’utilizzo in scenari dove il programma deve gestire tantissime cose ma non tutte insieme, in maniera completamente modulare.
Esempio, posso avere una figura in ditta che segue la fatturazione e basta piuttosto che la fatturazione e la produzione oppure fatturazione produzione e anagrafiche.
Semplicemente installando i giusti moduli, ottengo l’interfaccia ideale per far lavorare l’utente solo su quello che effettivamente deve fare, senza preoccuparmi di dover attivare, disattivare, nascondere e controllare le aree che non gli competono.
L’intera interfaccia verrà modellata e composta sulla base di ciò che l’utente è stato abilitato a fare, con un incremento di prestazioni (utilizzo di memoria in particolare) e produttività impareggiabile.

Rispondi

Leggi articolo precedente:
Il gestionale web: perchè?

Tantissima gente ormai considera il web la soluzione a tutto.

Chiudi