Documente Academic
Documente Profesional
Documente Cultură
Model-View-Controller (MVC) La General
Model-View-Controller (MVC) La General
Cuprins
Busuioc Andrei - prezentare generala, editare
Context
Problema
Solutia
Istoric
Implementare
Functionare
Variatii
Bibliografie
Constanzo Riccardo - model
Model
Roluri
Comunicare model-view
Bibliografie
Codita Bogdan Alexandru - view
View
Ierarhia view/subview
Afisarea View
Responsabilitati in MVC
Relatia view-controller
Relatia view-model
Bibliografie
Ciuca Alexandru - controller
Controller
Implementare
Bibliografie
Context
In general, scopul multor computere este acela de a prelua informatii dintro anumita locatie, de a o prelucra dupa preferintele utilizatorului si, in cele din
urma, de a o afisa utilizatorului. Dupa ce utilizatorul modifica continutul
informatiei si dupa aplicarea unor eventuale procesari aditionale, sistemul
reinoieste informatia in locul de unde a preluat-o initial.
Cea mai usoara metoda de a realiza o aplicatie care realizeaza aceste
operatii este de a pune laolalta operatiile si de a le trata ca pe un tot. Aceasta
metoda este buna in sensul ca este usor de implementat. Ulterior apar insa
probleme cand se doreste schimbarea uneia din componentele fluxului de date,
spre exemplu atunci cand se doreste schimbarea interfetei. O alta problema tine
de logica de business ce trebuie incorporata, logica care si ea este supusa
schimbarilor si care merge dincolo de simpla interschimbare de informatie.
Problema
Apare asadar nevoia de a modulariza aplicatia, de a delimita in mod clar
partile componente spre a putea fi usor modificate si ca dupa modificare sa fie
inca compatibile cu celelalte module ce formeaza aplicatia.
Solutia
O solutie la aceasta problema este arhitectura Model-View-Controller
(MVC) care separa partea de stocare a datelor de cea de prezentare si de
prelucrare. Avem asadar trei clase distincte:
Model-ul se ocupa de comportarea si datele aplicatiei; raspunde la cereri
despre starea sistemului, la cereri de schimbare de stare si notifica utilizatorul
atunci cand aceste schimbari au avut loc pentru ca acesta sa poata reactiona.
View-ul transpune model-ul intr-o forma care permite o interactionare
usoara, in mod tipic o interfata vizuala. Pot exista multiple view-uri pentru un
singur model pentru scopuri diferite.
Controller-ul primeste input de la utilizator si initiaza un raspuns in urma
cererilor catre obiectele model. Controller-ul este cel care controleaza celelalte
doua clase de obiecte, view si model, instructandu-le sa execute operatii pe
baza input-ului primit de la utilizator.
Variatii
In Application Programming in Smalltalk-80: How to use Model-ViewController (MVC), Steve Burbeck descrie doua variante de MVC: un model pasiv
si un model activ.
Modelul pasiv este folosit
cand un controller manipuleaza
model-ul exclusiv. Controller-ul
modifica model-ul si apoi
informeaza view-ul ca model-ul a
fost schimbat si ca trebuie
reimprospatat. In acest scenariu
model-ul este complet
independent de view si controller,
ceea ce inseamna ca model-ul nu
are cum sa raporteze schimbarile
sale de stare.
Protocolul HTTP este un exemplu
eleocvent al acestui model pasiv.
Browserul nu are cum sa
primeasca update-uri asincrone de la server. Browserul afiseaza view-ul si
raspunde la input utilizator dar nu detecteaza schimbari in datele de pe server.
Doar atunci cand utilizatorul cere in mod explicit o reimprospatare serverul este
interogat pentru eventualele schimbari.
Modelul activ este folosit cand model-ul isi schimba starea fara implicarea
controller-ului. Acest lucru se poate intampla cand alte surse schimba datele iar
schimbarile trebuie reflectate in view-uri.
Un exemplu de astfel de model implementat este banda de stiri in timp real a
canalelor de stiri. Aceasta afiseaza in timp real datele din baza de date pe
masura ce acestea sunt modificate. (pe masura ce noi stiri sunt adaugate)
Totusi, pentru a avea acest model ar insemna ca view-ul sa fie dependent de
model, ori noi dorim ca ambele sa fie independente unul de celalalt.
Introducem notiunea de observator care este un obiect ce notifica celelalte
obiecte de schimbari de stare fara a introduce dependente intre acestea. Viewurile se subscriu la observator pentru a primi notificari. Cand un model se
schimba el notifica toate observatoarele atasate lui de schimbarea produsa. La
randul lor, observatoarele notifica view-urile de schimbarile raportate lor.
Aceasta metoda este cu atat mai eficienta cu cat exista un numar mai mare de
5
Bibliografie
1. MSDN Library - http://msdn.microsoft.com/en-us/library/ff649643.aspx
2. Wikipedia.org - http://en.wikipedia.org/wiki/Model%E2%80%93View
%E2%80%93Controller
Model
Modelul este inima aplicatiei, partea care nu se schimba. Modelul este
partea ce contine datele, informatiile despre utilizatori. Este, in general,
principalul obiectiv al programatorilor, el constituind marea parte a efortului de
programare. Modelul este cel ce raspunde anumitor comenzi si cel ce comunica
cu baze de date externe.
Model-ul are nevoie de o baza de data unde sa stocheze permanent
datele, care baza de date poate fi incapsulata in model sau poate fi la o anumita
locatie cunoscuta de model. Totusi, in aplicatii mai usoare, model-ul poate fi
confundat cu baza de date insasi, daca operatile pe care le face model-ul sunt
operatii foarte simple.
Intr-o aplicatie creata astfel incat sa respecte acest concept, partea de
model va lucra doar cu starea aplicatiei si cu logica ei, nu va conta cum este sau
va fi reprezentata aceasta stare catre utilizator sau cum interactioneaza acesta
cu aplicatia.
Un alt aspect important este ca atat view-ul, cat si controller-ul depind de
model-ul, in timp ce model-ul nu depinde de ele. Astfel modelul poate fi
implementat si testat fara sa fie nevoie de interfata grafica, dezvoltarea acesteia
facandu-se in paralel.
Model-ul este utilizat la organizarea informatiei si anuntarea cnd aceasta
se modifica. El contine doar date si functionalitati care sunt legate printr-un scop
comun. Daca ar fi fost cazul de a modela date din doua grupuri care nu sunt
legate intre ele, s-ar fi creat doua modele separate. Un model va contine mai
mult decat date si functii care opereaza pe aceste date. Scopul unui model este
de a realiza o aproximare, sau abstractizare, in mediul informational al unor
procese sau sisteme din lumea reala. El nu trebuie sa se limiteze la a captura
starea unui preces sau sistem, ci chiar la cum acel sistem functioneaza, ceea ce
face foarte usoara folosirea modelarii din lumea reala la definirea propriilor
sisteme.
VIEW
View este una dintre cele trei componente ale arhitecturii Model-ViewController si are rolul de a atribui Model-ului o forma adecvata pentru
interactiune, de obicei un element de interfata cu utilizatorul. Pot exista mai
multe view-uri pentru acelasi model.
De fiecare data cand este schimbat modelul, fiecare view al modelului este
anuntat ca trebuie sa schimbe reprezentarea vizuala pe ecran. O regiune a
afisajului care nu este in concordanta cu informatia primita de la model se
numeste daunatoare sau invalida. Cand se face o schimbare, view identifica
partea de ecran modificata si o raporteaza la sistemul de ferestre ca fiind
invalida. Acesta confirma zona stricata, urmand sa fie redesenata de catre
view.
10
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
1.
2.
3.
4.
5-9.
10-13.
14.
AFISAREA VIEW
View poate avea nevoie de propriul protocol de afisaj care va fi utilizat atat
pentru afisarea imaginii initiale, cat si pentru reafisarea imaginii in cazul unei
schimbari a modelului. Dupa o actualizare a modelului, View trimite propriul
afisaj (self display). View display trimite pe rand self displayBorder, self
displayView, self displaySubviews. Daca View cere o afisare speciala diferita
de cea mostenita, el considera afisarea ca fiind una dintre cele trei enumerate
mai sus. Pentru diverse tehnici de afisare putem cauta implementari in
11
http://st-www.cs.illinois.edu/
http://www.phpwact.org/
http://www.uta.fi/english
http://wiki.squeak.org
http://www.moock.org
http://www.wikipedia.org/
14
Controller
Controllerul este componenta principal a arhitecturii MVC, ce conine
logica de execuie a aplicaiei. El reprezint att punctul de intrare n aplicaie,
ct i cel de ieire i se folosete de celelalte componente (model i view)
pentru a-i ndeplini sarcina dat. Controllerul este conceptualizat ca o clas ce
poate ndeplini mai multe funcii, numite aciuni. Fiecare funcie primete un set
de date de intrare, ce reprezint parametri sau informaii date de ctre utilizator
(datele problemei ce se dorete a fi soluionat). Aceste date sunt puse cap la
cap de ctre logica intern a controllerului, cu ajutorul claselor model. n urma
prelucrrii lor, rezult datele de ieire, reprezentnd soluia aplicaiei, date ce
sunt trimise unei clase view pentru a putea fi transformate ntr-un format neles
de ctre utilizator. Controllerul este astfel o cutie neagr ce accept anumite
date de intrare, i produce n urma unor prelucrri datele de ieire.
Procesarea datelor de intrare n cadrul unui controller se face prin simpla
manipulare a claselor model, ce pun la dispoziie interfee, adic metode i
proprieti ce pot fi accesate, utilizate i modificate din exterior (de ctre
controller) fr a cunoate structura intern a modelului. Astfel, controllerul
lucreaz cu aceste obiecte, modificndu-le n modul acceptat de ctre interfaa
clasei. Dei acest lucru nseamn transparen total, nefiind nevoie a se
cunoate structura intern a clasei respective, apar i limitri legate de
imposibilitatea de a accesa date sau a face prelucrri ce nu au fost prevzute n
clasa respectiv. Un exemplu de astfel de situaie se poate ntlni atunci cnd
clasele model reprezint echivalene a unor tabele dintr-o baz de date, i se
dorete efectuarea unui anumit tip de interogare n cadrul controllerului,
interogare ce nu a fost prevzut de model. Principial, controllerul nu are acces
direct la baza de date, care este considerat doar un mod de stocare brut, deci
nu poate efectua n mod direct interogri. Singura soluie este implementarea de
ctre model a unei interogri corespunztoare care s satisfac cerinele
controllerului.
15
Fig. 1
Bibliografie
1. Patterns of Enterprise Application Architecture, Martin Fowler, David Rice,
Addison Wesley 2002
17