Modell-nézet-vezérlő

programtervezési minta
Ez a közzétett változat, ellenőrizve: 2023. május 31.

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]

Az MNV tervezési minta egy általános reprezentációja

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és

A 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.

Gyakori 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]

  1. A felhasználó valamilyen hatást gyakorol a felhasználói felületre (pl. megnyom egy gombot).
  2. 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.
  3. 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.
  4. 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.
  5. 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é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és

A 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.
  1. https://www.youtube.com/watch?v=o_TH-Y78tt4&t=1667
  2. 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.”
  3. 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."
  4. Davis, Ian. „What Are The Benefits of MVC?”, Internet Alchemy (Hozzáférés: 2016. november 29.) 
  5. http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
  6. 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.)
  7. The evolution of MVC and other UI architectures from Martin Fowler.
  8. Simple Example of MVC (Model–View–Controller) Architectural Pattern for Abstraction
  9. Buschmann, Frank (1996) Pattern-Oriented Software Architecture.
  10. Is Model-View-Controller dead on the front end?, 2016. október 9.

Fordítás

szerkesztés

Ez 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.