Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pure MVC - Mediovski

3,796 views

Published on

Published in: Technology, Business
  • Be the first to comment

  • Be the first to like this

Pure MVC - Mediovski

  1. 1. Pure MVC w AS3 Tomasz Bińkowski [email_address] 29 stycznia 2010
  2. 2. Spis Treści <ul><li>Istota MVC </li></ul><ul><li>Opis PureMVC </li></ul><ul><ul><li>Struktura plików </li></ul></ul><ul><ul><li>Istota obiektu Facade </li></ul></ul><ul><ul><li>Obiekty klasy Command </li></ul></ul><ul><ul><li>Obiekty klasy Proxy </li></ul></ul><ul><ul><li>Obiekty klasy Mediator </li></ul></ul><ul><ul><li>Obiekty klasy Notification </li></ul></ul><ul><li>MultiCore </li></ul><ul><li>Zastosowanie </li></ul><ul><ul><li>Zalety i Wady </li></ul></ul><ul><ul><li>Przykłady aplikacji </li></ul></ul>/24
  3. 3. Istota MVC <ul><li>Model – opisuje logikę aplikacji odpowiada za pobieranie danych z bazy danych, nic nie wie o widoku </li></ul><ul><li>Widok – wyświetla dane przekazywane przez kontroler, nic nie wie o modelu </li></ul><ul><li>Kontroler – reaguje na żądania użytkownika i wywołuje odpowiednie modele i przekazuje dane z modeli do widoku </li></ul>/24
  4. 4. 2. Opis PureMVC
  5. 5. <ul><li>Pure MVC to „lekki” framework oparty na klasycznym wzorcu architektonicznym MVC. </li></ul><ul><li>każdy obiekt z wzorca MVC (Model, Widok i Kontroler) jest Singletonem. </li></ul><ul><li>wszystkie elementy MVC skupione są przez interfejs „Fasady”, który także jest Singletonem. </li></ul>2. Opis PureMVC /24
  6. 6. 2. Opis PureMVC /24 Komunikacja obiektów:
  7. 7. 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) /24
  8. 8. 2.2. Obiekt Fasady <ul><li>obiekt fasady stanowi centralne miejsce dostępu do publicznych metod. </li></ul><ul><li>inicjalizuje i przechowuje główne elementy MVC (Command). </li></ul><ul><li>dzięki fasadzie podstawowe obiekty Proxy, Mediator, Command mogą komunikować się między sobą w bardzo prosty sposób. </li></ul>/24
  9. 9. 2.2. Obiekt Fasady /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 ); }
  10. 10. 2.2. Obiekt Fasady <ul><li>Klasa fasady w swoim ciele zawiera listę statycznych zmiennych definiujących nazwy notyfikacji w systemie. </li></ul><ul><li>W przypadku dużego serwisu (nie korzystającego z multicore) takie umiejscowienie stałych może być bardzo kłopotliwe. </li></ul>/24
  11. 11. 2.2. Obiekt Fasady /24 /** * Obiekt Fasady **/ public class ApplicationFacade extends Facade { public static const STARTUP:String = &quot;startup&quot;; public static const SHUTDOWN:String = &quot;shutdown&quot;; public static const APP_LOGOUT:String = &quot;appLogout&quot;; public static const APP_LOGIN:String = &quot;appLogin&quot;; public static const VIEW_EMPLOYEE_LOGIN:String= &quot;viewEmployeeLogin&quot;; public static const VIEW_EMPLOYEE_LIST:String= &quot;viewEmployeeList&quot;; public static const ADD_EMPLOYEE:String= &quot;addEmployee&quot;; public static const UPDATE_EMPLOYEE:String= &quot;updateEmployee&quot;; public static const SAVE_EMPLOYEE:String= &quot;saveEmployee&quot;; public static const DELETE_EMPLOYEE:String= &quot;deleteEmployee&quot;; public
  12. 12. 2.3. Obiekt Command <ul><li>obiekt command zarejestrowany w fasadzie służy do komunikacji z mediatorami (modelami) </li></ul><ul><li>obiekty te ułatwiają organizację całego systemu. </li></ul><ul><li>najważniejszą częścią obiektu jest metoda „execute”, w której mogą być rejestrowane obiekty Proxy bądź Mediatory </li></ul>/24
  13. 13. 2.3. Obiekt Command /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 ); }
  14. 14. 2.4. Obiekt Proxy <ul><li>są to obiekty, które odpowiadają za całą logikę systemu. </li></ul><ul><li>najczęściej stosowane są do pobierania/zapisywania danych. </li></ul><ul><li>obiekt proxy implementuje interfejs Inotifier , dzięki któremu może wysyłać powiadomienia do systemu. </li></ul>/24
  15. 15. 2.4. Obiekt Proxy /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 = &quot;Could Not Load Employee List!&quot;; sendNotification( ApplicationFacade.LOAD_EMPLOYEES_FAILED ); }
  16. 16. 2.5. Obiekt Mediator <ul><li>mediatory nasłuchują zdarzeń, które są wysyłane przez interfejs użytkownika poprzez obiekty Event. </li></ul><ul><li>najważniejsze w mediatorze są metody: </li></ul><ul><ul><li>listNotificationInterests – zwrace listę zdarzeń jakie nasłuchuje mediator </li></ul></ul><ul><ul><li>handleNotification – handler obsługujący poszczególne zdarzenia </li></ul></ul><ul><li>tak jak proxy implementuje interfejs Inotifier </li></ul>/24
  17. 17. 2.5. Obiekt Mediator /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; } }
  18. 18. 2.6. Notification <ul><li>Obiekty Proxy, Mediatory and Command komunikują się poprzez wysyłanie bądź odbieranie notyfikacji: </li></ul><ul><ul><li>proxy może nadawać lecz nie może nasłuchiwać </li></ul></ul><ul><ul><li>mediator nasłuchuje i może nadawać </li></ul></ul><ul><ul><li>command są wywoływane przez notyfikacje i mogą generować notyfikacje </li></ul></ul>/24
  19. 19. 3. MultiCore
  20. 20. 3. Multicore <ul><li>aplikacja podzielona jest na moduły </li></ul><ul><li>każdy moduł posiada własny obiekt fasady oraz wszystkie elementy MVC zaimplementowane w wersji podstawowej PureMVC </li></ul><ul><li>moduły działają niezależnie od siebie </li></ul><ul><li>w przypadku fasad w trybie multicore pobranie instancji fasady odbywa się poprzez pobranie instancji danej fasady z tablicy </li></ul>/24
  21. 21. 3. Multicore /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 ); }
  22. 22. 4. Zastosowanie
  23. 23. 4.1. Zalety i Wady <ul><li>Zalety </li></ul><ul><ul><li>Pozwala utrzymać zrozumiałą strukturę aplikacji </li></ul></ul><ul><ul><li>Automatyzacja w pisaniu (wystarczy napisać poprawnie komunikacje między mediatorem, commandsem i proxy </li></ul></ul><ul><ul><li>Sprawdzi się przy dużych i średnich projektach </li></ul></ul><ul><li>Wady </li></ul><ul><ul><li>Zbyt duża liczba plików potrzebna do wywołania jednej akcji </li></ul></ul><ul><ul><li>Przy małych projektach za dużo zajmuję wykonanie każdej akcji </li></ul></ul><ul><ul><li>Obsługa eventów w mediatorach za pomocą switch-case </li></ul></ul><ul><ul><li>Kłopotliwe umiejscowienie stałych definiujących notyfikacje </li></ul></ul>/24
  24. 24. <ul><ul><li>http://exploringetfs.com/ </li></ul></ul><ul><ul><li>http://www.mercedes-benz.de/ </li></ul></ul><ul><ul><li>http://radus.com/ </li></ul></ul><ul><ul><li>http://minitask.org/ </li></ul></ul>4.2. Przykłady aplikacji /24
  25. 25. Kontakt ul. Wita Stwosza 40, 02-661 Warszawa tel. 22 646 76 84 fax 22 856 51 01 e-mail: info@mediovski.pl www.mediovski.pl

×