Vous êtes sur la page 1sur 50

Implmentation Idiomes et Meilleures Pratiques

Construire et Maintenir des Applications Clientes Robustes et volutives en utilisant PureMVC laide dexemples en Actionscript 3 et en MXML

Command

Command

Command

Command

View Components

Controller

Data Objects
Local or Remote

Mediator

Proxy

UI
Mediator

Obj

UI

Proxy

Obj

View
UI
Mediator

Model
Proxy

Obj

UI
Mediator Proxy

Obj

UI

Obj

Faade

Mediator

Command

Proxy

Any

Any

Any

TRADUIT PAR: Eric La Rocca <eric.la.rocca@puremvc.org>


MISE A JOUR: 4/15/2008

AUTEUR: Cliff Hall <cliffford.hall@puremvc.org>

Gnralits conceptuelles de PureMVC


Modle & proxys Vue & mdiateurs Contrleur & commandes Faade & acteurs centraux Observateurs & notifications Utiliser des notifications pour dclencher des commandes Les mdiateurs envoient, sabonnent et reoivent des notifications Les proxys envoient mais ne reoivent pas de notifications

4
4 4 5 5 5 6 6 6

Faade
Quest-ce quune faade concrte? Crer une faade concrte pour votre application Initialiser votre faade concrte

7
8 9 11

Notifications
vnements vs. notifications Dfinir un vnement et des constantes de notification

13
14 15

Commandes
Utilisation de commandes macros et de commandes simples Couplage faible des commandes aux mdiateurs et aux proxys Orchestration dactions complexes et logique mtier

16
17 18 19

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 2 de 50

4/15/2008 3:45 PM

Mdiateurs
Responsabilits dun mdiateur concret Transtyper implicitement un composant visuel couter et rpondre au composant visuel Grer des notifications dans un mdiateur concret Coupler des mdiateurs des proxys et dautres mdiateurs Interactions utilisateur entre composants visuels et mdiateurs

24
24 25 28 29 32 34

Proxys
Responsabilits dun proxy concret Transtyper implicitement un objet de donnes Empcher le couplage aux mdiateurs Encapsuler la logique domaine dans les proxys Interagir avec des proxys distants

38
39 40 42 42 44

Inspiration
PureMVC est un framework bas sur des patterns et motiv lorigine par le besoin de concevoir des clients RIA hautement performants. Il fait dsormais lobjet de portage vers dautres langages et plateformes incluant des environnements serveur. Ce document porte sur la partie client. Alors que linterprtation et les implmentations sont spcifiques chaque plateforme supporte par PureMVC, les patterns utiliss sont dfinis avec prcision dans linfameux ouvrage de la Bande des Quatre :

Design Patterns: Catalogue des modles de conception rutilisables (ISBN 2-711-78644-7)

Vivement recommand.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 3 de 50

4/15/2008 3:45 PM

Gnralits conceptuelles de PureMVC


Le framework PureMVC a un objectif prcis : vous aider sparer les parties de code de votre application en trois tiers bien distincts : le modle, la vue et le contrleur. Cette sparation en tiers, ainsi que le degr et le sens de couplage employ pour les faire collaborer est dune importance capitale pour construire et maintenir des applications volutives. Dans cette implmentation du classique mta pattern MVC, ces trois tiers sont gouverns par trois singletons (classes instance unique) appels Model, View et Controller. Ensemble, ces trois classes sont dnommes les acteurs centraux La classe Facade, un quatrime singleton, simplifie le dveloppement en fournissant une interface unique pour la communication avec les acteurs centraux. Modle & proxys Le modle cache les rfrences nommes des proxys. Le code dun proxy gre le modle de donnes; il communique si besoin est, avec des services distants afin de dtablir un accs persistant ou non avec des donnes. Ce qui contribue faire du modle un code portable. Vue & mdiateurs La vue cache les rfrences nommes des mdiateurs. Le mdiateur reprsente les composants visuels; en leur nom, il ajoute des couteurs, change des notifications avec le reste du systme et manipule directement leur tat. Cela distingue la dfinition de la vue de la logique qui la contrle.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 4 de 50

4/15/2008 3:45 PM

Gnralits conceptuelles de PureMVC


Contrleur & commandes Le contrleur maintient les mappings nomms aux classes de commande, qui, elles, sont sans tat et sont cres au besoin uniquement. Les commandes peuvent ventuellement accder ou interagir avec des proxys, envoyer des notifications, excuter dautres commandes et sont souvent utilises pour orchestrer des phases complexes ou dampleur comme le dmarrage ou la clture dune application. Elles abritent la logique mtier de votre application. Faade & acteurs centraux La faade, qui est un autre singleton, initialise les acteurs centraux (le modle, la vue, le contrleur), et fournit un endroit unique pour accder toutes leurs mthodes publiques. En tendant la faade, votre application profite de tous les avantages des acteurs centraux sans avoir les importer et les utiliser directement. Vous implmenterez facilement une faade concrte pour votre application, et ce, une seule et unique fois. Afin daccder et de communiquer entre eux, les proxys, les mdiateurs et les commandes peuvent alors utiliser la faade concrte de votre application. Observateurs & notifications Les applications PureMVC sont prvues pour fonctionner dans des environnements ne disposant pas des classes Event et EventDispatcher de Flash, le framework implmente donc un mcanisme de notification Observer afin de permettre une communication faiblement couple entre les acteurs centraux MVC et le reste du systme.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 5 de 50

4/15/2008 3:45 PM

Gnralits conceptuelles de PureMVC


Observateurs & notifications Il nest pas ncessaire de connatre les dtails de cette implmentation Observer/Notification; cest interne au framework. Pour envoyer une notification depuis des proxys, des mdiateurs, des commandes et depuis la faade, vous utiliserez une simple mthode qui ne requiert mme pas la cration dune instance de la classe Notification. Utiliser des notifications pour dclencher des commandes Dans votre faade concrte, les commandes sont mappes des noms de notifications, et elles sont automatiquement excutes par le contrleur lorsque les notifications correspondantes sont envoyes. Les commandes orchestrent habituellement des interactions complexes entre des parties de la vue et du modle tout en nen sachant le moins possible sur chacune. Les mdiateurs envoient, sabonnent et reoivent des notifications Lorsquils sont enregistrs auprs de la vue, les mdiateurs sont interrogs sur les notifications qui les intressent. A lappel de leur mthode listNotifications, ils doivent retourner un tableau avec les noms des notifications auxquelles ils sont abonns. Par la suite, lorsquune notification du mme nom est envoye par un acteur quelconque du systme, les mdiateurs intresss seront avertis (notifis) par lappel de leur mthode handleNotification qui lon passe une rfrence de la notification concerne. Les proxys envoient mais ne reoivent pas de notifications Les proxys peuvent envoyer des notifications pour diffrentes raisons, comme par exemple la rception de la rponse dun service distant ou bien la mise jour de donnes.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 6 de 50

4/15/2008 3:45 PM

Gnralits conceptuelles de PureMVC


Les proxys envoient mais ne reoivent pas de notifications Pour un proxy, tre lcoute de notifications implique un couplage trop troit avec les tiers vue et contrleur. Ces tiers tant en charge de reprsenter le modle de donnes et de permettre lutilisateur dinteragir avec, ils doivent donc obligatoirement couter les notifications provenant des proxys qui incarnent ce modle de donnes. Cependant, la vue et le contrleur devraient pouvoir varier sans affecter le modle de donnes. Par exemple, une application administratrice et une application utilisatrice pourraient partager les classes du mme modle. Si seuls les cas dutilisation diffrent, ils peuvent tre raliss via diffrents couples vue/contrleur dun mme modle.

