Pro WPF and Silverlight MVVM: Effective Application Development with Model-View-ViewModel
Gary McLean Hall è uno sviluppatore inglese, che descrive se stesso come un
senior developer specializzato in
Test Driven Development (TDD), metodologie agili, pattern e C#. La lettura del suo testo conferma pienamente la sua opinione: c'è pulizia e rigore nel disegno delle classi utilizzate nel codice d'esempio e padronanza e competenza nelle metodologie di sviluppo indicate.
L'
obiettivo di questo volume è mostrare come sia possibile architettare e progettare efficacemente un'applicazione dotata di un'interfaccia utente, sfruttando le possibilità offerte da
WPF e
Silverlight, i due framework di Microsoft orientati allo sviluppo rispettivamente di desktop e web application dall'elevato livello di
user experience. L'autore introduce a tale scopo il pattern architetturale
MVVM (Model-View-ViewModel), una relativamente recente (2006) declinazione proposta da Microsoft di quella famiglia di pattern architetturali, orientata alla separazione tra la
domain logic e la
user interface di un'applicazione, il cui capostipite può considerarsi il pattern
MVC (Model-View-Controller).
In maniera assai semplicistica, definita
M-X(X)-V la famiglia, si può dire che in tutte le varianti del pattern un'applicazione è suddivisa in 3 diversi layer:
- il Model, in cui trovano posto le classi che rappresentano il dominio del problema;
- la View, lo strato più prossimo all'utilizzatore, di cui raccoglie gli input e a cui mostra i risultati dell'elaborazione;
- un terzo strato, sopra indicato con X, che disaccoppia i primi due cercando, in maniera più o meno efficace, di evitare che le modifiche al Model abbiano a riverberarsi sulla View e viceversa, o in alternativa di minimizzarne l'impatto.
Le diverse varianti si distinguono per le dipendenze introdotte tra i layer e per il modo in cui lo strato
X(X) assolve al suo obiettivo. La suddivisione tra gli strati può essere non soltanto logica, ma tradursi in unità di deployment distinte.
Il testo, per poter essere apprezzato pienamente, si rivolge a un
pubblico competente o almeno ben informato su una vasta gamma di tecniche di sviluppo. Scritto con un
linguaggio molto efficace, sintatticamente e lessicalmente più ricco di un usuale manuale tecnico, rappresenta una lettura piacevole ben corredata da
immagini e
codice d'esempio.
Nello stesso tempo, per precisa scelta stilistica, è estremamente
succinto nell'affrontare la quasi totalità degli argomenti che l'autore decide di toccare. Il modo in cui l'autore presenta, ad esempio, lo
unit testing, gli
Object Relational Mapper,
i design pattern utilizzati nel codice illustrativo, ma anche le scarne motivazioni addotte come base di un'architettura a layer
M-X(X)-V, presuppongono il lettore autonomo e competente su questi temi.
Sono dieci e agili i capitoli in cui il testo si articola, non tutti a mio parere necessari o coerenti con il titolo. Il
capitolo uno introduce
WPF e
Silverlight, presentandone le caratteristiche e comparandone le funzionalità.
Il
capitolo due mostra come si possa realizzare il
data binding in maniera del tutto (o quasi) dichiarativa attraverso
XAML (eXtensible Application Markup Language), il linguaggio di markup che
WPF e
Silverlight rendono disponibile per la costruzione dei controlli nell'interfaccia utente e il loro collegamento ai dati.
Il
capitolo tre presenta il modello delle dipendenze previsto dal pattern. La
View dipende esclusivamente dal
ViewModel, a sua volta dipendente in esclusiva dal
Model. Poi l'autore illustra i vantaggi di separare il modello dalla vista: la
Separation Of Concerns e la minimizzazione della dipendenza tra i layer, che aumentano la coesione tra le parti e riducono l'accoppiamento; come effetti collaterali, la
Dependency Injection e lo
unit testing autonomo di ogni layer. Succintamente si descrivono le alternative a
MVVM.
Il
capitolo quattro è centrale per la comprensione del pattern. Qui l'autore descrive le tecniche e i trucchi necessari per strutturare l'applicazione in concreto, quali elementi devono essere rigorosamente introdotti nello strato
ViewModel e come metterli in relazione con gli altri strati.
Il
capitolo cinque descrive e compara i modelli d'interazione utente basati sugli eventi con quelli basati sui comandi, con un efficace utilizzo di
design pattern e diagrammi UML.
Il
capitolo sei, partendo dalla validazione degli input utente, affronta le tematiche dei cosiddetti
cross-cutting concern. In un'architettura a layer, alcune funzionalità come autenticazione e autorizzazione, registrazione degli eventi di log e validazione degli input sono trasversali e, come tali, vanno enucleate dai layer
MVVM e sviluppate in assembly separati. Diversi sono i framework che implementano già con grande efficacia tali funzionalità e l'autore ne suggerisce l'utilizzo.
Il
capitolo sette argomenta sinteticamente, ma efficacemente, sull'importanza dello
unit testing. Sono brevemente presentate le tecniche, i framework di base e quelli a supporto dei metodi di
mocking degli oggetti, gli strumenti disponibili negli IDE.
Il
capitolo otto presenta il problema dell'accesso ai dati persistenti e delle diverse tecniche con cui può essere approcciato in un'applicazione con l'architettura prescelta. Molto interessanti, ancorché non originali, l'illustrazione del problema che un modello ad oggetti incontra nell'accedere a un modello relazionale, e la descrizione delle diverse tecniche con cui una gerarchia di classi possa essere rappresentata in modello relazionale. Assai fugacemente si accenna ai framework di
Object Relational Mapping, che alleviano, quando non risolvono, il problema.
Il
capitolo nove mi sembra del tutto fuori contesto, descrivendo come serializzare gli oggetti e come estendere le applicazioni
WPF/
Silverlight.
Il
capitolo dieci riunisce molti dei concetti presentati nel testo descrivendo lo sviluppo di un'applicazione d'esempio. Il capitolo è molto interessant, e l'autore si lascia apprezzare per la pulizia progettuale, la nitidezza e l'efficacia dell'implementazione, il rigore nell'applicazione dei principi in precedenza illustrati.
Tirando le somme, a mio parere il testo non è pienamente riuscito. Moltissimi i punti di forza, è vero: il linguaggio, i diagrammi e le figure, il codice a corredo, i pro e i contro per ognuna delle tecniche proposte; ma nello stesso tempo troppa ambizione nel voler presentare tutte, ma proprio tutte, quelle che l'autore ritiene essere le
best practices dello sviluppo software attuale, a scapito di una troppo sintetica trattazione del pattern
MVVM e dei trucchi necessari a mitigarne la difficoltà d'applicazione e le trappole nello sviluppo. Avrei gradito viceversa, una discussione sulle possibilità di
deployment multi-tier dei diversi layer e degli assembly che implementano i
cross-cutting concern.