[lowRA] - Un petit lifting sur le MVC+FC
Par Laurent Deketelaere le samedi, janvier 12 2008, 18:42 - Flash plateforme - Lien permanent
La première chose qui risque de troubler les utilisateurs de pixLib quand ils débarquent dans lowRA, c'est la disparition du MovieClipHelper.
Pas de panique, c'est un mal pour un bien.
Voici en deux mots comment mettre en place une simple structure MVC dans lowRA.
Commençons tout d'abord par un peu de nomenclature.
Pour rappel, une classe dit Abstraite (Abstract) ne peut être utilisé telle quelle, il faut d'abord l'étendre.
Voyons le cas de l'AbstractModel
Pour utiliser la classe AbstractModel nous devons l'étendre.
[actionscript] public class DrawingModel extends AbstractModel { public function DrawingModel(owner : Plugin = null, name : String = null) { super(owner, name); Debug.INFO(this + " is CREATE !!!"); }
Dans un premier temps nous n'allons pas tenir compte de l'argument owner (je le présenterait dans le billet suivant, [lowRA] - Owner, la notion de plugin ). Ce qu'il faut retenir c'est que chaque modèle reçoit un nom, il s'agit d'un identifiant (unique!) qui permettra de récupèrer l'instance de la classe de n'importe quel endroit de l'application grâce à la classe ModelLocator.
ModelLocator
ModelLocator est un singleton (je ne veux aucun commentaire des puristes :p ), ce qui veut dire qu'il ne peut exister qu'une seule instance de la classe. Cette classe stock en elle l'ensemble des Modèle de l'application, et donc permet de récupérer de façon global n'importe quelle instance d'AbstractModel instancié.
[actionscript] ModelLocator.getInstance().getModel("nom_de_mon_model");
Pour les vues c'est la même logique avec AbstractView et ViewLocator. Et pour les commandes c'est presque parreil, la seul différence réside dans le fait que c'est le FrontControlleur qui fait office de locator et que l'identifiant est le nom d'un événement.
[actionscript] monController.pushCommandClass("monEvenement", MaCommandExecute);
Rien de bien nouveau avec pixLib si ce n'est le pushCommandClass. Maintenant nous pouvons choisir d'exécuter à chaque évènement la même instance de la commande ou dans instancier une nouvelle (plus proche du pattern originel).
[actionscript] public function pushCommandClass( eventName : String, commandClass : Class ) : void public function pushCommandInstance( eventName : String, command : Command ) : void
Voilà, avec ces six classes nous avons de quoi déployer une structure MVC + FrontController en AS3.
En bonus, je me suis amusé à porter un petit projet MVC pixLib vers lowRA.
- Les sources AS2 (pixLib).
- Les sources AS3 (lowRA) - la build utilise iFac pour compiler.
Pour ceux qui veulent savoir un peut plus sur le MVC+FC dans pixLib :
Commentaires
c'est les initiales de quoi FT ?
(et que personne me dit France Telecom ...)
Presque :p
FT veut dire FrontController. Merci Eka.
FT ne veut rien dire. :p
Par contre FC veut dire FrontController.
C'est une classe global (singleton), qui est abonné au événements du gestionnaire d'événement global ( EventBrodcaster.getInstance() ).
A partir de ça on peut lier l'exécution d'une commande à un événement global et donc de pouvoir l'exécuter depuis tout les endroits de l'application.
Si je lie l'evenenement : "monEvenement" à la commande MaCommandExecute.
///
actionscript
monController.pushCommandClass("monEvenement", MaCommandExecute);
///
Je peux exécuter ma commande en lancant.
///
actionscript
EventBroadcaster.getInstance().broadcastEvent(new BasicEvent("monEvenement");
///
Ca parle bien d'émetteur de récepteur, de message, mais pas de France telecom. :p
Hello
Pour ma part je dis FC et pas FT pour un front controller ? Enfin après ... chacun sa nomenclature ^_^
Sinon c'est clair que les FrontController c'est franchement important pour apporter une bonne souplesse dans le code d'une application
EKA+
Pfff, parfois je me demande comment je fais. :p
Je sais pas comment je suis arrivé à un FT, en plus ce que j'écris en haut est faux. c'est pas un MVC + FC, mais un MVC + Command puisque le FrontController est le Contrôler global qui exécute des commandes. :p
Allez je corrige tout ça.
merci