L’aumento della complessità delle applicazioni e la velocità di realizzazione richiesta al giorno d’oggi, hanno obbligato gli sviluppatori ad utilizzare metodologie formali per la scrittura di codice e il successivo testing dello stesso al fine di minimizzare i tempi di rilascio.
L’utilizzo dei pattern, ossia di convenzioni condivise dalla community dei programmatori, è una pratica sempre più diffusa e adottata anche per applicazioni Web.
L’ormai trentennale pattern Model-View-Controller (MVC) sta attualmente conoscendo una nuova giovinezza grazie al successo di framework nelle applicazioni Web che lo usano come riferimento.
Rails è il framework MVC più famoso e diffuso, implementato per la piattaforma Ruby, mentre ASP.NET MVC e MonoRail sono i due framework web MVC che stanno riscuotendo il maggiore successo per lo sviluppo su .NET e su Windows.
Conosceremo quindi la filosofia di riferimento e le specificità dei due framework tramite due implementazioni reali di una stessa applicazione e ne discuteremo vantaggi e svantaggi.
Time Series Anomaly Detection with Azure and .NETT
Model View Controller - Semplificare Il Codice E Minimizzare I Tempi
1. Model View Controller
Semplificare il codice e minimizzare i tempi!
Manuel Scapolan info@manuelscapolan.it
Marco Parenzan marco.parenzan@libero.it
10 dicembre 2009
2. Semplificare il codice e minimizzare i tempi!
Agenda
• Il “passato”: Web Forms
• Il “presente”(?): Model
• il “futuro”: MVC
Model View Controller
– Alcuni accenni tecnologici
• Demo: MonoRail
• Demo: ASP.NET MVC
• Conclusioni
– Q&A
2
5. Semplificare il codice e minimizzare i tempi!
Vantaggi di WebForm
• Web Form ASP.NET è stabile e maturo ed è
supportato da molti strumenti e controlli di
terze parti
Model View Controller
• Metafora di click tipica dello sviluppo desktop di
Windows
• Astrazione dalle conoscenze di HTML e
JavaScript recuperando invece le conoscenze dei
programmatori Windows
– Necessario introdurre PostBack e ViewState
– Necessario solo .NET
• Forte componentizzazione
• Autocaricamento dei controlli
6. Semplificare il codice e minimizzare i tempi!
Svantaggi di WebForm
• Mancanza della Separation of Concerns
• Non è possibile testare una pagina aspx
• Statefulness difficile da controllare (a scapito
Model View Controller
delle prestazioni)
• Difficoltà di accesso ai recenti framework
JavaScript (come jQuery, Dojo e PrototypeJS)
• Il postback rende poco SEO
– Alcuni motori di ricerca addirittura declassano la
pagina
8. Semplificare il codice e minimizzare i tempi!
Ritorno alle origini
Il web è semplicemente:
• GET
Riceve dati dal server. I parametri sono passati
Model View Controller
attraverso l'indirizzo.
• POST
Invia i dati al server per salvarli o perchè siano
elaborati. I parametri vengono passati nel corpo
della richiesta con la forma:
nome1=valore1&nome2=valore2
9. Semplificare il codice e minimizzare i tempi!
Cos‟è MVC?
• MODEL
– La rappresentazione (specifica per il dominio) dei dati
su cui l‟applicazione opera
Model View Controller
• VIEW
– Renderizza il modello in una forma utile
all‟interazione, tipicamente un elemento di interfaccia
utente
– Ci possono essere più viste (rappresentazioni) per un
singolo modello e per finalità diverse
• CONTROLLER
– Riceve l‟input, coordina l‟elaborazione sul model e
dispaccia tutto alla view
10. Semplificare il codice e minimizzare i tempi!
Cos‟è MVC?
• Model–View–Controller (MVC) è un pattern
architetturale usato in ingegneria del software
• Il pattern isola la business logic dalla
Model View Controller
presentation, permettendo:
– Testing
– Indipendenza nello sviluppo
• Non è un concetto nuovo
• Separation of Concerns
– “Separate content from presentation and data-
processing (model) from content.” --Wikipedia
– Originario di SmallTalk nel 1979
11. Semplificare il codice e minimizzare i tempi!
Separation of Concerns
• Questa strutturazione, basata sulla separazione
dei concetti, ha una validità comprovata da
tantissime applicazioni web già realizzate (non
Model View Controller
solo MVC)
– Separare la vista dalla logica applicativa permette di
ridisegnare l‟estetica del sito senza toccare la logica.
Questo permette di far interagire in maniera più
produttiva un web designer con il web programmer
– È possibile cambiare la tecnologia di implementazione
delle viste
– Spesso è necessario modificare la logica
dell‟applicazione senza che per questo debba essere
modificata l‟estetica
12. Semplificare il codice e minimizzare i tempi!
MVC vs WebForms
MVC WebForms
Filter Page
Model View Controller
Logica comune (log, Code-behind
security, ...)
Controller Page Controls
Codice di markup code-behind
Prende le decisioni
ed usufruisce dei
servizi
Controls
Filter Codice di markup
Logica comune
(trace, log, error
handling, ...)
View Fonte: Monorail presentation at WebDevelopersCommunity,
Presenta i dati Febbraio 2009 (Ken Egozi)
13. Semplificare il codice e minimizzare i tempi!
Per chi sono i framework MVC?
• A chi interessa REST
– Gli Url sono puliti
• A chi interessa SEO
Model View Controller
– L‟HTML “pulito” è importante
• Chi preferisce “convention over configuration”
– Oltre all‟MVC, CoC è l‟approccio tipico di Ruby on Rails
• Per chi il testing è importante
• Per chi preferisce lavorare con gli elementi base
del Web
– HTML, Javascript, CSS
• Per chi preferisce i patterns, le astrazioni
14. Semplificare il codice e minimizzare i tempi!
REST è importante
• Representational state transfer (REST) è un tipo
di architettura software per i sistemi di ipertesto
distribuiti come il World Wide Web
Model View Controller
• REST prevede che la scalabilità del Web e la
crescita siano diretti risultati di pochi principi
chiave di progettazione
• Lo stato dell'applicazione e le funzionalità sono
divisi in Risorse WEB
• Ogni risorsa è unica e indirizzabile
usando sintassi universale per uso nei link
ipertestuali
• Tutte le risorse sono condivise come interfaccia
uniforme per il trasferimento di stato tra client
e risorse
15. Semplificare il codice e minimizzare i tempi!
Url
• Gli Url non puntano più ad una pagina fisica
• Un Url è mappato su un controller
– C‟è maggiore flessibilità
Model View Controller
– C‟è un routing engine basato sugli Url, con una route
table
16. Semplificare il codice e minimizzare i tempi!
SEO è importante
• Url più comprensibili e “significativi”
– http://www.host.com/Products/CatalogItem.aspx?id=6
– http://www.host.com/Products/Televisions/Catalog/6
Model View Controller
• I motodi di ricerca penalizzano url non statici
che non possono riprodurre
17. Semplificare il codice e minimizzare i tempi!
HTML pulito è importante
• Non c‟è più necessità di un ViewState o di un
ControlState
• Risposta HTTP più compatta
Model View Controller
– Migliore scalabilità
– Migliori performances
18. Semplificare il codice e minimizzare i tempi!
Convention over Configuration
• Configuration
– Informazioni memorizzate in web.config
• Convention
Model View Controller
– Seguire le “regole”
• Nomi delle classi
• Nomi delle cartelle
– Alcune possono essere sovrascritte, altre no
19. Semplificare il codice e minimizzare i tempi!
Struttura delle cartelle
• I framework MVC enfatizzano il principio
“convenzione su configurazione”
– Ci sono delle locazioni standard per ogni tipo di file
Model View Controller
• Content
– Contiene tutti i contenuti statici (immagini, file css)
• Controllers
– Classi controller
• Models
– Classi del modello
• Scripts
– Contiene i files Javascript, compresi Ajaxe jQuery
• Views
– Contiene le viste
20. Semplificare il codice e minimizzare i tempi!
Test-Driven Development
• Il TDD è una metodologia che mette lo sviluppo dei test prima di tutto
– Spesso si scrive il codice di test prima del codice stesso!
• Ci sono tre momenti (Red/Green/Refactor) nello sviluppo TDD:
– Scrivere uno unit test che fallisce (Red)
Model View Controller
– Scrivere un test che passa (Green)
– Rifattorizzare il codice (Refactor)
• Vantaggi
– Si scrive prima di tutto il codice strettamente necessario a passare il test
– Ci si concentra su “come” il codice verrà usato (il codice è spesso migliore, più
chiaro)
– I test diventano “parte integrante” dello sviluppo stesso. Servono soprattutto
nel momento in cui si arriva vicino alla deadline!
21. Semplificare il codice e minimizzare i tempi! Per chi preferisce lavorare con gli elementi base del Web
• ID dei tag “deterministici”
– <div id=“ctl_000_ctl001_textbox”>…</div>
• Javascript is a first-class citizen
Model View Controller
– built-in support for „unobtrusive javascript‟
– built-in support per JSON
– built-in support per partial page rendering
22. Semplificare il codice e minimizzare i tempi!
Per chi importa i pattern
• Basta con “double-click here” e codice
organizzato in Event Hadlers
• Approccio invece più object oriented
Model View Controller
– Si deriva da classi base
– Override di metodi astratti o virtuali
– Implementare le interfacce
24. Semplificare il codice e minimizzare i tempi!
Controller
• È il centro del modello MVC
• Ogni richiesta (HTTP) è gestita da un controller e
renderizzata da una View
Model View Controller
• Senza un controller presentazione e business logic
sarebbero contenute direttamente nella view
– No testability
– No Separation of Conterns
– No Single Responsability
• Il controller è una classe
• La action di un controller è una “Single Responsibility”
• L‟algoritmo di default implementato in MVC per invocare
una action è una “Convention over Configuration”
– Es. In /Product/Details viene invocato il metodo Details()
della classe ProductController
25. Semplificare il codice e minimizzare i tempi!
Consigli per una ControllerAction
• Sono funzioni di coordinamento per la
presentazione
– Tutte le logiche dovrebbero stare in un‟altra classe
Model View Controller
• Sono una interfaccia
– Vale anche per i servizi Web
• Non dovrebbero contenere funzioni di accesso ai
dati
– Es. Usare il Repository Pattern
– “Se una ControllerAction non sta in uno schermo, forse
porta dietro più di una responsabilità”
26. Semplificare il codice e minimizzare i tempi!
“No more file mapping”
• In precedenza non aveva il controllo degli Url
– Filosofia della pubblicazione dei files (aspx, ashx, php,
jsp …)
Model View Controller
– <path fisico>=Server.MapPath(<path logico>)
– = Path.Combine(<physical root>, <virtual path>)
• Non molto RESTful
• Per avere il controllo degli UrlUrl Rewriting
– Mappatura di un Url web “qualsiasi” su un path (cioè su
file)
27. Semplificare il codice e minimizzare i tempi!
Controller Actions vs. Urls
• Quale è la relazione tra Controller Actions e Url
– /Product/Index
• Invoca l‟azione Index sul controller ProductController
– /Product
Model View Controller
• Invoca l‟azione Index sul controller ProductController
– /Product/Help
• Invoca l‟azione Help sul controller ProductController
– /Product/Details/34
• Invoca l‟azione Details sul controller ProductController, passando come
argomento 34 come Id
• Da dove salta fuori l‟Id?
• Il template di riferimento per gli Url è
– {controller}[/{action}[/{id}]]
– Si può customizzare intervenendo nel file Global.asax (si vedrà dopo)
• Da notare come il Controller si chiami “ProductController”, cioè
con “Controller” finale
– Si usa chiamare un controller con il nome+”Controller” finale, per
essere “rimosso” in fase di Url
28. Semplificare il codice e minimizzare i tempi!
Usare uno o più ViewEngine(s)
• ASP.NET Web Forms— ASP.NET MVC viene fornito con il motore di
visualizzazione di ASP.NET. Ma molti altri sono disponibili
– NHaml (pronounced enamel)— NHaml is an implementation of the popular RAILS Haml view
engine for the ASP.NET MVC framework. Distributed under the open source MIT license.
Model View Controller
• http://code.google.com/p/nhaml
– Spark— The idea behind the Spark view engine is to allow "the HTML to dominate the flow
and the code to fit seamlessly."
• http://dev.dejardin.org
– Brail— A port of the Brail view engine from MonoRail to the ASP.NET MVC framework. The
Brail view engine is part of the MVCContrib project.
• www.codeplex.com/MVCContrib
– nVelocity— The nVelocity view engine is a port of the Java Apache Software Foundation
Velocity project to the .NET framework. The nVelocity view engine is part of the
MVCContrib project.
• http://www.codeplex.com/MVCContrib
30. Semplificare il codice e minimizzare i tempi!
MonoRail
• MVC Framework:
– Open source, Apache licence
– Costruito sulla pipeline di ASP.NET:
Model View Controller
• Session
• Http Modules
• Authentication/Authorization
• Caching
• etc.
33. Semplificare il codice e minimizzare i tempi!
Convention over Configuration
Model View Controller
./Views/product/view.vm
Model View Controller
Controller View Engine
View
Per default viene caricata la vista che ha lo
stesso nome della action, ma posso
specificare da codice quale vista caricare:
34. Semplificare il codice e minimizzare i tempi!
MonoRail in action (1)
• Mappare l'estensione .rails sul filtro aspnet_isapi
Model View Controller
34
35. Semplificare il codice e minimizzare i tempi!
MonoRail in action (2)
• Aggiungere sezione di configurazione nel Web.config
Model View Controller
36. Semplificare il codice e minimizzare i tempi!
MonoRail in action (3)
• Aggiungere i riferimenti alle librerie:
• Castle.Core
Model View Controller
• Castle.MonoRail.Framework
• Castle.MonoRail.Framework.Views.NVelocity
• NVelocity
Dipendono dal view engine utilizzato
39. Semplificare il codice e minimizzare i tempi!
ASP.NET MVC
• È l‟implementazione di Microsoft del pattern
Model-View-Controller in un framework per il
Web in .NET
Model View Controller
– Shared source
– Costruito sulla pipeline di ASP.NET:
• Session
• Http Modules
• Authentication/Authorization
• Caching
• etc.
• È una alternativa alle WebForm applications
• È un framework altamente modulare ed
estensibile
• È un framework REST-friendly
43. Semplificare il codice e minimizzare i tempi!
Convention over Configuration
Model View Controller
./Views/products/view.aspx
Model View Controller
Controller View Engine
View
Per default viene caricata la vista che ha lo
stesso nome della action, ma posso
specificare da codice quale vista caricare:
44. Semplificare il codice e minimizzare i tempi!
ASP.NET MVC in action (1)
• Mappare l'estensione .mvc sul filtro aspnet_isapi
– Solo se siamo in IIS 5.x/6.x
Model View Controller
44
45. Semplificare il codice e minimizzare i tempi!
ASP.NET MVC in action (2)
• Web.config IIS 5.x/6.x
Model View Controller
• Web.config IIS 7.x
46. Semplificare il codice e minimizzare i tempi!
ASP.NET MVC in action (3)
• Aggiungere i riferimenti alle
librerie:
• System.Web.Mvc
Model View Controller
• System.Web.Routing
• …eventuali ViewEngine
• Non fa parte del .NET
Framework 3.5sp1
– Farà parte del .NET Framework
4.0 (ASP.NET MVC 2.0)
47. Lo stack ASP.NET aggiornato
ASP.NET MVC •Routes
ASP.NET •Lifecycle
•Controllers
WebForms •Postback
•ViewData
•ViewState
•ActionFilters
•ControlState
ASPX Pages •MasterPages
•Themes, Skins
•General Templating
ASP.NET •HttpApplicatio •HttpRuntime •Authentication
Runtime n •HttpUtility •Membership
•HttpContext •IHttpHandler •Caching
•HttpRequest •IHttpModule
•HttpResponse •Authorization
.NET Framework 3.5sp1 •Common-Language Runtime 2.0
•Base Class Library 3.5
49. Alcune imprecisioni su ASP.NET MVC
(non del sottoscritto)
Semplificare il codice e minimizzare i tempi!
• È per tutti
– No, al momento può essere presto ed è meno
“intuitivo” (rispetto alle WebForm)
Model View Controller
• È un sostituto per le WebForms
• È il miglior modo per sviluppare applicazioni
Web su .NET
• Bisogna riscrivere tutte le applicazioni WebForm
in MVC
51. Semplificare il codice e minimizzare i tempi!
Conclusioni
• Non c‟è un vincitore
– Né lo cercavamo
• C‟è sicuramente qualcosa di nuovo
Model View Controller
51
52. Semplificare il codice e minimizzare i tempi!
MVC vs WebForms
• Pro WebForms: • Contro WebForms:
– Adatte allo sviluppo – Logica di
RAD presentazione
Model View Controller
– Designer integrato in mescolata alla logica
Visual Studio di business
– Molte librerie di – Difficile da testare
controlli di terze parti – Pagine pesanti per la
– Ottime per prototipi o gestione del Viewstate
applicazioni
dimostrative
53. Semplificare il codice e minimizzare i tempi!
MVC vs WebForms
• Pro MVC: • Contro MVC:
– Separation of Concerns – No designer (è uno
(SoC) svantaggio?)
Model View Controller
– Controllo completo del – No controlli di terze
codice HTML generato parti o visuali (ancora)
– Facile da testare – Iniziale curva di
– No Viewstate (alle apprendimento per chi
volte può essere uno è abituato alle
svantaggio) applicazioni event-
– Favorisce driven
l'estendibilità e la – Scarsa
mantenibilità delle documentazione
applicazioni (MonoRail)
– Scarsa integrazione
con Visual Studio
(MonoRail)
54. Semplificare il codice e minimizzare i tempi!
WebForm 4.0 (in ASP.NET 4.0)
• È possibile disattivare o controllare la
dimensione del viewstate
• È possibile utilizzare un modulo HTTP ad hoc per
Model View Controller
eseguire la riscrittura URL
– è possibile utilizzare il Web più recente routing API
ASP.NET 3.5 SP1.
• È possibile controllare dettaglio l'ID di elementi,
inclusi gli elementi con ambiti
• L'integrazione di Framework di JavaScript
esterno è più semplice ed efficiente.
• API di gestione della cronologia in ASP.NET 3.5
SP1 più semplice
56. Semplificare il codice e minimizzare i tempi!
Link utili (MonoRail)
• Castle Project:
Model View Controller
– http://www.castleproject.org
• Blog:
– http://hammett.castleproject.org
– http://ayende.com/Blog
– http://www.kenegozi.com/blog
57. Semplificare il codice e minimizzare i tempi!
Link utili (ASP.NET MVC)
• ASP.NET MVC:
Model View Controller
– http://www.asp.net/mvc
• Blog:
– Phil Haack (http://haacked.com/)
– Scott Hanselman (http://www.hanselman.com/)
– Scott Guthrie (http://weblogs.asp.net/scottgu/)
– Simone Chiaretta (http://codeclimber.net.nz/)
– Keyvan Nayyeri (http://nayyeri.net/)
– Ugo Lattanzi (http://www.imperugo.tostring.it/)
– Jeffrey Palermo (http://jeffreypalermo.com/)
– …e tanti altri…
58. Semplificare il codice e minimizzare i tempi!
Libri (ASP.NET MVC)
• MVC in Action
– http://www.manning.com/palermo/
• Beginning ASP.NET MVC
Model View Controller
– http://www.google.it/search?hl=it&source=hp&q=Begi
nning+ASP.NET+MVC&meta=&aq=f&oq=
• Professional ASP.NET MVC
– http://www.wrox.com/WileyCDA/WroxTitle/Professio
nal-ASP-NET-MVC-1-0.productCd-0470384611.html
59. Semplificare il codice e minimizzare i tempi!
Manuel Scapolan
blog: http://www.manuelscapolan.it/
email: info@manuelscapolan.it
web: http://www.manuelscapolan.it/
Model View Controller
Skype: manuel.scapolan
Messenger manuel@live.it
Twitter: -
community: www.1nn0va.net
60. Semplificare il codice e minimizzare i tempi!
Marco Parenzan
blog: http://blog.codeisvalue.com/
email: marco.parenzan@libero.it
web: http://www.codeisvalue.com/
Model View Controller
Skype: marco.parenzan
Messenger marco.parenzan@live.it
Twitter: marco_parenzan
community: www.1nn0va.net
60