Faade
Les trois acteurs centraux du mta pattern MVC sont reprsents en PureMVC par les classes Model, View et Controller. Pour simplifier le processus de dveloppement dapplications, PureMVC emploie le pattern faade. La faade relaie vos requtes aux classes Model, View et Controller, afin de vous dispenser dimporter ces classes dans votre code et de devoir les manipuler une une. La classe Facade instancie automatiquement dans son constructeur ces singletons qui composent le cur MVC. Habituellement, la faade sera sous-classe dans votre application et utilise pour initialiser le contrleur laide dun mapping de commandes. La prparation du modle et de la vue est alors orchestre par les commandes excutes par le contrleur.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 7 de 50

4/15/2008 3:45 PM

Faade
Quest ce quune faade concrte ? Bien que les acteurs centraux constituent une implmentation complte et utilisable, la faade fournit une implmentation qui devrait tre considre abstraite, c'est--dire jamais instancie directement. Sous-classez plutt la faade et ajoutez ou supplantez (override) certaines de ses mthodes afin de les rendre utilisables dans votre application. Cette faade concrte est alors utilise pour accder et notifier les commandes, les mdiateurs et les proxys qui constituent le systme. Par convention, on la nomme ApplicationFacade mais vous pouvez la nommer comme bon vous semble. Gnralement, la hirarchie des vues de votre application (composants visuels) sera cre conformment la plateforme que vous utilisez. En Flex, une application MXML instancie tous ses enfants ou une animation Flash cre tous ses objets sur la scne (Stage). Une fois cette hirarchie des vues construite, le mcanisme PureMVC est activ et les parties Modle et Vue sont prtes lemploi. Par ailleurs, en isolant le code applicatif de lenvironnement PureMVC associ, votre faade concrte contribue faciliter le processus de dmarrage. Lapplication se contente de passer sa propre rfrence la mthode startup du singleton quest votre Faade concrte.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 8 de 50

4/15/2008 3:45 PM

