Modell-nézet-vezérlő
A modell-nézet-vezérlő (MNV) (angolul model-view-controller) a szoftvertervezésben használatos programtervezési minta.[1] Összetett, sok adatot a felhasználó elé táró számítógépes alkalmazásokban gyakori fejlesztői kívánalom az adathoz (modell) és a felhasználói felülethez (nézet) tartozó dolgok szétválasztása, hogy a felhasználói felület ne befolyásolja az adatkezelést, és az adatok átszervezhetők legyenek a felhasználói felület változtatása nélkül. A modell-nézet-vezérlő ezt úgy éri el, hogy elkülöníti az adatok elérését és az üzleti logikát az adatok megjelenítésétől és a felhasználói interakciótól egy közbülső összetevő, a vezérlő bevezetésével.[2][3]
Hagyományosan asztali felhasználói felületekhez használt, de manapság már webalkalmazásokhoz is népszerűvé vált.[4] Népszerű programozási nyelvek mint a JavaScript, Python, Ruby, PHP, Java, C# és Swift már külön telepítés szükségessége nélkül rendelkeznek MNV keretrendszerekkel web- és mobilalkalmazások fejlesztésére.
Történet
szerkesztésA mintát Trygve Reenskaug írta le először 1979-ben,[5] miután a Smalltalkon dolgozott a Xerox kutatói laborban. Az eredeti megvalósítás részletesen a nagy hatású Applications Programming in Smalltalk-80: How to use Model-View-Controller című tanulmányban olvasható.[6]
Az MNV minta ezután továbbfejlődött[7] és olyan új változatok jöttek létre mint a hierarchikus modell-nézet-vezérlő (HMVC), modell-nézet-adapter (MVA), modell-nézet-prezenter (MVP), modell-nézet-nézetmodell (MVVM) és mások, amelyek különböző helyzetekhez alakították át az MNV-t.
Leírás
szerkesztésGyakori egy alkalmazás több rétegre való felbontása: megjelenítés (felhasználói felület), tartománylogika és adatelérés. Az MNV-ben a megjelenítés tovább bomlik nézetre és vezérlőre. Az MNV sokkal inkább meghatározza egy alkalmazás szerkezetét, mint az egy programtervezési mintára jellemző.
- Modell
- Az alkalmazás által kezelt információk tartomány-specifikus ábrázolása. A tartománylogika jelentést ad a puszta adatnak (pl. kiszámolja, hogy a mai nap a felhasználó születésnapja-e, vagy az összeget, adókat és szállítási költségeket egy vásárlói kosár elemeihez).
- Sok alkalmazás használ állandó tároló eljárásokat (mint mondjuk egy adatbázis) adatok tárolásához. Az MNV nem említi külön az adatelérési réteget, mert ezt beleérti a modellbe.
- Nézet
- Megjeleníti a modellt egy megfelelő alakban, mely alkalmas a felhasználói interakcióra, jellemzően egy felhasználói felületi elem képében. Különböző célokra különböző nézetek létezhetnek ugyanahhoz a modellhez.
- Vezérlő
- Az eseményeket, jellemzően felhasználói műveleteket dolgozza fel és válaszol rájuk, illetve a modellben történő változásokat is kiválthat.[8]
Az MNV gyakran látható webalkalmazásokban, ahol a nézet az aktuális HTML oldal, a vezérlő pedig a kód, ami összegyűjti a dinamikus adatokat és létrehozza a HTML-ben a tartalmat. Végül a modellt a tartalom képviseli, ami általában adatbázisban vagy XML állományokban van tárolva.
Habár az MNV-nek sok értelmezése létezik, a vezérlés menete általánosságban a következőképp működik:[9]
- A felhasználó valamilyen hatást gyakorol a felhasználói felületre (pl. megnyom egy gombot).
- A vezérlő átveszi a bejövő eseményt a felhasználói felülettől, gyakran egy bejegyzett eseménykezelő vagy visszahívás útján.
- A vezérlő kapcsolatot teremt a modellel, esetleg frissíti azt a felhasználó tevékenységének megfelelő módon (pl. a vezérlő frissíti a felhasználó kosarát). Az összetett vezérlőket gyakran alakítják ki az utasítás mintának megfelelően, a műveletek egységbezárásáért és a bővítés egyszerűsítéséért.
- A nézet (közvetve) a modell alapján megfelelő felhasználói felületet hoz létre (pl. a nézet hozza létre a kosár tartalmát felsoroló képernyőt). A nézet a modellből nyeri az adatait. A modellnek nincs közvetlen tudomása a nézetről.
- A felhasználói felület újabb eseményre vár, mely az elejéről kezdi a kört.
A modell és a nézet kettéválasztásával az MNV csökkenti a szerkezeti bonyolultságot, és megnöveli a rugalmasságot és a felhasználhatóságot.
- Szolgáltatás (Service)
- A vezérlő és a modell közötti réteg. A modelltől kér le adatokat és a vezérlőnek adja azt. Ennek a rétegnek a segítségével az adattárolás (modell), adatlekérés (szolgáltatás) és adatkezelés (vezérlő) elkülöníthetőek egymástól. Mivel ez a réteg nem része az eredeti MNV mintának, ezért használata nem kötelező.
Előnyei és hátrányai
szerkesztésElőnyök
szerkesztés- Egyidejű fejlesztés – Több fejlesztő tud egyszerre külön a modellen, vezérlőn és a nézeteken dolgozni.
- Magas szintű összetartás – MNV segítségével az összetartozó funkciók egy vezérlőben csoportosíthatóak. Egy bizonyos modell nézetei is csoportosíthatóak.
- Függetlenség – MNV mintában az elemek alapvetően nagy részben függetlenek egymástól
- Könnyen változtatható – Mivel a felelősségek szét vannak választva a jövőbeli fejlesztések könnyebbek lesznek
- Több nézet egy modellhez – Modelleknek több nézetük is lehet
- Tesztelhetőség – Mivel a felelősségek tisztán szét vannak választva, a külön elemek könnyebben tesztelhetőek egymástól függetlenül
Hátrányok
szerkesztésA MNV hátrányait általában a szükséges extra kódból adódnak.
- Kód olvashatósága – A keretrendszer új rétegeket ad a kódhoz ami megnöveli a bonyolultságát
- Sok boilerplate kód – Mivel a programkód 3 részre bomlik, ebből az egyik fogja a legtöbb munkát végezni a másik kettő pedig az MNV minta kielégítése miatt létezik.'[10]
- Nehezebben tanulható – A fejlesztőnek több különböző technológiát is ismernie kell a MNV használatához.
Források
szerkesztés- ↑ https://www.youtube.com/watch?v=o_TH-Y78tt4&t=1667
- ↑ The DCI Architecture: A New Vision of Object-Oriented Programming (html). Artima Developer , 2009. március 20. [2009. március 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2019. augusztus 3.) „More deeply, the framework exists to separate the representation of information from user interaction.”
- ↑ Burbeck (1992): "... the user input, the modeling of the external world, and the visual feedback to the user are explicitly separated and handled by three types of object."
- ↑ Davis, Ian. „What Are The Benefits of MVC?”, Internet Alchemy (Hozzáférés: 2016. november 29.)
- ↑ http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
- ↑ How to use Model-View-Controller (MVC). [2009. augusztus 1-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. január 13.)
- ↑ The evolution of MVC and other UI architectures from Martin Fowler.
- ↑ Simple Example of MVC (Model–View–Controller) Architectural Pattern for Abstraction
- ↑ Buschmann, Frank (1996) Pattern-Oriented Software Architecture.
- ↑ Is Model-View-Controller dead on the front end?, 2016. október 9.
Fordítás
szerkesztésEz a szócikk részben vagy egészben a Model–view–controller című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.