Pure MVC - Mediovski

3,730 views

Published on

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,730
On SlideShare
0
From Embeds
0
Number of Embeds
1,491
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×