Faade
Crer une faade concrte pour votre application Votre Faade concrte na pas grand chose faire pour rendre votre application puissante. Voyez limplmentation suivante : ApplicationFacade.as:
package com.me.myapp { import org.puremvc.as3.interfaces.*; import org.puremvc.as3..patterns.facade.*; import com.me.myapp.view.*; import com.me.myapp.model.*; import com.me.myapp.controller.*; // Une faade concrte pour MyApp public class ApplicationFacade extends Faade implements IFacade { // Dfinition des constantes pour les noms des Notifications public static const STARTUP:String = "startup"; public static const LOGIN:String = "login"; // Mthode Factory du singleton ApplicationFacade public static function getInstance() : ApplicationFacade { if ( instance == null ) instance = new ApplicationFacade( ); return instance as ApplicationFacade; } // Enregistrer les Commandes auprs du Contrleur override protected function initializeController( ) : void { super.initializeController(); registerCommand( STARTUP, StartupCommand ); registerCommand( LOGIN, LoginCommand ); registerCommand( LoginProxy.LOGIN_SUCCESS, GetPrefsCommand ); } // Lance lenvironnement PureMVC, passage dune rfrence lapplication public function startup( app:MyApp ) : void { sendNotification( STARTUP, app ); } } }
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 9 de 50

4/15/2008 3:45 PM

Faade
Crer une faade concrte pour votre application Quelques points noter propos du code prcdent: o Il tend la classe Facade de PureMVC, qui, de son cot implmente linterface IFacade. o Il ne supplante pas le constructeur. Si ctait le cas, il appellerait avant toute chose le constructeur de la superclasse. o Il dfinit une mthode statique getInstance qui

retourne linstance du singleton. Au besoin, il la cre puis la cache. La rfrence de linstance est conserve dans une proprit de la superclasse (Facade) et doit tre transtype au type de la sous-classe avant dtre retourne. o Il dfinit des constantes pour les noms des notifications. Dans la mesure o la faade concrte est utilise par les autres lments pour communiquer, elle est la place idale pour dfinir ces constantes. o Il initialise le contrleur avec un ensemble de commandes qui seront excutes lors de lenvoi des notifications attendues. o Il fournit une mthode startup qui prend un argument (dans ce cas) de type myApp quil passe, via une notification, StartupCommand (enregistre avec la notification STARTUP)

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 10 de 50

4/15/2008 3:45 PM

Faade
Crer une faade concrte pour votre application Avec ces seules exigences dimplmentation, votre faade concrte va hriter de tout un ensemble de fonctionnalits de sa superclasse abstraite. Initialiser votre faade concrte Le constructeur de la faade de PureMVC appelle des mthodes protges afin dinitialiser les instances des classes Model, View et Controller puis les place en cache pour rfrence. Par composition, la faade implmente et expose alors les caractristiques de Model, View et Controller; agrgeant leurs fonctionnalits et vitant ainsi au dveloppeur toute interaction directe avec les acteurs centraux du framework. O et comment la faade intervient-elle dans lorganisation type dune application ? Voyez le code Application Flex suivant : MyApp.mxml:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="faade.startup(this)> <mx:Script> <![CDATA[ // Rcuprer lApplicationFacade import com.me.myapp.ApplicationFacade; private var facade:ApplicationFacade = ApplicationFacade.getInstance(); ]]> </mx:Script> <!Ici le reste de la hirarchie visuelle --> </mx:Application>

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 11 de 50

4/15/2008 3:45 PM

Faade
Initialiser votre faade concrte Cest tout ! Plutt facile. Construisez la hirarchie visuelle de base, rcuprez linstance de ApplicationFacade et invoquez sa mthode startup.
NOTE: Sous AIR, nous aurions utilis applicationComplete, et en Flash il nous aurait fallu instancier Facade puis faire lappel de startup sur le frame 1 ou dans un fichier de classe distinct.

Les points cls de cet exemple sont: o Nous construisons linterface MXML de faon classique; en commenant par le tag <mx:Application>, avec des composants et personnaliss. des conteneurs standards ou

o Un script dclare et initialise une variable prive avec linstance du singleton ApplicationFacade o Linitialisation de la variable par un appel la mthode statique ApplicationFacade.getInstance signifie quau dclenchement du creationComplete du bloc Application, la faade aura t cre et, avec elle, le modle, la vue et le contrleur; par contre, aucun mdiateur ni aucun proxy nest encore cr ce stade. o Dans le creationComplete du tag Application, nous invoquons la mthode startup, en passant une rfrence de lapplication. Notez quhabituellement les composants visuels nont nul besoin de connaitre ni dinteragir avec la faade, mais le bloc principal Application est lexception la rgle.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 12 de 50

4/15/2008 3:45 PM

Faade
Initialiser votre faade concrte Le bloc principal Application (ou lanimation Flash) construit la hirarchie visuelle, initialise la faade, puis active le mcanisme PureMVC.

Notifications
PureMVC implmente le pattern Observer afin que les acteurs principaux et leurs collaborateurs puissant communiquer de faon faiblement couple, et sans dpendance de plateforme. Le langage Actionscript ne fournit pas le modle dvnements utilis par Flex et Flash, ceux-l proviennent du package Flash. Ce framework a t port vers dautres plateformes telle que C# et J2ME, car il gre ses propres communications internes et non celles fournies par la plateforme Flash. Plus qu'un simple remplacement des vnements (Events), les notifications oprent de faon fondamentalement diffrente, et travaillent en synergie avec les vnements afin de produire des composants visuels qui soient facilement rutilisables et qui, lorsquils sont correctement construits, ignorent mme le systme PureMVC auquel ils sont coupls. vnements vs. notifications Les vnements sont dispatchs depuis des objets d'affichage Flash ceux-l proviennent qui implmentent l'interface IEventDispatcher. L'vnement est propag (bubbled up) travers la hirarchie d'affichage, permettant tous les objets ascendants (parents, grands-parents) la gestion de cet vnement.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 13 de 50

4/15/2008 3:45 PM

Notifications
vnements vs. notifications C'est un mcanisme de chane de responsabilit par lequel seuls ceux de la ligne parent/enfant ont la possibilit de recevoir ou d'agir sur un vnement moins quils disposent dune rfrence vers le dispatcheur et puissent directement lui assigner un couteur. Les notifications sont envoyes par la faade et les proxys; coutes et envoyes par les mdiateurs; mappes et envoyes par les commandes. C'est un mcanisme de publication/souscription par lequel plusieurs observateurs peuvent recevoir ou agir sur la mme notification. Chaque notification peut se voir dote dun contenu (body) optionnel, qui peut tre un quelconque objet Actionscript. Contrairement aux vnements de Flash, crer une notification personnalise est rarement ncessaire puisque celle-ci dispose par dfaut dun conteneur. Vous pouvez bien sr crer des notifications personnalises afin de renforcer le typage des interactions avec elles, mais choisir entre les bnfices limits de la vrification la compilation (particulirement pour les notifications) et la charge davoir maintenir plusieurs classes de notifications est une question de style de programmation. Les notifications ont aussi un type optionnel qui peut aider leurs destinataires les distinguer. Par exemple, dans une application ddition de documents. Il peut y avoir une instance de Proxy pour chaque document ouvert et un mdiateur pour le composant visuel utilis pour diter le document. Le proxy et le mdiateur pourraient partager une cl unique que le proxy passerait en tant que type dune notification.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 14 de 50

4/15/2008 3:45 PM

Notifications
vnements vs. notifications Toutes les instances de mdiateur enregistres pour les notifications de ce proxy seront notifies, mais utiliseront la proprit type pour dterminer quelle notification elles devront rpondre. Dfinir des notifications et des constantes dvnements Nous avons vu que la faade concrte est une bonne place pour dfinir les constantes de notifications communes. Constituant le mcanisme central de linteraction avec le systme, toutes les notifications collaboreront de fait avec la faade. Plutt quune faade concrte, une classe ApplicationConstants distinctes est parfois utilise afin de permettre lutilisation de ces constantes par une autre application. Une dfinition centralise de constantes pour les noms de notifications garantit quen cas de faute de frappe dans le nom dune notification, le compilateur signalera cette erreur alors quil resterait silencieux si lon utilisait une simple chaine de caractres. Par contre, ne dclarez pas le nom des vnements dans la faade concrte. Dfinissez statiquement les constantes de noms dvnements dans chacune des classes frontires qui les gnrent, ou dans les classes des vnements personnaliss qui sont dispatches.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 15 de 50

4/15/2008 3:45 PM

Notifications
Dfinir des notifications et des constantes dvnements Reprsentants les limites physiques de lapplication, les composants visuels et les objets de donnes peuvent demeurer rutilisables sils communiquent avec leur mdiateur ou proxy associs via un dispatching dvnements plutt que par des appels directs de mthodes ou lenvoi de notifications. Si un composant visuel ou un objet de donnes dispatche un vnement que le mdiateur ou le proxy associ coute, il est alors probable que seuls ces paires dlments (composant visuel/mdiateur ou objet de donns/proxy) soient intresses par cet vnement en particulier. Les autres communications entre un couteur et le reste du systme PureMVC devrait se faire via des notifications. Bien que les relations des ces paires de collaborations soient forcment troites, elles ont un couplage faible avec le reste de lapplication; offrant ainsi plus de maitrise lors dun ventuel ragencement (refactoring) de linterface utilisateur ou du modle de donnes.

Commandes
La faade concrte initialise habituellement le contrleur avec lensemble des mappings (Notification->Commande) ncessaires au dmarrage. Pour chaque mapping, le contrleur senregistre en tant quobservateur de la notification donne. Un fois notifi, le contrleur instancie la commande associe. Finalement, le contrleur appelle la mthode execute de cette commande en lui passant la notification.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 16 de 50

4/15/2008 3:45 PM

Commandes
Les commandes nont pas dtat; elles sont cres au besoin et doivent normalement disparaitre aprs leur excution. Pour cette raison, il est important de ne pas instancier ni de stocker des rfrences de commandes dans des objets persistants. Utilisation de commandes macros et de commandes simples Les commandes comme toute classe du framework PureMVC, implmentent une interface appele ICommand. PureMVC propose deux implmentations que vous pouvez facilement tendre. La classe SimpleCommand dispose juste dune mthode execute qui accepte une instance de INotification. Insrez votre code dans la mthode execute et cest tout. La classe MacroCommand vous permet dexcuter plusieurs souscommandes en squence, chacune tant cre et se voit passe la notification par rfrence. MacroCommand appelle sa mthode initializeMacroCommand

depuis son constructeur. Pour chaque commande ajouter, il vous suffit de supplanter (override) cette mthode dans vos sous-classes pour appeler la mthode addSubCommand. Vous pouvez crer nimporte quelle combinaison de commandes simples ou de commandes macros. Couplage faible des commandes aux mdiateurs et aux proxys Lexcution des commandes par le contrleur est un rsultat de lenvoi des notifications. Les commandes ne devraient tre instancies et excutes que par un contrleur.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 17 de 50

4/15/2008 3:45 PM

Commandes
Couplage faible des commandes aux mdiateurs et aux proxys Afin de communiquer et dinteragir avec le reste du systme, les commandes peuvent: o enregistrer, supprimer ou vrifier lenregistrement mdiateurs, de proxys et de commandes. de

o Envoyer des notifications destines dautres commandes ou dautres mdiateurs. o Rcuprer les proxys et les mdiateurs et les manipuler directement. Les commandes nous permettent deffectuer les changements dtat des lments visuels, ou dassurer le transport des donnes de part et dautre de la vue. Elles peuvent tre utilises pour faire des transactions avec le modle, ce qui engendre de multiples proxys et ncessite lenvoi de notifications lorsque la transaction est termine, ou pour grer des exceptions et traiter les incidents. Orchestration dactions complexes et logique mtier Avec la multiplication des endroits o placer le code (commandes, mdiateurs et proxys); les questions suivantes reviennent invitablement : O placer tel code? Que doit faire une commande exactement ? La premire distinction faire sur la logique de votre application est entre la logique mtier et la logique domaine

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 18 de 50

4/15/2008 3:45 PM

Commandes
Orchestration dactions complexes et logique mtier Les commandes abritent la logique mtier de notre application; limplmentation technique des cas dutilisation devrait composer le modle de domaine. Cela suppose une coordination entre le modle et la vue. Le modle maintient son intgrit travers lutilisation de proxys, qui eux abritent la logique domaine et exposent une API permettant la manipulation des objets de donnes. Ces proxys encapsulent tous les accs au modle de donnes que cela soit ct client ou ct serveur, ne laissant de pertinent lapplication que ce qui concerne la faon synchrone ou non daccder aux donnes. Les commandes peuvent tre utilises pour orchestrer des actions complexes qui doivent tre excutes selon un ordre spcifique, et dans certains cas, lorsque le rsultat dune action doit alimenter la suivante. Les mdiateurs et les proxys devraient exposer aux commandes (et entre eux) une interface rudimentaire, qui masque limplmentation des lments visuels ou des objets de donnes auxquels ils sont associs. Notez que lorsque nous parlons dun composant visuel, nous parlons dun bouton ou dun composant avec lequel lutilisateur interagit directement. Lorsque nous parlons dobjet de donnes cela inclut les diverses structures contenant des donnes ou bien les services distants que nous pouvons appeler pour obtenir ou stocker ces donnes. Les commandes interagissent avec les mdiateurs et les proxys, mais doivent tre isoles des implmentations frontires. tudiez les commandes ci-dessous utilises pour prparer le systme :
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 19 de 50

4/15/2008 3:45 PM

Commandes
Orchestration dactions complexes et logique mtier StartupCommand.as:
package com.me.myapp.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.command.*; import com.me.myapp.controller.*; // une commande macro excute lorsque lapplication dmarre. public class StartupCommand extends MacroCommand { // initialise la macro commande avec des sous-commandes. override protected function initializeMacroCommand() : void { addSubCommand( ModelPrepCommand ); addSubCommand( ViewPrepCommand ); } } }

Cest une macro commande qui ajoute deux sous commandes, lesquelles sont utilises selon un ordre de type FIFO (premire entre, premire sortie) lorsque MacroCommand est excut. Cela constitue une file dactions excuter au dmarrage. Mais que devrions-nous faire exactement, et dans quel ordre ? Avant que lutilisateur puisse interagir avec les donnes de lapplication, le modle doit tre plac dans un tat cohrent et connu. Ensuite, la vue peut tre prpare afin de prsenter ces donnes et permettre aux utilisateurs de les manipuler. Par consquent, le dmarrage consiste habituellement en deux tapes la prparation du modle, suivi par la prparation de la vue
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 20 de 50

4/15/2008 3:45 PM

Commandes
Orchestration dactions complexes et logique mtier ModelPrepCommand.as:
package com.me.myapp.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; import org.puremvc.as3.patterns.command.*; import com.me.myapp.*; import com.me.myapp.model.*; // Crer et enregistrer les Proxys avec le Modle. public class ModelPrepCommand extends SimpleCommand { // Appel par MacroCommand override public function execute( note : INotification ) : void { facade.registerProxy( new SearchProxy() ); facade.registerProxy( new PrefsProxy() ); facade.registerProxy( new UsersProxy() ); } } }

Prparer le modle se rsume simplement crer et enregistrer tous les proxys requis par le systme au dmarrage. ModelPrepCommand ci-dessus est une SimpleCommand qui prpare le modle. Cest la premire sous-commande de la commande macro (startupCommand), elle est donc excute en premier. travers la faade concrte, on cre et enregistre les diffrentes classes Proxy que le systme utilisera au dmarrage. Notez que la commande ne ralise aucune manipulation ou initialisation du modle de donnes. Le proxy est responsable de la rcupration, de la cration ou de linitialisation des donnes ncessaires pour la prparation de son objet de donne associ.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 21 de 50

4/15/2008 3:45 PM

Commandes
Orchestration dactions complexes et logique mtier ViewPrepCommand.as:
package com.me.myapp.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.observer.*; import org.puremvc.as3.patterns.command.*; import com.me.myapp.*; import com.me.myapp.view.*; // Cre et enregistre les mdiateurs avec la vue. public class ViewPrepCommand extends SimpleCommand { override public function execute( note : INotification ) : void { var app:MyApp = note.getBody() as MyApp; facade.registerMediator( new ApplicationMediator( app ) ); } } }

Cest une commande simple (SimpleCommand) qui prpare la vue. Cest la dernire des sous-commandes de la macro commande (MacroCommand) et comme telle, elle est excute en dernier. Remarquez que le seul mdiateur cre et enregistr est ApplicationMediator, qui rgit le composant visuel Application. Ensuite, il passe le corps de la notification au constructeur du mdiateur. Il sagit dune rfrence lobjet Application transmis par Application lui-mme lorsque la notification STARTUP a t envoye (voir lexemple myApp prcdent) Application est un composant visuel particulier dans la mesure o il instancie et a pour enfants tous les autres composants visuels qui sont initialiss au dmarrage.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 22 de 50

4/15/2008 3:45 PM

Commandes
Orchestration dactions complexes et logique mtier Pour communiquer avec le reste du systme, les composants visuels ont besoin de mdiateurs. Et crer ces mdiateurs ncessite une rfrence vers le composant visuel quils vont reprsenter, et que seul le bloc Application connat ce stade. Le mdiateur de Application est la seule classe qui sait tout de limplmentation de Application, ceci afin de crer, au sein mme de son constructeur, tous les autres mdiateurs. En fait, avec les trois commandes ci-dessus, nous avons orchestre une initialisation ordonne du modle et de la vue. Ainsi, les commandes nont savent pas trop sur le modle et la vue. Lorsque des lments du modle ou de limplmentation de la vue changent, les proxys et les mdiateurs peuvent tre r-agencs volont. Un ragencement des frontires de lapplication ne devrait pas impacter la logique mtier des commandes. Le modle devrait encapsuler la logique du domaine, assurant ainsi lintgrit des donnes dans les proxys. Les commandes constituent le transactionnel ou la logique affaire du modle, encapsulant la coordination des transactions multiproxys ou en grant et en rapportant les exceptions dune faon conforme ce quattend lapplication.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 23 de 50

4/15/2008 3:45 PM

Mdiateurs
Un mdiateur est une classe utilise pour mettre en relation les interactions de lutilisateur sur un ou plusieurs composants visuels de lapplication (par exemple, une grille Flex ou une animation Flash) avec le reste de lapplication PureMVC. Dans une application Flash, un mdiateur place habituellement des couteurs dvnements dans son composant visuel afin de grer les actions de lutilisateur et les requtes de ce composant. Il envoie et reoit des notifications pour communiquer avec le reste de lapplication. Responsabilits dun mdiateur concret Les environnements Flash, Flex et AIR fournissent une vaste gamme de composants visuels trs interactifs. Vous pouvez les tendre ou crire le vtre en Actionscript afin de prsenter le modle de donnes de multiples faons et de permettre aux utilisateurs dinteragir avec. Dans un futur pas si lointain, dautres plateformes seront capables dexcuter de lActionscript. Et le framework a t port et prsent sur dautres plateformes comme Silverlight ou J2ME, largissant les horizons du dveloppement de RIA avec cette technologie. Un objectif du framework PureMVC est dtre Indpendant des technologies utilises aux frontires de lapplication et de fournir un langage simple pour adapter le composant dinterface utilisateur ou la structure/service du moment.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 24 de 50

4/15/2008 3:45 PM

Mdiateurs
Responsabilits dun mdiateur concret Pour une application PureMVC, un composant visuel reprsente nimporte quel composant dinterface utilisateur, indpendamment du framework dorigine, et du nombre de sous-composants quil contient. Un composant visuel devrait encapsuler autant dtat et doprations que possible, nexposant quune simple API dvnements, de mthodes et de proprits. Un mdiateur concret nous aide a adapter un ou plusieurs composants visuels lapplication en dtenant les seules rfrences ces composants et en interagissant avec lAPI quils exposent. Les responsabilits du mdiateur sont principalement la gestion des vnements envoys par le composant visuel et des notifications pertinentes mises par le reste du systme. Dans la mesure o les mdiateurs aussi interagissent souvent avec les proxys, il est frquent pour un mdiateur de rcuprer et de conserver dans son constructeur une rfrence locale des proxys les plus souvent utiliss. Cela rduit les appels rpts retrieveProxy pour obtenir la mme rfrence. Transtyper implicitement un composant visuel Limplmentation de base fournie avec PureMVC pour le mdiateur accepte un nom et un Objet gnrique comme seuls arguments du constructeur. Le constructeur de votre mdiateur concret passera son composant visuel la superclasse qui deviendra immdiatement accessible en tant que proprit protge nomme viewComponent et type gnriquement en Objet.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 25 de 50

4/15/2008 3:45 PM

Mdiateurs
Transtyper implicitement un composant visuel Vous pourriez aussi dfinir dynamiquement le composant visuel du mdiateur aprs sa construction, en appelant sa mthode setViewComponent Quelque soit la manire avec laquelle il a t dfini, vous devrez frquemment transtyper cet Objet en son type actuel, afin de pouvoir accder son API, ce qui peut devenir lourd et rptitif. Le langage Actionscript dispose daccesseurs implicites. Un getter implicite ressemble une mthode, mais apparait comme une proprit au reste de la classe et de lapplication. Cest trs utile pour rgler les frquents problmes de transtypage. Une recette pratique pour votre mdiateur concret est dutiliser un getter implicite qui transtype un composant visuel en son type actuel et de lui donner un nom significatif. En crant une mthode comme celle-ci :
protected function get controlBar() : MyAppControlBar { return viewComponent as MyAppControlBar; }

Puis, quelque part dans votre mdiateur, plutt que de faire:


MyAppControlBar ( viewComponent ).searchSelection = MyAppControlBar.NONE_SELECTED;

Nous pouvons plutt faire cela:


controlBar.searchSelection = MyAppControlBar.NONE_SELECTED;

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 26 de 50

4/15/2008 3:45 PM

Mdiateurs
couter et rpondre au composant visuel Un mdiateur est habituellement en charge dun seul composant visuel, mais il pourrait en grer plusieurs, comme ApplicationToolBar et ses boutons ou ses contrles intgrs. Nous pouvons placer un ensemble de contrles (tel un formulaire) dans un composant visuel puis les exposer au mdiateur sous la forme de proprits de ce composant. Mais le mieux serait dencapsuler autant que possible limplmentation du composant et dexposer les proprits du composant via un objet de type personnalis. Le mdiateur va grer les changes entre le tiers contrleur et le tiers modle, actualisant le composant visuel la rception des notifications attendues. Dans Flash, la construction du mdiateur ou lappel de sa mthode setViewComponent, nous plaons habituellement des couteurs dvnements dans le composant visuel en utilisant la mthode:
controlBar.addEventListener( AppControlBar.BEGIN_SEARCH, onBeginSearch );

La nature de la raction du mdiateur en rponse cet vnement, est bien sr, totalement dfinie par les exigences du moment. En rponse un vnement, un mdiateur gnralement certaines des actions suivantes : concret ralise

o Vrifier, si ncessaire, le type ou le contenu de lvnement.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 27 de 50

4/15/2008 3:45 PM

Mdiateurs
couter et rpondre au composant visuel o Vrifier ou modifier les proprits (ou les mthodes) exposes dun composant visuel. o Vrifier ou modifier les proprits (ou les mthodes) exposes dun proxy. o mettre une ou plusieurs notifications qui seront traites par dautres mdiateurs ou des commandes (voire par la mme instance de mdiateur metteur). Quelques rgles empiriques: o Si dautres mdiateurs doivent tre impacts lors de la rponse un vnement, mettez alors jour un proxy commun ou envoyez une notification qui sera traite de faon approprie par chacun de ces mdiateurs. o Si les interactions entre les mdiateurs sont nombreuses, une bonne faon est de recourir une commande afin de coder les diffrentes tapes a raliser en un mme endroit. o vitez de rcuprer et de travailler directement sur les autres mdiateurs ou de faire un mdiateur qui le permette.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 28 de 50

4/15/2008 3:45 PM

Mdiateurs
couter et rpondre au composant visuel o Pour manipuler et diffuser aux mdiateurs les informations concernant ltat de lapplication, dfinissez des valeurs ou appelez des mthodes dans des proxys spcialement crs pour conserver cet tat et permettez aux mdiateurs dcouter les notifications mises par ces proxys. Grer des notifications dans un mdiateur concret Contrairement lajout dcouteurs dans les composants visuels, la technique de couplage du mdiateur au systme PureMVC est simple et automatique. lenregistrement de la vue, le mdiateur est interrog sur lintrt quil porte aux notifications. Il rpond en fournissant un tableau contenant le nom de toutes les notifications auxquelles il est abonn. La faon la plus simple de rpondre est laide dune expression unique qui cre et retourne un tableau anonyme contenant les noms de notifications. Ces noms devraient tre des constantes statiques, habituellement dfinies dans la faade concrte. Dfinir une liste dabonnement aux notifications dun mdiateur est facile:
override public function listNotificationInterests() : Array { return [ ApplicationFacade.SEARCH_FAILED, ApplicationFacade.SEARCH_SUCCESS ]; }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 29 de 50

4/15/2008 3:45 PM

Mdiateurs
Grer des notifications dans un mdiateur concret Lorsquune des notifications liste est mise par un quelconque acteur du systme (incluant le mdiateur lui-mme), la mthode handleNotification du mdiateur sera appele et la notification passe en argument. De par sa lisibilit et la facilit avec laquelle on peut mettre jour la gestion des notifications dans la mthode handleNotification, la structure switch/case est prfrable la structure if/else if. Essentiellement, la rponse une notification devrait se limiter peu de code, et toute linformation requise devrait se trouver dans la notification elle-mme. Occasionnellement, certaines donnes peuvent provenir dun proxy bas sur linformation fournie par la notification mais globalement la logique de traitement dune notification doit rester simple. Si a nest pas le cas, cela indique que vous essayez de placer la logique mtier relevant dune commande dans le gestionnaire de notification de votre mdiateur.
override public function handleNotification( note : INotification ) : void { switch ( note.getName() ) { case ApplicationFacade.SEARCH_FAILED: controlBar.status = AppControlBar.STATUS_FAILED; controlBar.searchText.setFocus(); break; case ApplicationFacade.SEARCH_SUCCESS: controlBar.status = AppControlBar.STATUS_SUCCESS; break; } }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 30 de 50

4/15/2008 3:45 PM

Mdiateurs
Grer des notifications dans un mdiateur concret En outre, le gestionnaire de notification dun mdiateur ne doit pas grer plus de 4 ou 5 notifications. Dans le cas contraire, cela indique que les responsabilits du mdiateur devraient tre divises plus finement. Crez des mdiateurs pour les sous-composants du composant visuel plutt que de tenter de tous les grer dans un mdiateur monolithique. Lutilisation dune mthode de notification unique et prdfinie constitue la diffrence fondamentale entre la faon qua un mdiateur dcouter des vnements et celle quil a dcouter des notifications. Dans le cas des vnements, nous avons un certain nombre de mthodes gestionnaires; habituellement une pour chaque vnement que le mdiateur doit grer. Gnralement ces mthodes se contentent denvoyer des notifications et ne devraient ni tre complexes, ni grer dans le dtail le composant visuel. Ce dernier devrait encapsuler les dtails dimplmentation, en exposant une API sommaire au mdiateur. Dans le cas des notifications, nous avons un gestionnaire unique dans lequel nous grons toutes les notifications qui intressent le mdiateur. Le mieux est de placer dans la mthode handleNotification la totalit du code rpondant aux notifications. Chaque notification tant sparment traite laide dun case dans une structure switch.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 31 de 50

4/15/2008 3:45 PM

Mdiateurs
Grer des notifications dans un mdiateur concret Il y a eu beaucoup de discussion autour de lusage dun switch/case dans la mesure o de nombreux dveloppeurs considrent cette approche comme limite puisque tous ces case sexcutent dans la mme mthode et ont donc la mme porte. Nanmoins, cette approche a t spcifiquement choisie afin de limiter lusage dun mdiateur; elle demeure donc lapproche recommande. Le mdiateur est destin permettre la communication entre llment visuel et le reste du systme. Considrons le rle dun interprte assurant une conversation entre son ambassadeur et le reste des membres lors dune confrence lONU. Ses taches devraient se limiter faire des traductions, faire suivre des messages et occasionnellement trouver une mtaphore approprie ou une information particulire. Cest la mme chose pour le rle du mdiateur dans PureMVC. Coupler des mdiateurs des proxys et dautres mdiateurs Dans la mesure o la vue est ultimement charge de reprsenter le modle de donnes de faon graphique et interactive, nous pouvons supposer un couplage unidirectionnel et relativement fort avec les proxys de lapplication. La vue doit connatre le modle, mais le modle na rien savoir de la vue. Les mdiateurs peuvent librement accder aux proxys du modle, lire et manipuler les objets de donnes via une quelconque API expose par le proxy. Cependant, dplacer ce traitement dans une commande rduira le couplage entre la vue et le modle.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 32 de 50

4/15/2008 3:45 PM

Mdiateurs
Coupler des mdiateurs des proxys et dautres mdiateurs De la mme manire, les mdiateurs pourraient rcuprer depuis la vue, des rfrences dautres mdiateurs, les lire et les manipuler de toutes les faons exposes par le mdiateur rcupr. Nanmoins cela nest pas une pratique recommande dans la mesure o cela cre des dpendances entre diffrentes parties de la vue, nuisant ainsi la capacit de r-agencer une partie de la vue sans en affecter une autre. Un mdiateur qui souhaite communiquer avec une autre partie de la vue devrait envoyer une notification plutt que de rcuprer et de manipuler directement un autre mdiateur. Les mdiateurs ne devraient pas exposer des mthodes permettant des tiers de manipuler leur(s) composant(s) visuel(s); ils devraient plutt le faire eux-mmes en rponse des notifications. Si lessentiel des manipulations internes dun composant visuel est effectu dans un mdiateur (en rponse un vnement ou une notification), r-agencez (refactor) ce traitement en une mthode interne au composant, cela aura pour effet dencapsuler autant que possible ses implmentations et daugmenter ainsi sa capacit tre rutilis. Si lessentiel des manipulations des proxys ou de leurs donnes est effectu dans un mdiateur, r-agencez le tout en une commande, cela aura pour effet dallger le mdiateur, de dplacer la logique mtier vers des commandes alors rutilisables par dautres parties de la vue, et finalement cela diminuera le couplage entre la vue et le modle.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 33 de 50

4/15/2008 3:45 PM

Mdiateurs
Interactions utilisateur entre composants visuels et mdiateurs Considrons un composant LoginPanel comportant un formulaire. Nous avons un LoginPanelMediator qui reoit de lutilisateur via le LoginPanel, une identification (identifiant + mot de passe) et une demande de login et qui, en rponse, initie une demande de connexion. La collaboration entre le composant LoginPanel et le

LoginPanelMediator consiste en lenvoi par le composant dun vnement TRY_LOGIN lorsque lutilisateur sidentifie et souhaite se connecter. Le LoginPanelMediator ragit lvnement par lenvoi dune notification avec pour contenu le value objet LoginVO complt par le composant. LoginPanel.mxml:
<?xml version="1.0" encoding="utf-8"?> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" title="Login" status={loginStatus}> <!Les vnements que ce composant diffuse. Nous ne pouvons malheureusement pas utiliser de constantes ici, car Metadata est une directive du compilateur --> <mx:MetaData> [Event('tryLogin')]; </mx:MetaData> <mx:Script> <![CDATA[ import com.me.myapp.model.vo.LoginVO; // Les champs de ce formulaire sont bi directionnellement //relis aux proprits de lobjet [Bindable] public var loginVO:LoginVO = new LoginVO(); [Bindable] public var loginStatus:String = NOT_LOGGED_IN; //Dfinir une constante dans le composant visuel pour les //noms dvnements public static const TRY_LOGIN:String='tryLogin'; public static const LOGGED_IN:String='Logged In'; public static const NOT_LOGGED_IN:String='Enter Credentials'; ]]> </mx:Script>
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 34 de 50

4/15/2008 3:45 PM

Mdiateurs
Interactions utilisateur entre composants visuels et mdiateurs
<mx:Binding source="username.text" destination="loginVO.username"/> <mx:Binding source="password.text" destination="loginVO.password"/> <!Le formulaire de Login--> <mx:Form id="loginForm" > <mx:FormItem label="Username:"> <mx:TextInput id="username" text="{loginVO.username}" /> </mx:FormItem> <mx:FormItem label="Password:"> <mx:TextInput id="password" text="{loginVO.password}" displayAsPassword="true" /> </mx:FormItem> <mx:FormItem > <mx:Button label="Login" enabled="{loginStatus == NOT_LOGGED_IN} click="dispatchEvent( new Event(TRY_LOGIN, true ));"/> </mx:FormItem> </mx:Form> </mx:Panel>

Le composant visuel LoginPanel complte un nouveau LoginVO avec les entres du formulaire puis diffuse un vnement lorsque le bouton Login est cliqu. LoginPanelMediator le rcupre alors. Cela cantonne le composant visuel au simple rle de collecteur de donnes alertant le systme lorsque celles-ci sont prtes. Un composant plus abouti pourrait, par exemple, activer le bouton login uniquement lorsque lidentifiant et le mot de passe ont tout deux t saisis, empchant ainsi toute tentative incomplte de connexion. Le composant visuel masque son implmentation interne, la totalit de son API utilise par le mdiateur se rsumant en un vnement TRY_LOGIN, une proprit de LoginVO vrifier et la proprit status du composant Panel

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 35 de 50

4/15/2008 3:45 PM

Mdiateurs
Interactions utilisateur entre composants visuels et mdiateurs Le LoginPanelMediator va aussi rpondre aux notifications

LOGIN_FAILED et LOGIN_SUCCESS puis va ajuster le statut de LoginPanel. LoginPanelMediator.as:


package com.me.myapp.view { import flash.events.Event; import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.mediator.Mediator; import com.me.myapp.model.LoginProxy; import com.me.myapp.model.vo.LoginVO; import com.me.myapp.ApplicationFacade; import com.me.myapp.view.components.LoginPanel; // Un mdiateur pour interagir avec le composant LoginPanel. public class LoginPanelMediator extends Mediator implements IMediator { public static const NAME:String = 'LoginPanelMediator'; public function LoginPanelMediator( viewComponent:LoginPanel ) { super( NAME, viewComponent ); LoginPanel.addEventListener( LoginPanel.TRY_LOGIN, onTryLogin ); } // Liste les notifications attendues override public function listNotificationInterests( ) : Array { return [ LoginProxy.LOGIN_FAILED, LoginProxy.LOGIN_SUCCESS ]; } // Gre les notifications override public function handleNotification( note:INotification ):void { switch ( note.getName() ) { case LoginProxy.LOGIN_FAILED: LoginPanel.loginVO = new LoginVO( ); loginPanel.loginStatus = LoginPanel.NOT_LOGGED_IN; break;

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 36 de 50

4/15/2008 3:45 PM

Mdiateurs
Interactions utilisateur entre composants visuels et mdiateurs
case LoginProxy.LOGIN_SUCCESS: loginPanel.loginStatus = LoginPanel.LOGGED_IN; break; } } // L utlisateur a cliqu le bouton Login: tentative de login private function onTryLogin ( event:Event ) : void { sendNotification( ApplicationFacade.LOGIN, loginPanel.loginVO ); } // Transtypage du viewComponent en son type actuel protected function get loginPanel() : LoginPanel { return viewComponent as LoginPanel; } } }

