Les tribulations d'un flasheur en Flash(ine?)
   
 
> le pattern factory et mes plugins

Un bon moment sans la moindre mise à jour. Trop de travail, trop de jeux, trop de tout :)

Je vais vous parler d'un petit bout de code que j'utilise dans mes projets actuels pour m'autoriser une certaine flexibilité. C'est une adaptation libre, sous AS3, du pattern "factory method". Vous me direz "il a déjà été implémenté très bien à plein d'endroits", et je vous répondrai "oui, et?".

Problématique

Ma problématique était la suivante :

  • Je suis en phase de proto, donc mes implémentations d'un même concept vont varier souvent, et faire des allers-retours
  • j'utilise des xml pour charger mes épisodes (plus là-dessus dans un prochain post)
  • Je vais probablement avoir besoin de créer des instances de nombreuses classes sans savoir à l'avance lesquelles, en fonction de mes XML. En particulier j'aurai besoin d'invoquer des classes différentes en fonction du XML. Par exemple, dans une section "Thumbnail" de mon xml, j'aurai des des Video, des Image, des Text, des Swf, et d'autres... Je veux pouvoir charger ces fonctionnalités, séléctivement, après l'affichage de la page web par mon utilisateur.
  • Et j'aime bien que mon point d'entrée .swf soit le plus léger possible (thin client) afin d'être vite réactif quand la page web est ouverte.

"Say no more!", vous me dites, "flex fait ça très bien, tu lies tes projets de bibliothèque en tant que bibliothèque RSL, et c'est plié". Certes. Mais j'aime bien me creuser la tête, et surtout j'aime bien découpler encore plus les choses. En particulier, malgré les RSL, le projet principal devra appeler nommément vos classes, et il ne se lancera pas tant que toutes les RSL ne seront pas chargées (ou alors je lles utilise mal.

L'idée

En AS3, une classe peut être traitée comme n'importe quelle variable, comme ça :

import MaClasse;//MaClasse est une... class :)
var maVariable:Class = MaClasse;
var monObjet:Object = new maVariable();// monObjet est une instance de MaClasse.

aussi simple que ça. Par conséquent, je peux maintenir une liste nommée de classes à invoquer dans ma factory, sans aucune mention "en dur" des classes qui seront réellement utilisées.

L'implémentation (rapidos)

Factory

Dans ce qui me servira de factory, il me faut un RegisterClass(_handle:String, _class:Class) et un GetObject(). Je suis une feignasse, donc chez moi la factory, c'est la classe mère de ce qui sera créé, et la fonction est statique. On peut implémenter la même chose dans un manager de factories si on est moins feignasse. Si on reprend mon exemple de thumbnails :

public class Thumbnail extends DisplayObject{
[...] private static var s_classes:Object;
private static var s_defaultClass:Class = CarreGris;//Une sous-classe de Thumbnail ;)
public static function RegisterClass(_handle:String, _class:Class):void{
if(!s_classes) s_classes = new Object();
s_class[_handle] = _class;
}
public static function GetThumb(_xml:XML):Thumbnail{
var l_class:Class = s_classe[_xml.name()] || s_defaultClass;
var l_th:Thumbnail = new l_class(_xml) as Thumbnail;
if(l_thumb) return l_thumb;
return new s_defaultClass(_xml);
}
}

et voilà, maintenant je peux appeler Thumbnail.GetThumb(), qui me renverra forcément une instance de Thumbnail ou de ses sous-classes. C'est bien joli, mais je fabrique encore que des Carrés Gris, peu importe le XML reçu. Don't Panic.

Plugin

Ensuite, je crée un deuxième swf (dans flash, flash builder ou par tout autre méthode), qui sera téléchargé par mon appli principale, et une fois reçu, j'appelle Init();

import MonVideoThumbnail;//comme son nom l'indique, sous-classe de Thumbnail
import MonImageThumbnail;//pareil. ces deux classes sont inconnues dans le swf principal
import Thumbnail;
public class Plugin extends Sprite{
[...]
public function Init():void{
Thumbnail.RegisterClass("Video", MonVideoThumbnail);
Thumbnail.RegisterClass("Image", MonImageThumbnail);
}

 

Victoire : j'ai étendu le spectre des Thumbnails avec un découplage maximal!

 

Je sais, il me faut un vrai job... :)


Bookmark and Share

Publié le 02/03/2011 10:46:33 avec les tags : AS3   bidouille   pattern   plugin  

Ajouter un commentaire : Cliquez ici

Pseudo : Une valeur est requise.
E-mail : Une valeur est requise.Format non valide.
Commentaire : Une valeur est requise.
Combien font deux fois deux ? 4 ou 10 ? Une valeur est requise.
 
 
   
  Resistcorp.org . All rights reserved.
Website design and concepcion: Kadisbel.com