Options d'une méthode "Array-like"
Par -Alexandre LEGOUT aka LAlex- le mercredi, février 20 2008, 19:57 - AS3 / Flex2 - Lien permanent
Un appel à une méthode paut parfois avoir besoin d'un certains nombre "d'options", comme c'est le cas pour la méthode Array.sort par exemple.
Il existe alors plusieurs possibilités, la plus simple étant de proposer un certain nombre de paramètres booléens facultatifs, avec des valeurs par défaut. Le problème est tout d'abord que cela alourdit considérablement le code, mais aussi que rajouter une option supplémentaire modifie la signature de la méthode: si on travaille avec des interfaces, bonjour la galère).
Bref, il existe aussi la possibilité de passer un seul entier, qui sera la
somme de puissances de 2. En gros, cela permet d'avoir, en binaire, une suite
de 0 et de 1, chacun correspondant à l'activation (ou pas) d'une option.
Voyons comment cela fonctionne concrètement avec l'exemple de
Array.sort
Les différentes options de cette méthode ont toutes une valeur numérique puissance de 2:
- Array.CASEINSENSITIVE: valeur 1 (2 puissance 0)
- Array.DESCENDING : valeur 2 (2 puissance 1)
- Array.UNIQUESORT : valeur 4 (2 puissance 2)
- etc...
Pour les utiliser, on se sert de l'opérateur OU binaire | (pipe simple) de la manière suivante:
myArray.sort(Array.DESCENDING | Array.UNIQUESORT);
Pour utiliser ce système dans d'autres situations, j'ai développé une ch'tite
classe toute simple qui génère des options propres à chaque classe, et permet
de tester si une option donnée est donnée dont voici l'utilisation:
package com.lalex.utils {
import flash.display.BitmapData;
import com.lalex.utils.Options;
/**
* @author LAlex
*/
public class LAlexDemo {
// Create options on the fly
public static const SHOW_DEBUG : int = Options.create(LAlexDemo);
public static const SHOW_BORDER : int = Options.create(LAlexDemo);
public static const HIDE_FILL : int = Options.create(LAlexDemo);
public function drawShape(bdt : BitmapData, options:int = 0) : void {
if (Options.hasOption(options, SHOW_DEBUG)) trace("We will show debug infos");
if (Options.hasOption(options, SHOW_BORDER)) trace("We will show shape's border");
if (Options.hasOption(options, HIDE_FILL)) trace("We will hide shape's fill color");
}
}
}
// Utilisation
var demo:LAlexDemo = new LAlexDemo;
demo.drawShape(myBitmapData, LAlexDemo.SHOW_DEBUG | LAlexDemo.HIDE_FILL);
Voila, un p'tit clic pour télécharger com.lalex.utils.Options ![]()
Commentaires
Très intéressant comme méthode pour créer des énumérations binaires.
Pour ma part j'utilise plutôt l'opérateur binaire << pour trouver mes valeurs binaires :
for (var i:Number = 0 ; i<10 ; i++)
{
trace(1 << i) ;
}
Sinon personnellement j'aime bien créer des classes de filtrage comme ceci :
- http://svn1.cvsdude.com/osflash/veg...
Très pratique pour manipuler les filtrages binaires dans une application.
EKA+
Merci pour cet article.
Une question cependant : dans quel cas utilisé des énumérations pour les arguments et dans quel cas utilisé la méthode "classique" ( c-a-d arguments optionnels avec des valeurs par défaut) ?
Salut Lalex!
Comme Eka, je ne suis pas vraiment convaincu par une classe pour cette fonctionnalite. Je suis aussi un adepte du '<<' que je trouve aussi rapide a taper et qui en plus est decouple a la compilation (normalement), si bien qu'il n'y a pas de penalite a la performance au run time:
public static const SHOW_DEBUG : int = 1;
public static const SHOW_BORDER : int = 1 << 1;
public static const HIDE_FILL : int = 1 << 2;
Enfin bon je reconnais que la penalite est minimum vu que les statics ne sont definies qu'une fois :).
A+
Timoth'
Fil des commentaires de ce billet