Notez que LoginPanelMediator place un couteur dvnement dans Login. Dans la mthode onTryLogin, la notification LOGIN est nvoye, et avec elle, LoginVO qui contient les informations concernant lutilisateur. Plus tt dans la faade de lapplication, nous avions associ la commande LoginCommand la notification LOGIN laide dune commande registerCommand. La mthode execute de cette commande va alors invoquer la mthode login de LoginProxy en passant lobjet LoginVO. LoginProxy tentera alors une connexion via un service distant puis enverra une notification LOGIN_SUCCESS ou LOGIN_FAILED. Ces classes sont dfinies plus loin la fin de la section sur les proxys.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

le

constructeur

de

LoginPanel

afin

que

la

mthode

onTryLogin soit invoque lorsque lutilisateur clique sur le bouton

Page 37 de 50

4/15/2008 3:45 PM

Mdiateurs
Interactions utilisateur entre composants visuels et mdiateurs La mthode listNotificationInterests est abonn deux indique que

loginPanelMediator

notifications:

LOGIN_SUCCESS et LOGIN_FAILED, Une fois notifi, il fixera la variable loginStatus de LoginPanel LOGGED_IN en cas de succs ou effacera lobjet LoginVO et fixera loginStatus NOT_LOGGED_IN dans le cas dun chec.

