MVC programfelépítés GUI alkalmazásban megfigyelő minta használata nélkül

Az előző két bejegyzésben az MVC architektúrára épülő programfelépítést szemléltettük. Elsőként egy nem grafikus felhasználói felületű alkalmazásban, majd pedig grafikus felhasználói felületet (GUI) kínáló alkalmazásban. Mindkét esetben a megfigyelő programtervezési mintát (observer design pattern) alkalmaztuk a megjelenítést végző objektumok értesítésére, hogy a modell állapota megváltozott, és ennek megfelelően módosuljon a megjelenítés.

Most ugyanezt a mintapéldát fogjuk módosítani úgy, hogy a modell állapotváltozásának GUI-n történő megjelenítésének kezdeményezését nem a megfigyelő programtervezési mintával érjük el, hanem ezt a feladatot a Controller objektum fogja végezni. Látjuk majd, hogy nem kell sok módosítást végezni, legtöbb esetben törölni kell kódokat.

Ahogy az előző bejegyzésben, a könnyebb áttekinthetőség érdekében most is külön modulokba szerveztük az MVC egyes összetevőit (Model, View és Contoller objektumokat) rendre a model.py, view_gui.py és main_controller.py modulokba.

A model.py tartalma meglehetősen leegyszerűsödik, mert minthogy nem alkalmazzuk a megfigyelő mintát, így a Publisher és Subscriber osztályokra nincs szükség, és ennek megfelelően a Car osztály accelerate() metódusában az értesítést végző notify_subscribers() hívás sem kell már. A model.py ezek után megmaradt tartalma látható alább:

Szintén csak törlést kell végezni a view_gui.py modul kódjaiban. Mivel már nem használjuk a Subscriber osztályt, ezért ennek importálására nincs szükség. Továbbá a megjelenítéseket végző CarSpeedView1 és CarSpeedView2 osztályok sem kell, hogy örököljenek a Subscriber osztályból, és így az update_view() metódusokra sincs szükség. Az így módosított view_gui.py modul teljes kódja tehát ez lesz:

Az egyetlen, ahol a törlésen kívül kódbeírásra, illetve módosításra van szükség az a main_controller.py modul, azon belül is a Controller osztály definíciója.

Először is törölni kell az __init__ metóduson belül „A megfigyelő View példányok felvétele a modell mint megfigyelt objektum értesítési listájára.” kommenttel jelzett kódsorokat. Helyette itt felveszünk egy privát attribútumot, amely a GUI főobjektumot, annak referenciáját tárolja. Másrészt a change_model_state() metódust kiegészítjük olyan kódsorokkal, amelyek azt biztosítják, hogy a modell állapotváltozását követően (azaz a Car példány sebességének megváltozása után) a megváltozott állapot (sebesség) megjelenjen a GUI-n. Ez lényegében a megjelenítésért felelős view objektumok show() metódusának meghívását jelenti az új sebességgel mint argumentummal. /Az egyszerűség kedvéért a modell állapotát, a sebességet, nem tulajdonságon (property) keresztül, vagy más getter metódussal, hanem közvetlenül kérjük ki./

Ezen elvek alapján a main_controller.py modul módosult kódja a következő:

A main_controller.py futtatásával kapott eredmények megegyeznek az előző bejegyzésben szereplő programváltozatáéval, így az ott látható épernyőkép sorozat hasonló módon most is előállítható:

Látva az előző bejegyzésben szereplő programkódokhoz képesti jelentős egyszerűsítéseket, esetleg arra a következtetésre juthatunk, hogy nem érdemes a megfigyelő mintát alkalmazni, hiszen csak bonyolítja a kódot. Egy ilyen konklúzió azonban nem lenne helyes. Ne felejtsük el, hogy a bemutatott program csak egy nagyon egyszerű, illusztrációs célú példa az MVC alapelvének és kialakításának bemutatására. Tényleges alkalmazásfejlesztéskor annak konkrét sajátosságai figyelembevételével (pl. a modell és a GUI összetettsége) kell meghozni a döntést, hogy a megjelenítő objektumok értesítését megfigyelő mintával vagy anélkül valósítjuk meg.

E bejegyzés témájához a Python tudásépítés lépésről lépésre című e-könyv következő részei kapcsolódnak: az „Osztály vigyázz! – típuslétrehozás osztályokkal” fejezet, a „Panelprogram – modulok” fejezet, valamint a „Grafikus felhasználói felület készítése” fejezet.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.