Jesse Warden’s großartiger Artikel “10 Tips Working With Cairngorm” gab mir die Idee, ebenfalls 10 Tips für PureMVC zu veröffentlichen. Ich arbeite seit über einem halben Jahr sehr intensiv mit PureMVC und – das ist kein Geheimnis – mir gefällt das Framework außerordentlich.

  1. Denke in (Pure)MVC

    Wie starte ich mit PureMVC? Kurze Antwort: Denke in (Pure)MVC! Denn wie der Name schon sagt, PureMVC basiert auf das klassische Model-View-Conroller Meta-Design-Pattern. Zwar werden die Core-Akteure nicht direkt instanziiert, sondern über das Facade-Pattern gehandelt, aber jedes Mitglied von PureMVC hat seine eigene und klar definiert Rolle innerhalb der drei Bereiche Model, View und Controller:
    - Proxies = Model
    - Mediatoren und ihre View Components = View
    - Commands = Controller

  2. Erstelle API’s für die View Components

    Eine View Component kann eine Standard UI Komponente (z.B. DataGrid) oder auch eine eigene Komponente (wie z.B. eine Welt in einem Spiel) oder irgendetwas anderes sein. Um ihren Status oder Verhalten zu ändern, rufe von einem Mediator nicht ihre “public” Methoden auf, sondern erstelle dafür eine eigene API.

    Denn einer der Vorteile von PureMVC ist es, neutral gegenüber den verwendeten Technologien zu sein. Ein Beispiel: Vor kurzem habe ich habe eine “reine” Flash-Applikation gebaut, welche nicht das Flex Framework nutzt. Nun soll diese Applikation als AIR Anwendung zum Einsatz kommen, um auch die geniale File system API von AIR zu nutzen. Dafür müssen zwar die vorhandenen View Components das Flex Framework nutzen und dementsprechend erweitert bzw. “getauscht” werden, allerdings nicht ihre Mediatoren oder irgendwelche anderen Akteure von PureMVC.

  3. Nutze einen Mediator für mehrere View Components

    Um mehrere View Components zu steuern, reicht oft ein Mediator aus. Mit anderen Worten: Nicht alle View Components brauchen einen eigenen Mediator.

    Zum Beispiel: Stelle Dir eine ApplicationControllBar vor, welche einen TextInput, einen Button und möglicherweise noch weitere Komponenten beinhaltet. Erstelle für alle diese Komponenten nur einen Mediator, genant “ApplicationControlBarMediator”, und referenziere und caste darin alle notwendigen Komponenten so, wie Du es mit der “Haupt”-View Component machen würdest.

  4. Lass’ Events bubbeln

    Was aber, wenn Du nicht mehrere View Components innerhalb eines Mediators referenzieren und dennoch auf User-Interaktionen reagieren möchtest? Dann erstelle eigene Events und lasse sie bis zur “Haupt”-View Component bubbeln, welche dann der Mediator abfängt.

    Zum Beispiel: Klickt der User einen Button, welcher sich innheralb der “Haupt”-View Component befindet, wird ein eigener Event abgefeuert. Auf diesen hört der Mediator, ohne jedoch irgendein Child innerhalb der “Haupt”-View Component kennen zu müssen.

  5. Kommuniziere über Notifications so oft wie möglich

    Notification sind die “Events” von PureMVC. Zur Kommunikation zwischen den drei Bereichen Model, View und Controller benutze Notification so oft wie möglich. Dazu gehören folgende Szenarien:
    (Kommunikation von -> zu)
    - Mediator -> Proxy (über gemappte Commands)
    - Proxy -> Mediator
    - Proxy -> Command
    - Command ->Mediator

    Auch wenn die Möglichkeit besteht, einen Proxy direkt von einem Mediator anzusprechen, ändere keinen Proxy von einem Mediator aus. Es ist eine schlechte Praktik den Status eines Proxy (Model) von einem Mediator (View) aus zu ändern, ohne einen Command (Controller) zu verwenden.

  6. Benutze Commands / MacroCommands so oft wie möglich

    Commands erledigen innerhalb von PureMVC den Job auf der Controller-Seite. Dazu zählen: Aufrufen und Interaktion mit Proxies, Kommunikation mit Mediators oder das Ausführen weiterer Commands.

    Auch wenn ein Command nur einmal benutzt wird oder auch nur zwei Zeilen Code beinhaltet, nutze ihn so oft wie möglich. Denn um diesen Command irgendwann oder irgendwo noch einmal in Deiner Applikation aufzurufen, reicht das Versenden einer einzigen Notification. Auch ist es in Zukunft leicht, den Command mit weiteren Aufgaben zu versehen. Und so – das ist besonders wichtig – weißt Du immer, wer den State der Proxies (Model) ändert.

    Frage: Musstest Du schon einmal mehrere Commands in einer bestimmten Reihenfolge ausführen? Dann nutze in PureMVC die MacroCommands, welche SubCommands (“normale” Commands) sequenziell ausführen.

  7. Nutze RemoteProxies zum Versenden und Empfangen von Daten

    Um Daten zwischen Client- und Server-Seite auszutauschen, nutze RemoteProxies. Diese basieren auf den “normalen” Proxies von PureMVC und organisieren die Serveraufrufe wie z.B. HTTPServices, RemoteObjects usw.

    Ein Beispiel: Um ein serverseitiges RemoteObject für den Login eines Users aufzurufen, erstelle ein (Remote-) Proxy genannt “LoginProxy”. Dieser “LoginProxy” führt den gesamten Job für das Versenden und Empfangen der Daten aus. Falls einmal die serverseitige Implementation für den Loginprozess geändert werden sollte, brauchst Du nur einen Ort Deiner Applikation anpassen – den “LoginProxy”.

  8. Entferne nicht benutzte Mediators

    In bestimmten Fällen werden Mediators und ihre View Components nicht mehr verwendet. Entferne dann den Mediator über facade.removeMediator(MyMediator.NAME); und verbinde diesen Vorgang mit einer selbst erstellten destroy(); Methode, um gleichzeitig die an den Mediator gekoppelten View Components mit all’ ihren Listeners, Timer, Referenzen usw. für eine erfolgreiche Garbage Collection zu entfernen.

  9. Die Kraft der VO’s (Value Objects)

    Es ist richtig, dass bei PureMVC der Ort zum Halten der Model Daten die Proxies sind. Und es ist ebenfalls richtig, dass die View Components nichts über die Facade und den Rest der PureMVC Applikation wissen brauchen. Das bedeutet allerdings, das keine View Component einen direkten Zugang zum Model hat.

    Um dieses Problem zu lösen, halte die Daten in VO’s und erstelle in den View Components eine Referenz zu diesen her. Mit Hilfe des genialen Data Binding Features in Flex können die View Components sehr leicht auf Änderungen im Model reagieren. Auch werden damit keine Regeln gebrochen, da die VO’s keine Hauptakteure von PureMVC sind und so bedenkenlos in View Components eingesetzt werden können.

  10. Studium-Unterlagen erhältlich

    Cliff Hall hat einen absolut genialen Job gemacht: Du findest nicht nur exzellente Dokumentationen wie “Framework Overview“, “Best Practices” oder “Conceptual Diagram“, sondern auch super hilfreiche Studium-Unterlagen zu PureMVC. Teste sie aus!

P.S.: Dieser Beitrag ist eine Übersetzung des englischen Artikels “10 tips for working with PureMVC” zu finden auf meinem WS-Blog. Fachbegriffe sind bewusst nicht mit übersetzt ;)

-Jens