Proxys
En gnral, le pattern proxy consiste fournir un substitut un objet afin de contrler laccs celui-ci. Dans une application base sur PureMVC, la classe Proxy est utilise spcifiquement pour grer une partie du modle de donnes de lapplication. Habituellement, un proxy accde une structure de donnes cre localement et dune complexit arbitraire. Cest lobjet de donne (DO) du Proxy. Dans ce cas, les moyens pour interagir avec cet objet impliquent probablement des accesseurs synchrones aux donnes. On peut exposer tout ou partie des proprits et mthodes de lobjet de donnes ou une rfrence celui-ci. En plus dexposer des mthodes pour actualiser les donnes, il est aussi possible denvoyer au reste du systme, des notifications signalant la modification de ces donnes. Un proxy distant pourrait tre utilis pour encapsuler linteraction avec un service distant en charge de sauvegarder ou de rcuprer un bloc de donnes. Le proxy peut conserver lobjet communiquant avec le service distant et contrler laccs aux donnes changes avec ce service.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 38 de 50

4/15/2008 3:45 PM

Proxys
Dans un tel cas, on doit pouvoir dfinir une donne ou appeler une mthode du proxy puis attendre une notification asynchrone mise par le proxy lorsque le service reoit la donne. Responsabilits dun proxy concret Le proxy concret nous permet dencapsuler une partie du modle de donnes, do quelle vienne et quel que soit son type, en grant un objet de donnes ainsi que son accs par lapplication. Limplmentation de Proxy fournie avec PureMVC est un simple objet conteneur de donnes qui peut tre enregistr avec le modle. Bien quelle soit parfaitement utilisable sous cette forme, vous sous-classerez plutt la classe Proxy et ajouterez ensuite les fonctionnalits spcifiques un proxy particulier. Les variations habituelles du pattern Proxy sont : o Proxy distant, dans lequel les donnes gres par le proxy concret se trouvent distance et sont manipuls via un service quelconque. o Proxy et dlgu, ou laccs un objet service doit tre partag entre diffrents proxys. La classe Delegate maintient lobjet service, contrle son accs et sassure ainsi que les rponses sont achemines aux bons requrants. o Proxy de protection, utilis lorsque les objets doivent avoir diffrents droits daccs.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 39 de 50

