Registry en Actionscript3
Par Magu(s) le vendredi 27 juillet 2007, 17h32 - Lien permanent - URL miniature
On a beau dire, même si c'était "mal", l'utilisation de l'object "_global" en AS1/2 se trouvait être bien pratique dans certain cas, notamment en ce qui concernait la simulation de sessions et des registres. Avec l'AS3, Adobe ne nous laisse plus faire les dégueulasses puisque le scope global a tout simplement été supprimé du langage.
Alors comment faire maintenant pour stocker globalement des informations qui seront nécéssaires à tout le monde et tout au long de l'application ? Et bien soit on utilise le "hack" de simulation de _global d'Ekameleon, soit on utilise un Singleton comme celà se fait déjà dans le Zend Framework via Zend::Registry.
Selon la spécification du pattern, un Singleton ne devrait pas pouvoir s'instancier via son constructeur, malheureusement l'AS3 ne nous permet pas de déclarer un constructeur comme membre privé. Pour contourner ce problème, en suivant l'exemple préconisé par virtual-industry.com, nous pouvons vérifier au runtime que notre singleton n'est pas instancié par lui même.
package adjust.utils {
import flash.utils.getQualifiedClassName;
dynamic public class Registry {
private static var INSTANCE:Registry = null;
private static var ALLOW_INSTANTIATION:Boolean = false;
public function Registry() {
if (getQualifiedClassName(super) == "adjust.utils::Registry" ) {
if (!ALLOW_INSTANTIATION) {
throw new Error("Error: Registry is a Singleton. Use Registry.getInstance()");
}
}
}
public static function getInstance():Registry {
if (INSTANCE == null) {
ALLOW_INSTANTIATION = true;
INSTANCE = new Registry();
ALLOW_INSTANTIATION = false;
} return INSTANCE;
}
}
}
Nous pouvons désormais depuis une classe A stocker une information dans le Registre :
package{
import adjust.utils.Registry;
public class A(){
public function A(){
var reg:Registry = Registry.getInstance();
reg.hello = "world";
}
}
}
Et la récupérer sans problème dans une classe B
package{
import adjust.utils.Registry;
public class B(){
public function B(){
var reg:Registry = Registry.getInstance();
trace(reg.hello) // world
}
}
}
C'est beau comme une chanson de Morrissey 
Commentaires
hello
je me suis rendu compte à force de coder que la sécurisation du constructeur n'est pas forcément obligatoire à chaque fois... j'aime bien pour ma part avoir des classes que l'on peut instancier normalement mais qui contiennent tout de même une référence singleton static via la méthode getInstance(). La méthode getInstance() peut donc être utilisée pour une référence globale de la classe dans toute l'application.
EKA+
c'est encore plus beau avec la colorisation syntaxique
mais bon ça veut toujours rien dire pour moi
When you are sad, Swarovski will cheer you. When you are happy, Swarovski will liven you. When you are lonely, Swarovski will accompany you.
Thanks you for your support, all the information is just what i need.