Ingineria Programării Design Patterns Modele de proiectare Curs Ovidiu Gheorghieş, ogh@infoiasi.ro Adriana Gheorghieş, adrianaa@infoiasi.ro
Model View Controller Cel mai popular model de proiectare Dezvoltat de Trygve Reenskaug pentru Smalltalk in 1979. A jucat un rol important in proiectarea majoritatii sistemelor ce ofera o interfata utilizator (Smalltalk, MFC, Swing, JSF etc.) Este luat ca referinta cand se discuta despre proiectarea unei aplicatii cu interfata utilizator.
MVC - motivatie [exemplu cod o prima implementare]
MVC Trei roluri Model : obiect care reprezinta o anumita informatie despre domeniul problemei View: reprezinta o modalitate de afisare a obiectului in cadrul unei interfete utilizator Controller: gestioneaza modificarile efectuate asupra informatiei. Doua idei principale Separarea prezentarii de model Separarea controlerului de prezentare
Arhitectura Exista multiple variante de a implementa arhitectura MVC. Un exemplu:
Separarea prezentarii de model Prezentarea si modelul se refera la aspecte diferite ale sistemului Prezentare: cum sa proiectez o interfata buna (intuitiva, placuta, productiva) Model: cum sa proiectez functionalitatea programului (eficienta, corectitudine). Prezentarea modelului in mai multe feluri Observator (?) Obiectele non-vizuale sunt mai usor de testat
Separarea prezentarii de controler Mai putin importanta pentru aplicatii locale In mod tipic un element de prezentare are un singur controler A aparut ca o necesitate odata cu dezvoltarea aplicatiilor Web.
MVC - implementare [implementarea unui exemplu MVC]
Provocari Cine este responsabil pentru validarea modificarilor facute de prezentare? Cine realizeaza eventualele conversii necesare? Modul de actualizare a prezentarilor Modelul este Observabil Un Observabil este infasurat peste model Cine este Observatorul? Prezentarea sau Controlerul? Modele avansate de observatori
MVC aplicatii web Model 1 Model 2 http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html
Worker Thread Ex: Un algoritm genetic ruleaza mult timp. In acest timp interfata grafica trebuie sa raspunda la comenzi Ex: Un fractal dureaza pana este desenat Utilizatorul ar putea sa vrea sa opreasca desenarea, apoi sa continue Ex: Save, Close
Worker thread public class WorkerThread { private Vector tasks = new Vector(); private boolean waitingtask; private boolean shouldshutdown; // public void put(runnabletask r) { /* */ public RunnableTask take() { /* */
Worker thread public class WorkerThread { public WorkerThread() { tasks = new Vector(); waitingtask = false; new Thread(new Worker()). private class Worker implements Runnable{ public void run(){ while (!shouldshutdown){ RunnableTask r = take(); r.execute();
Worker thread public void put(runnabletask r){ tasks.add(r); if (waitingtask){ synchronized (this){ notifyall(); public RunnableTask take() { if (tasks.isempty()){ synchronized (this){ waitingtask = true; try { wait(); catch (InterruptedException ie) { waitingtask = false; return (RunnableTask)tasks.remove(0);
Tranzactie Scop: gruparea unei colectii de metode astfel incat ori toate sunt executate cu succes, ori nici una nu modifica starea obiectelor. Exemplu: transferarul de bani dintr-un cont in altul Fiecare participant la tranzactie incearca sa isi indeplineasca rolul. Daca unul esueaza, informeaza gestionarul tranzactiei, care cere participantilor sa revina la starea initiala.
Tranzactie
Tranzactie Pasii unei tranzactii Se creaza identificatorul tranzactiei Se apeleaza join pentru toti participantii Daca pentru un participant metoda join esueaza, tranzactia este oprita (a esuat) Se apeleaza metodele tranzactiei Imediat ce una dintre ele esueaza, tranzactia este oprita Cand toate metodele tranzactiei sunt efectuate cu success, se apeleaza commit pentru toti participantii.
Sesiune Scop: ofera unui server posibilitatea de a distinge intre mai multi clienti, permitand asocierea unei stari cu comunicarea clientserver. In mod tipic, mai multi clienti vor face mai multe cereri simultan, iar serverul trebuie sa stie ce cereri vin de la care clienti. Abordarea uzuala consta in folosirea unui sessionid
Sesiune Acest model este potrivit pentru o aplicatie client-server in care exista urmatoarele cerinte Identitatea clientului: trebuie sa existe o modalitate de a distinge intre utilizatorii unui sistem. Continuitatea operatiilor: operatiile pot fi organizate sub forma de tranzactii sau workflow. Persistenta datelor: se doreste asocierea unor date cu un client pe perioada in care clientul interactioneaza cu serverul
Sesiune: variante de implementare Gestionarea identitatii sesiunii Identificarea pe baza autentificarii: sessionid oferit pe baza de login Identificarea implicita: o conexiune persistenta intre client si server consta in sesiune Identificarea arbitrara: orice client nou primeste automat un sessionid Gestionarea starii sesiunii Pe partea de client (reduce incarcarea serverului) Pe partea de server (securitate sporita, eficienta)
Vă mulńumim!... pentru atenńie răbdare