4/15/2008 3:45 PM

Proxys
Responsabilits dun proxy concret o Proxy virtuel, qui cre la demande des objets volumineux ou complexes. o Proxy intelligent, qui charge lobjet de donnes en mmoire lors de laccs initial, gre un compteur de rfrences et permet son verrouillage afin de prvenir toute modification par un autre objet. Transtyper implicitement un objet de donnes Limplmentation de base du Proxy fournie avec PureMVC accepte comme arguments du constructeur un nom et un objet gnrique Vous pouvez dynamiquement dfinir lobjet de donnes du proxy aprs sa construction via la mthode setData. Comme pour le mdiateur et son composant visuel, vous devrez frquemment transtyper cet Objet en son type actuel, afin de pouvoir accder aux mthodes et proprits quil expose; cest lourd et rptitif et risque de mener des constructions exposant inutilement limplmentation de lobjet de donnes. Aussi, comme lobjet de donnes est une structure souvent complexe, nous avons besoin de rfrences nommes pour les diffrentes parties de la structure ainsi quune rfrence pointant sur la structure elle-mme. A nouveau, les accesseurs implicites dActionscript se rvlent trs pratiques pour viter les frquents transtypage et les problmes insouponns dimplmentation.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 40 de 50

4/15/2008 3:45 PM

