Design Pattern - Model View Controller_4x4
Transcript
Design Pattern - Model View Controller_4x4
MODEL VIEW CONTROLLER DESIGN PATTERN MODEL-VIEW-CONTROLLER INGEGNERIA DEL SOFTWARE Università degli Studi di Padova Dipartimento di Matematica Corso di Laurea in Informatica, A.A. 2013 – 2014 2 Architetturali Model view controller [email protected] INTRODUZIONE E CONTESTO Inizialmente utilizzato per GUI Smalltalk-80 Riccardo Cardin PROBLEMA Pattern architetturale Ingegneria del software mod. B … ora pattern base dell’architettura J2EE, .NET, RoR ... ... e dei maggiori framework JS: AngularJS, BackboneJS, ... Supporto a diverse tipologie di utenti con diverse interfacce Rischio di duplicazione del codice (“cut and paste”) Contesto d’utilizzo Applicazioni che devono presentare attraverso una GUI un insieme di informazioni Le informazioni devono essere costantemente aggiornate Separation of concerns Le persone responsabili dello sviluppo hanno compentenze differenti Ingegneria del software mod. B 3 Riccardo Cardin 4 Ingegneria del software mod. B Riccardo Cardin NECESSITÀ Accesso ai dati attraverso “viste” differenti Ad esempio: HTML/Js, JSP, XML, JSON… I dati devono poter essere modificati attraverso interazioni differenti con i client SOLUZIONE E STRUTTURA Disaccoppiamento (separation of concerns) Model: dati di business e regole di accesso View: rappresentazione grafica Controller: reazione della UI agli input utente (application logic) Ad esempio: messaggi SOAP, richieste HTTP, … Il supporto a diverse viste non deve influire sulle componenti che forniscono le funzionalità base. 5 Ingegneria del software mod. B Riccardo Cardin SOLUZIONE E STRUTTURA Ingegneria del software mod. B Definisce il modello dati Regole di business Dati e le operazioni su questi View Gestisce la logica di presentazione verso i vari utenti Cattura gli input utente e delega al controller l’elaborazione Aggiornamento “push model” Progettato mediante tecniche object oriented Design pattern Notifica alla view aggiornamenti del modello dati Observer pattern View deve visualizzare sempre dati aggiornati! 7 Riccardo Cardin Metodi di interazione con l’applicazione La view deve essere costantemente aggiornata Utilizzo design pattern Observer MVC in un solo ambiente di esecuzione (i.e. Javascript) Aggiornamento “pull model” Ingegneria del software mod. B Riccardo Cardin SOLUZIONE E STRUTTURA Model 6 La view richiede aggiornamenti solo quando è opportuno MVC su diversi ambienti di esecuzione Strategia JEE classico (JSP, Servlet) Ingegneria del software mod. B 8 Riccardo Cardin STRATEGIE SOLUZIONE E STRUTTURA Nativo Web based (server) Controller Trasforma le interazioni dell’utente (view) in azioni sui dati (model) Realizza l’application logic Esiste un Controller per ogni View Design patten Strategy Modifica degli algoritmi che permettono l’interazione utente con il model. View: JSP Controller: Servlet Controller centralizzato Una sola servlet come controller (Front Controller pattern) Configurazione tramite XML o annotazioni Model: EJB / Hibernate / MyBatis Web based (client, single page application) View: Javascript e template Controller: Javascript (routing) Model: Javascript Controller Input 1 Input 2 … T(Input 1) T(Input 2) … Ingegneria del software mod. B Model 9 Riccardo Cardin COLLABORAZIONI Ingegneria del software mod. B Riccardo Cardin Design pattern Observer (“push model”) View “osserva” Model 11 Ingegneria del software mod. B 10 COLLABORAZIONI Design pattern Observer (“push model”) Controller “osserva” View Sincronizzazione con backend tramite API REST/SOAP Riccardo Cardin 12 Ingegneria del software mod. B Riccardo Cardin ESEMPIO PRATICO - PULL MODEL ESEMPIO PRATICO - PULL MODEL Ricordate il nostro esempio …? Il pattern MVC in Java Model Controller Esempio Il cliente sfoglia il catalogo ed aggiunge i prodotti desiderati al carrello della spesa. Quando il cliente termina l’acquisto e deve pagare, lo stesso fornisce le informazioni sulla consegna dei prodotti e sulla carta di credito. Il sistema verifica l’autorizzazione al pagamento con carta di credito e conferma l’acquisto immediatamente e mediante una successiva mail. Proviamo a dare un esempio di GUI progettata utilizzando MVC (pull model) 13 14 View Ingegneria del software mod. B Riccardo Cardin Ingegneria del software mod. B ESEMPIO PRATICO - PULL MODEL ESEMPIO PRATICO - PULL MODEL Selezione di un prodotto e aggiunta al carrello View: pagina JSP di selezione del prodotto Selezione di un prodotto e aggiunta al carrello Controller: HttpServlet, trasformazione e redirezione public class ServletControllo extends HttpServlet { <%@ taglib uri="tlds/taglib.tld" prefix="tg" %> <html> <head>Aggiungi carrello</head> <body> Recupero input… public void doGet(request, response){ Lista di prodotto //... String prod = request.getParameter("checkboxProd"); HttpSession session = request.getSession(true); <form action="selezione_prodotto.do" method="POST"> <tg:for name="prodotto" value="${catalogo.prodotto}"> <tg:checkbox name="${prodotto.nome}" value="${prodotto.id}" display="${prodotto.descrizione}" /> </tg:for> </form> </body> </html> Prodotto prodSelez = (session.getAttribute("listaProdotti")).get(prod); Carrello carrello = (Carrello) session.getAttribute("carrello"); carello.addProdotto(prodSelez); //... response.sendRedirect("sezioneProdotti"); 15 } } Ingegneria del software mod. B Riccardo Cardin Riccardo Cardin Ingegneria del software mod. B Selezione destinazione del processo 16 Riccardo Cardin ESEMPIO PRATICO - PULL MODEL ESEMPIO PRATICO – PUSH MODEL Selezione di un prodotto e aggiunta al carrello Esempio Vogliamo costruire un’applicazione che permetta la gestione di foto e album fotografici da parte di un utente. Model: business, aggiunta del prodotto al carrello public class ServletControllo extends HttpServlet { public void doGet(request, response){ //... String prod = request.getParameter("checkboxProd"); HttpSession session = request.getSession(true); Model var Photo = Backbone.Model.extend({ Operazioni di business // Default attributes for the photo defaults: { src: "placeholder.jpg", caption: "A default image", viewed: false }, Prodotto prodSelez = (session.getAttribute("listaProdotti")).get(prod); Carrello carrello = (Carrello) session.getAttribute("carrello"); carello.addProdotto(prodSelez); // Ensure that each photo created has an `src`. initialize: function() { this.set( { "src": this.defaults.src} ); } //... response.sendRedirect("sezioneProdotti"); 17 } } Ingegneria del software mod. B Riccardo Cardin ESEMPIO PRATICO – PUSH MODEL }); Ingegneria del software mod. B }; Ingegneria del software mod. B dalla vista Riccardo Cardin Riuso dei componenti dei model Riutilizzo dello stesso model da parte di differenti view Miglior manutenzione e processo di test var buildPhotoView = function ( photoModel, photoController ) { // ... var render = function () { photoEl.innerHTML = _.template( "#photoTemplate" , { src: photoModel.getSrc() Templating }); }; photoEl.addEventListener( "click", function () { photoController.handleEvent( "click", photoModel ); }); // ... return { showView: show, hideView: hide Operazioni esposte }; 18 CONSEGUENZE View photoModel.addSubscriber( render ); Modello dati semplice Osservazione modello e comunicazione attiva con controller Supporto più semplice per nuovi tipi di client Maggiore complessità di progettazione 19 Riccardo Cardin Creazione nuova view e controller Introduzione molte classi per garantire la separazione Ingegneria del software mod. B 20 Riccardo Cardin MODEL VIEW VIEWMODEL MODEL VIEW PRESENTER Presenter (passive view) Man in the middle Osserva il modello Aggiorna e osserva la vista (dumb) Separazione sviluppo UI dalla business logic Model Interfaccia di comunicazione Metodi setter e getter per il recupero dei dati ViewModel Proiezione del modello per una vista Binding con la vista e il modello View Modella i dati, senza le operazioni su essi (dumb) Si riduce ad un template di visualizzazione e ad un’interfaccia di comunicazione Può essere sostituita da un mock in fase di test In Js si espone un protocollo View Dichiarativa (utilizzando linguaggi di markup) Two-way data-binding con proprietà del ViewModel Non possiede più lo stato dell’applicazione. Ingegneria del software mod. B 21 Riccardo Cardin Ingegneria del software mod. B 22 Riccardo Cardin GLOSSARIO MODEL VIEW VIEWMODEL Comunicazione tramite data-binding e eventi JEE Java Enterprise Edition Insieme di specifiche per l’implementazione di applicazioni enterprise Partecipazione attiva del ViewModel sui dati del Model Riccardo Cardin Framework corrispondente in casa Microsoft RoR, Ruby on Rails 23 Enterprise Java Bean (EJB), Servlet, Java Server Pages (JSP), Web services, Portlet, JMS, ... .NET Ingegneria del software mod. B Dati e operazioni che possono essere eseguiti su una UI Framework di agile programming basato su Ruby Grails Framework di agile programming basato su Groovy Ingegneria del software mod. B 24 Riccardo Cardin RIFERIMENTI Design Patterns, Elements of Reusable Object Oriented Software, GoF, 1995, Addison-Wesley GUI Arichitectures http://martinfowler.com/eaaDev/uiArchs.html MVC http://www.claudiodesio.com/ooa&d/mvc.htm Core J2EE MVC design pattern http://java.sun.com/blueprints/patterns/MVC-detailed.html Core J2EE Front controller pattern http://java.sun.com/blueprints/corej2eepatterns/Patterns/Fr ontController.html Learning Javascript Design Patterns http://addyosmani.com/resources/essentialjsdesignpatterns/ book/ Ingegneria del software mod. B 25 Riccardo Cardin