Model-view-controller
Z Wikipedie, otevřené encyklopedie
Model-view-controller (MVC) (někdy také označovaná jako Model-2) je softwarová architektura která rozděluje datový model aplikace, uživatelské rozhraní a řídicí logiku do tří nezávislých komponent tak, že modifikace některé z nich má minimální vliv na ostatní.
MVC je často chápán jako návrhový vzor, nicméně se týká architektury aplikací mnohem více než klasický návrhový vzor. Tudíž může být užitečný pojem architektonický vzor (architectural pattern; Buschmann, et al 1996) nebo možná agregační návrhový vzor (aggregate design pattern).
Existuje také architektura Model 1, která odděluje pouze datový model od uživatelského rozhraní s řídící logikou.
[editovat] Princip
Obecně řečeno, vytváření aplikací s využitím architektury MVC vyžaduje vytvoření tří komponent, mezi které patří:
- Model (model), což je doménově specifická reprezentace informací, s nimiž aplikace pracuje.
- View (pohled), který převádí data reprezentovaná modelem do podoby vhodné k interaktivní prezentaci uživateli.
- Controller (řadič), který reaguje na události (typicky pocházející od uživatele) a zajišťuje změny v modelu nebo v pohledu.
Komponenty řadič a pohled jsou ve standardním rozdělení vrstev na prezentační, doménovou a datovou obvykle zařazovány jako prezentační vrstva. V MVC je tato prezentační vrstva rozdělena mezi komponenty řadič a pohled, nicméně nejdůležitější rozdělení je mezí prezentací a doménovou vrstvou.
Ačkoliv může být koncept MVC realizován různým způsobem, obecně platí tento princip:
- Uživatel provede nějakou akci v uživatelském rozhraní (např. stiskne tlačítko).
- Řadič obdrží oznámení o této akci z objektu uživatelského rozhraní.
- Řadič přistoupí k modelu a v případě potřeby ho zaktualizuje na základě provedené uživatelské akce (např. zaktualizuje nákupní košík uživatele).
- Model je pouze jiný název pro doménovou vrstvu. Doménová logika zpracuje změněná data (např. přepočítá celkovou cenu, daně a expediční poplatky pro položky v košíku). Některé aplikace užívají mechanizmus pro perzistentní uložení dat (např. databázi). To je však otázka vztahu mezi doménovou a datovou vrstvou, která není architekturou MVC pokryta.
- Komponenta pohled použije zaktualizovaný model pro zobrazení zaktualizovaných dat uživateli (např. vypíše obsah košíku). Komponenta pohled získává data přímo z modelu, zatímco model nepotřebuje žádné informace o komponentě View (je na ní nezávislý). Nicméně je možné použít návrhový vzor pozorovatel, umožňující modelu informovat jakoukoliv komponentu o případných změnách dat. V tom případě se komponenta view zaregistruje u modelu jako příjemce těchno informací. Je důležité podotknout, že řadič nepředává doménové objekty (model) komponentě pohledu, nicméně jí může poslat příkaz, aby svůj obsah podle modelu zaktualizovala.
- Uživatelské rozhraní čeká na další akci uživatele, která celý cyklus zahájí znovu.
[editovat] Příklady implementací
Tento vzor poprvé popsal Trygve Reenskaug v roce 1979. Poprvé byl použit v jazyce Smalltalk, vyvíjeném v Xerox research labs. Touto implementací bylo inspirováno mnoho dalších projektů, např.:
- NeXTSTEP a OPENSTEP, jejichž vývojová prostředí podporovala použití MVC;
- Cocoa, založená na těchto technologiích, také používá MVC;
- Microsoft Foundation Classes (MFC).
Občas je možné se setkat s tvrzením, že Swing (knihovna pro tvorbu grafického uživatelského rozhraní v Javě) také užívá MVC. To není pravda, neboť tato knihovna slučuje řadič a pohled do jedné komponenty a tudíž užívá jednodušší vzor Model 1.
V současné době se koncept MVC užívá především jako architektura webových aplikací. U složitějších aplikací je to způsob, jak zajistit jejich flexibilitu a spolehlivost i při častých změnách a jejich rychlém vývoji. Tento vzor bývá často pochopen nesprávně a mnoho aplikací tvrdí, že jej využívají, ačkoliv fakticky nesplňují základní požadavek, kterým je oddělení aplikační a prezentační logiky.
- JavaServer Faces , Jakarta Struts a Webwork2 jsou momentálně nejpopulárnější rámce pro tvorbu webových aplikací, které využívají MVC. Struts pracuje na úrovni stránek, JSF na úrovni komponent (oba se ale nevylučují a je možné Struts i JSF použít zároveň).
- Vývojové prostředí WebObjects je silně založeno na MVC.
- Fusebox
- Mach-II
- Maypole
- Catalyst
- Tapestry
- ZNF
- Apache Cocoon
- Ruby on Rails
- Django