Proxys
Transtyper implicitement un objet de donnes Dans votre proxy concret, utilisez un getter implicite qui transtype lobjet de donnes en son type courant et donnez-lui un nom significatif. Par ailleurs, il est possible de dfinir plusieurs getters de types diffrents pour rcuprer des parties spcifiques de lobjet de donnes. Par exemple:
public function get searchResultAC () : ArrayCollection { return data as ArrayCollection; } public function getResultEntry( index:int ) : SearchResultVO { return searchResultAC.getItemAt( index ) as SearchResultVO; }

Dans le mdiateur, plutt que:


var item:SearchResultVO = ArrayCollection ( searchProxy.getData() ).lastResult.getItemAt( 1 ) as SearchResultVO;

Nous pouvons crire:


var item:SearchResultVO = searchProxy.resultEntry( 1 );

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 41 de 50

4/15/2008 3:45 PM

Proxys
Empcher le couplage aux mdiateurs Contrairement au mdiateur, le proxy ntant pas concern par ltat de la vue, il nest jamais interrog sur les notifications qui lintresse et nest jamais averti (notifi) de lenvoi dune dentreelles. Le proxy expose plutt des mthodes et des proprits destines tre utilises par les autres acteurs. Le proxy concret ne devrait pas utiliser les mdiateurs pour informer le systme des changements de lobjet de donnes. la place, il devrait envoyer des notifications qui seront traites par les commandes ou les mdiateurs. La faon dont le systme est affect par ces notifications ne devrait pas avoir de consquence sur le proxy. En gardant le modle indpendant des implmentations du systme, la vue et le contrleur peuvent tre r-agencs sans affecter le modle. Linverse nest pas totalement vrai. Le modle peut difficilement changer sans affecter la vue, ni le contrleur ventuellement. Aprs tout, ces tiers nexistent que pour permettre lutilisateur dinteragir avec le modle. Encapsuler la logique domaine dans les proxys Un changement dans le modle impliquera souvent un ragencement des parties vue/contrleur. En nous assurant de placer dans les proxys le maximum de la logique domaine, nous augmentons le degr de sparation entre le modle dune part et les intrts combins de la vue et du contrleur dautre part.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 42 de 50

4/15/2008 3:45 PM

Proxys
Encapsuler la logique domaine dans les proxys Le proxy peut tre utilis non seulement pour contrler laccs aux donnes mais aussi pour les traiter afin de les garder dans un tat valide. Par exemple, le calcul dune taxe de vente est une fonction de la logique domaine et devrait donc se trouver dans un proxy, et non dans un mdiateur ni dans une commande. Bien que cette fonction puisse se trouver dans nimporte lequel de ces tiers, le choix du proxy nest pas seulement logique mais permet un ragencement plus lger et plus facile des autres tiers. Un mdiateur peut rcuprer le proxy; appeler sa fonction de calcul de taxe, lui passer ventuellement les lments dun formulaire. Mais placer ce traitement dans le mdiateur quivaudrait placer la logique domaine dans la vue. Ce calcul est une rgle du modle de domaine et la vue ne le voit que comme une proprit du modle de domaine, disponible lorsque les valeurs dentres sont fournies. Imaginez que vous travaillez sur une RIA prvue pour fonctionner dans le navigateur internet dun ordinateur de bureau. Une nouvelle version, pour PDA cette fois, doit tre dveloppe avec un jeu de fonctionnalits rduit, mais avec lintgralit des exigences du modle de lapplication actuelle. Avec une sparation adquate des responsabilits, nous devrions pouvoir rutiliser le modle dans sa totalit et lui adjoindre uniquement une nouvelle vue et un nouveau contrleur.

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 43 de 50

