Model-View-Controller
In decursul timpului, in special in cazul proiectelor mari au fost observate o serie de aspecte care se repeta mai des si care, daca sunt respectate, ne ajuta sa beneficiem de experienta altor programatori, fara a mai trebui sa "reinventam roata". Totodata au fost observate si anumite greseli de programare sau de structurare a proiectelor mari care, daca sunt cunoscute, ar putea fi evitate de la inceput. Aspectele care este bine sa fie respectate, se grupeaza pe trei mari niveluri:
principii de programare - reprezinta reguli generale de concepere si de structurare a ierarhiillor de clase, metodelor, etc. Exemple (pentru OOP):Open-Closed, Dependency Inversion, Liskov
tipare de proiectare (design patterns) - reprezinta solutii posibile, care si-au demonstrat validitatea, pentru situatii mai des intalnite in practica. Exemple: Visitor, Factory, Singleton, Observer, Template Method, etc
arhitecturi - reprezinta reguli generale de structurare a unei aplicatii pe module si de definire a interactiunii dintre module. De multe ori diverse modele arhitecturale sunt impachetate in cadrul unor colectii de clase (frameworks), proiectate in asa fel incat sa fie usor extensibile, programatorul trebuind doar sa extinda clasele respective cu codul propriu. Exemple (framework-uri): Swing, MFC (Microsoft Foundation Classes), etc.
Model-View-Controller (MVC) este o arhitectura care imparte aplicatia in trei mari blocuri functionale. Acestea sunt:
Modelul - reprezinta toata structura de date a aplicatiei si regulile de consistenta ale datelor. In acest bloc functional intra baza de date, clasele care reprezinta structurile de date, etc.
interfata cu utilizatorul (View) - acest bloc functional are rolul de a prezenta datele catre utilizator si totodata de a prelua comenzile acestuia. Aici intra interfata grafica, clase care se ocupa cu managementul perifericelor, etc.
logica aplicatiei (Controller) - include toate modulele care formateaza datele din model pentru a fi prezentate in interfata utilizator si totodata modulele care raspund la comenzile care parvin de la utilizator si care au ca efect modificari la nivelul datelor.
Liniile continue reprezinta interactiuni directe, iar cele punctate reprezinta interactiuni indirecte
Daca luam exemplul unei aplicatii simple de balanta de conturi, care are o baza de date in care sunt inregistrate atat platile efectuate cat si banii care intra in diverse conturi, pentru a se putea afisa la un moment dat atat istoricul activitatii conturilor cat si soldurile lor curente, vom avea:
la Model - baza de date cu tabele pentru conturi, plati efectuate, incasari; rutine de validare a datelor (pentru a nu se efectua plati dintr-un cont care nu are suficiente fonduri, pentru a nu exista activitate intr-un cont anterioara deschiderii contului, ...); rutine de salvare/incarcare a bazei de date
interfata cu utilizatorul - meniul aplicatiei, rapoarte de prezentare a istoricului unui cont si a soldului curent, formulare de introducere date, formulare pentru creere conturi noi, pentru efectuare plati si pentru alimentare cont
logica aplicatiei - are rolul sa raspunda la comenzile utilizatorului, de exemplu cand acesta doreste istoricul activitatii unui cont specificat intre anumite date, sa extraga inregistrarile necesare din baza de date si sa le trimita la modulul de afisare istoric cont