Pure MVC - Mediovski

25
Pure MVC w AS3 Tomasz Bińkowski [email protected] 29 stycznia 2010

Transcript of Pure MVC - Mediovski

Page 1: Pure MVC - Mediovski

Pure MVC w AS3

Tomasz Biń[email protected]

29 stycznia 2010

Page 2: Pure MVC - Mediovski

Spis Treści

1. Istota MVC2. Opis PureMVC

– Struktura plików– Istota obiektu Facade– Obiekty klasy Command– Obiekty klasy Proxy– Obiekty klasy Mediator– Obiekty klasy Notification

3. MultiCore 4. Zastosowanie

1. Zalety i Wady2. Przykłady aplikacji

2/24

Page 3: Pure MVC - Mediovski

Istota MVC

• Model – opisuje logikę aplikacji odpowiada za pobieranie danych z bazy danych, nic nie wie o widoku

• Widok – wyświetla dane przekazywane przez kontroler, nic nie wie o modelu

• Kontroler – reaguje na żądania użytkownika i wywołuje odpowiednie modele i przekazuje dane z modeli do widoku

3/24

Page 4: Pure MVC - Mediovski

2. Opis PureMVC

Page 5: Pure MVC - Mediovski

Pure MVC to „lekki” framework oparty na klasycznym wzorcu architektonicznym MVC.

•każdy obiekt z wzorca MVC (Model, Widok i Kontroler) jest Singletonem.

•wszystkie elementy MVC skupione są przez interfejs „Fasady”, który także jest Singletonem.

2. Opis PureMVC 5/24

Page 6: Pure MVC - Mediovski

2. Opis PureMVC 6/24

Komunikacja obiektów:

Page 7: Pure MVC - Mediovski

2.1. Struktura plików

controller – katalog z obiektami command

model – katalog z obiektami proxy oraz vo

view – katalog z obiektami mediator oraz pliki mxml (w przypadku Flex oraz Air)

7/24

Page 8: Pure MVC - Mediovski

2.2. Obiekt Fasady

• obiekt fasady stanowi centralne miejsce dostępu do publicznych metod.

• inicjalizuje i przechowuje główne elementy MVC (Command).

• dzięki fasadzie podstawowe obiekty Proxy, Mediator, Command mogą komunikować się między sobą w bardzo prosty sposób.

8/24

Page 9: Pure MVC - Mediovski

2.2. Obiekt Fasady 9/24

/** * Singleton ApplicationFacade */ public static function getInstance() : ApplicationFacade

{ if ( instance == null ) instance = new ApplicationFacade(

); return instance as ApplicationFacade; }

/** * Rejestruje obiekty command */ override protected function initializeController( ) : void { super.initializeController(); registerCommand( STARTUP, ApplicationStartupCommand ); } /**

* Start aplikacji**/

public function startup( app:CafeTownsend ):void { sendNotification( STARTUP, app ); }

Page 10: Pure MVC - Mediovski

2.2. Obiekt Fasady

Klasa fasady w swoim ciele zawiera listę statycznych zmiennych definiujących nazwy notyfikacji w systemie.

W przypadku dużego serwisu (nie korzystającego z multicore) takie umiejscowienie stałych może być bardzo kłopotliwe.

10/24

Page 11: Pure MVC - Mediovski

2.2. Obiekt Fasady 11/24