4/15/2008 3:45 PM

Proxys
Encapsuler la logique domaine dans les proxys Placer la fonction de calcul dans le mdiateur peut sembler efficace ou facile lors de limplmentation ; vous avez simplement pris les donnes depuis un formulaire pour les traiter et les placer dans le modle. Toutefois, pour chaque version de votre application, vous devrez alors dupliquer vos efforts ou copier/coller la logique de calcul de la taxe de vente dans une nouvelle vue compltement diffrente, plutt que dy accder automatiquement par linclusion dune librairie constituant votre modle. Interagir avec des proxys distants Un proxy distant est simplement un proxy qui obtient son objet de donnes depuis une source distante. Cela signifie habituellement que nous interagissons avec cet objet de faon asynchrone. La faon utilise pour que le proxy obtienne ses donnes dpend de la plateforme client, de limplmentation du service distant, et des prfrences du dveloppeur. Dans un environnement Flash/Flex, nous pourrions employer HTTPService, WebService, RemoteObject, DataService ou encore XMLSocket afin de lancer des requtes de service depuis un proxy. Selon les spcifications, un proxy distant peut soit transmettre des requte dynamiquement, en rponse la dfinition dune proprit ou lappel dune mthode; soit faire une requte unique lors de sa construction puis fournir ensuite un accs aux donnes rcupres. Plusieurs optimisations peuvent tre appliques au proxy pour accrotre lefficacit de la communication avec un service distant.
PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 44 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants On peut le construire en mettant en cache les donnes afin de rduire les bavardages rseau; ou en envoyant des mises jour aux seuls blocs de donnes ayant t modifis, et ce afin de rduire la consommation de la bande passante. Si une requte est dynamiquement invoque sur un proxy distant par un autre acteur du systme, le proxy doit pouvoir alors envoyer une notification la rception des donnes. Les parties intresses par cette notification ne sont pas forcment celles qui ont inities la requte. Par exemple, linvocation dune recherche via un service distant et laffichage du rsultat pourrait se faire selon les tapes suivantes : o Un composant visuel initie diffusant un vnement. une recherche en

o Son mdiateur rpond en rcuprant le proxy distant appropri et en dfinissant la proprit searchCriteria o La proprit searchCriteria du proxy est en fait un setter implicite qui stocke la valeur, initialise la recherche via un objet HTTPService puis coute cet objet en attente dun rsultat ou un incident. vnement signalant un

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 45 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants o Le service diffuse en retour un vnement ResultEvent auquel le proxy rpond en plaant lobjet rsultant publiques (data). dans une de ses proprits

o Le proxy envoie alors une notification indiquant le succs du service et place dans son contenu une rfrence lobjet de donnes. o Un autre mdiateur a prcdemment manifest son intrt pour cette notification et il y rpond en assignant les donnes obtenues une proprit dataProvider du composant visuel associ. Ou considrez un LoginProxy qui dtient un value objet LoginVO (une classe ne contenant que des donnes). Ce loginVO pourrait ressembler cela :
package com.me.myapp.model.vo { // Mappe le VO la classe distante suivante [RemoteClass(alias="com.me.myapp.model.vo.LoginVO")] [Bindable] public class LoginVO { public var username: String; public var password: String; public var authToken: String; // dfini par le serveur si lidentification est valide } }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 46 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants LoginProxy expose des mthodes pour dfinir lidentification, grer les sessions (login/logout) et rcuprer les jetons dautorisation inclus dans les appels au service qui suivent le login conformment la logique dauthentification suivante : LoginProxy:
package com.me.myapp.model { import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.remoting.RemoteObject; import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.proxy.Proxy; import com.me.myapp.model.vo.LoginVO; // un proxy pour logger lutilisateur public class LoginProxy extends Proxy implements IProxy { public static const NAME:String = 'LoginProxy'; public static const LOGIN_SUCCESS:String = 'loginSuccess'; public static const LOGIN_FAILED:String = 'loginFailed'; public static const LOGGED_OUT:String = 'loggedOut'; private var loginService: RemoteObject; public function LoginProxy () { super( NAME, new LoginVO ( ) ); loginService = new RemoteObject(); loginService.source = "LoginService"; loginService.destination = "GenericDestination"; loginService.addEventListener( FaultEvent.FAULT, onFault ); loginService.login.addEventListener( ResultEvent.RESULT, onResult ); } // Transtypage de lobjet de donnes avec un getter implicite public function get loginVO( ) : LoginVO { return data as LoginVO; }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 47 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants
// Lutilisateur est logg si le VO login contient un jeton dautorisation public function get loggedIn():Boolean { return ( authToken != null ); } // les appels aux services subsquents doivent inclure un jeton dautorisation public function get authToken():String { return loginVO.authToken; } //dfinit lidentification, lance le login ou le logout puis ressaie public function login( tryLogin:LoginVO ) : void { if ( ! loggedIn ) { loginVO.username= tryLogin.username; loginVO.password = tryLogin.password; } else { logout(); login( tryLogin ); } } //pour se dlogger, rinitialiser LoginVO public function logout( ) : void { if ( loggedIn ) loginVO = new LoginVO( ); sendNotification( LOGGED_OUT ); } //notifie un succs de login private function onResult( event:ResultEvent ) : void { setData( event.result ); // immdiatement disponible en tant que loginVO sendNotification( LOGIN_SUCCESS, authToken ); } //notifie un chec de login private function onFault( event:FaultEvent) : void { sendNotification( LOGIN_FAILED, event.fault.faultString ); } } }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 48 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants Un LoginCommand pourrait rcuprer le LoginProxy, dfinir lidentification et invoquer la mthode login, appelant le service. Un GetPrefsCommand pourrait rpondre la notification LOGIN_SUCCESS, rcuprer le authToken contenu dans la notification et faire un appel au prochain service qui rcupre les prfrences de lutilisateur. LoginCommand:
package com.me.myapp.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.command.*; import com.me.myapp.model.LoginProxy; import com.me.myapp.model.vo.LoginVO; public class LoginCommand extends SimpleCommand { override public function execute( note: INotification ) : void { var loginVO : LoginVO = note.getBody() as LoginVO; var loginProxy: LoginProxy; loginProxy = facade.retrieveProxy( LoginProxy.NAME ) as LoginProxy; loginProxy.login( loginVO ); } } }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 49 de 50

4/15/2008 3:45 PM

Proxys
Interagir avec des proxys distants GetPrefsCommand:
package com.me.myapp.controller { import org.puremvc.as3.interfaces.*; import org.puremvc.as3.patterns.command.*; import com.me.myapp.model.LoginProxy; import com.me.myapp.model.vo.LoginVO; public class GetPrefsCommand extends SimpleCommand { override public function execute( note: INotification ) : void { var authToken : String = note.getBody() as String; var prefsProxy : PrefsProxy; prefsProxy = facade.retrieveProxy( PrefsProxy.NAME ) as PrefsProxy; prefsProxy.getPrefs( authToken ); } } }

PureMVC est un framework open-source et gratuit cr et gr par Futurescale, Inc. Copyright 2006-08, Droits rservs. La rutilisation est gre par le Creative Commons 3.0 Attribution US License. PureMVC, incluant le prsent document, tout support de formation ou code source de dmonstration tlchargs depuis le site de Futurescale sont fournis en ltat sans garantie daucune sorte, expresse ou implicite, incluant notamment les garanties implicites dadquation, ou la garantie de non violation.
Implmentation Idiomes & Meilleures Pratiques.doc

Page 50 de 50

4/15/2008 3:45 PM

Vous aimerez peut-être aussi