/** * Obiekt Fasady **/public class ApplicationFacade extends Facade{ public static const STARTUP:String = "startup"; public static const SHUTDOWN:String = "shutdown"; public static const APP_LOGOUT:String = "appLogout"; public static const APP_LOGIN:String = "appLogin"; public static const VIEW_EMPLOYEE_LOGIN:String= "viewEmployeeLogin"; public static const VIEW_EMPLOYEE_LIST:String= "viewEmployeeList"; public static const ADD_EMPLOYEE:String= "addEmployee"; public static const UPDATE_EMPLOYEE:String= "updateEmployee"; public static const SAVE_EMPLOYEE:String= "saveEmployee"; public static const DELETE_EMPLOYEE:String= "deleteEmployee";

public

Page 12: Pure MVC - Mediovski

2.3. Obiekt Command

• obiekt command zarejestrowany w fasadzie służy do komunikacji z mediatorami (modelami)

• obiekty te ułatwiają organizację całego systemu.

• najważniejszą częścią obiektu jest metoda „execute”, w której mogą być rejestrowane obiekty Proxy bądź Mediatory

12/24

Page 13: Pure MVC - Mediovski

2.3. Obiekt Command 13/24

/** * Rejestracja Proxy **/ override public function execute( note:INotification ) :void { facade.registerProxy(new EmployeeProxy()); facade.registerProxy(new UserProxy()); }

/** * Rejestracja Mediatorów i pobranie danych **/ override public function execute( note:INotification ) :void { facade.registerMediator( new ApplicationMediator( note.getBody() ) ); var employeeProxy:EmployeeProxy = facade.retrieveProxy( EmployeeProxy.NAME ) as EmployeeProxy; employeeProxy.loadEmployees();

sendNotification( ApplicationFacade.VIEW_EMPLOYEE_LOGIN ); }

Page 14: Pure MVC - Mediovski

2.4. Obiekt Proxy

• są to obiekty, które odpowiadają za całą logikę systemu.

• najczęściej stosowane są do pobierania/zapisywania danych.

• obiekt proxy implementuje interfejs Inotifier, dzięki któremu może wysyłać powiadomienia do systemu.

14/24

Page 15: Pure MVC - Mediovski

2.4. Obiekt Proxy 15/24

/** * Funkcja wywołująca obiekt pobierający dane **/public function loadEmployees():void{ var delegate : LoadEmployeesDelegate = new LoadEmployeesDelegate( this ); delegate.loadEmployeesService();}/** * Poprawne pobranie danych, wysyła notyfikację do systemu **/public function result( rpcEvent : Object ) : void{ data = rpcEvent.result.employees.employee as ArrayCollection; sendNotification( ApplicationFacade.LOAD_EMPLOYEES_SUCCESS );}

/** * Błąd podczas pobierania danych, wysyła notyfikację do systemu **/public function fault( rpcEvent : Object ) : void { data = new ArrayCollection(); errorStatus = "Could Not Load Employee List!"; sendNotification( ApplicationFacade.LOAD_EMPLOYEES_FAILED );}

Page 16: Pure MVC - Mediovski

2.5. Obiekt Mediator

• mediatory nasłuchują zdarzeń, które są wysyłane przez interfejs użytkownika poprzez obiekty Event.

• najważniejsze w mediatorze są metody:– listNotificationInterests – zwrace listę zdarzeń

jakie nasłuchuje mediator– handleNotification – handler obsługujący

poszczególne zdarzenia

• tak jak proxy implementuje interfejs Inotifier

16/24

Page 17: Pure MVC - Mediovski

2.5. Obiekt Mediator 17/24

override public function listNotificationInterests():Array { return [ ApplicationFacade.VIEW_EMPLOYEE_LOGIN, ApplicationFacade.VIEW_EMPLOYEE_LIST,

ApplicationFacade.VIEW_EMPLOYEE_DETAIL,ApplicationFacade.APP_LOGOUT,ApplicationFacade.UPDATE_EMPLOYEE];

}

override public function handleNotification( note:INotification ):void { switch ( note.getName() ) { case ApplicationFacade.VIEW_EMPLOYEE_LOGIN: app.vwStack.selectedIndex = EMPLOYEE_LOGIN; break;

case ApplicationFacade.VIEW_EMPLOYEE_LIST: employeeProxy.employee = null; app.vwStack.selectedIndex = EMPLOYEE_LIST; break; } }

Page 18: Pure MVC - Mediovski

2.6. Notification

• Obiekty Proxy, Mediatory and Command komunikują się poprzez wysyłanie bądź odbieranie notyfikacji:

– proxy może nadawać lecz nie może nasłuchiwać

– mediator nasłuchuje i może nadawać

– command są wywoływane przez notyfikacje i mogą generować notyfikacje

18/24

Page 19: Pure MVC - Mediovski

3. MultiCore

Page 20: Pure MVC - Mediovski

3. Multicore

• aplikacja podzielona jest na moduły

• każdy moduł posiada własny obiekt fasady oraz wszystkie elementy MVC zaimplementowane w wersji podstawowej PureMVC

• moduły działają niezależnie od siebie

• w przypadku fasad w trybie multicore pobranie instancji fasady odbywa się poprzez pobranie instancji danej fasady z tablicy

20/24

Page 21: Pure MVC - Mediovski

3. Multicore 21/24

/** * Pobranie instancji Fasady danej aplikacji **/public static function getInstance( key:String ) : ApplicationFacade { if ( instanceMap[ key ] == null ) instanceMap[ key ] = new ApplicationFacade( key ); return instanceMap[ key ] as ApplicationFacade; }

/** * Start aplikacji * * @param app referencja do modułu w aplikacji */ public function startup( app:Module1 ):void { sendNotification( STARTUP, app ); }

Page 22: Pure MVC - Mediovski

4. Zastosowanie

Page 23: Pure MVC - Mediovski

4.1. Zalety i Wady

Zalety– Pozwala utrzymać zrozumiałą strukturę aplikacji

– Automatyzacja w pisaniu (wystarczy napisać poprawnie komunikacje między mediatorem, commandsem i proxy

– Sprawdzi się przy dużych i średnich projektach

Wady– Zbyt duża liczba plików potrzebna do wywołania jednej akcji

– Przy małych projektach za dużo zajmuję wykonanie każdej akcji

– Obsługa eventów w mediatorach za pomocą switch-case

– Kłopotliwe umiejscowienie stałych definiujących notyfikacje

23/24

Page 24: Pure MVC - Mediovski

• http://exploringetfs.com/

• http://www.mercedes-benz.de/

• http://radus.com/

• http://minitask.org/

4.2. Przykłady aplikacji 24/24

Page 25: Pure MVC - Mediovski

K o n t a k tul. Wita Stwosza 40,02-661 Warszawa

tel. 22 646 76 84fax 22 856 51 01

e-mail: [email protected]

www.mediovski.pl