2009-08-24 10 views
3

Les métadonnées personnalisées dans les classes ActionScript sont très cool. Vous pouvez mettre n'importe quoi entre crochets devant les classes, les fonctions et les variables; dites au compilateur de l'inclure (par son nom) dans le fichier SWF; et utilisez describeType() pour le récupérer.Différence entre les métadonnées personnalisées et les fonctions statiques?

[MyMetaData(name1=value1, name2=value2)] 

Ajouter à « arguments de compilateur supplémentaires »

-keep-as3-metadata+=MyMetaData 

Et utiliser describeType() pour trouver ces éléments avec que les méta-données

var typeDescriptionXML : XML = flash.utils.describeType(aType); 

var itemsWithMyMetaData : XMLList = 
    classXML.factory.metadata.(@name == "MyMetaData"); 

fonctions statiques, sur la d'autre part sont plutôt simple:

public static function myStaticFunction() : Object 
{ 
    var result : Object = new Object({name1: "value1", name2: "value2"}); 
    return result; 
} 

Alors que je voudrais que les fonctions statiques soient virtuelles, elles font ce qu'elles sont censées faire.


Quel sont les avantages des méta-données ont sur des fonctions statiques pour niveau de la classe articles?

Répondre

3

Je suppose qu'il existe des problèmes de performances liés à l'utilisation de métadonnées. describeType n'est pas bon marché, alors vous devez tirer ce que vous voulez sur le grand arbre XML.

Il existe certainement des problèmes liés au type. Même votre deuxième exemple où vous envoyez un Object serait beaucoup mieux si les données étaient à l'intérieur d'une classe. C'est très rare pour moi ces jours-ci d'utiliser Object s n'importe où dans mon code sauf quand je fais du prototypage. Et votre code pourrait être beaucoup plus succincte:

public static function myStaticFunction():Object 
{ 
    return { name1: "value1", name2: "value2" }; 
} 

fonctions de classe plus statiques peuvent interagir avec d'autres fonctions statiques de classe et les propriétés statiques:

package 
{ 
public class StaticClass 
{ 
    private static const SOME_DATA:int = 0; 
    private static const SOME_STRING:String = "Hello World"; 

    private static var count:int = 0; 

    public static function printCount():void 
    { 
     trace(SOME_STRING, SOME_DATA, count++); 
    } 
} 

} 

Je peux imaginer utilise pour les métadonnées (par exemple pour le code bibliothèque ne nécessite pas l'implémentation d'une interface) et je peux voir pourquoi Flex les utilise à cette fin (par exemple construire des listes d'objets distants, d'événements, de bindables) mais je ne les recommanderais jamais pour un usage normal.

3

Je suis d'accord avec James. Cependant, il y a un avantage pour les métadonnées: un accès uniforme ...

si vous avez un tableau de classes, et vous savez genre de, que chacun d'eux a une propriété classMetaData, alors ce code ne fonctionnera pas :

for each (var c:Class in arrayOfClass) 
    trace(c.getData()); 

cette volonté:

for each (var c:* in arrayOfClass) 
    trace(c.getData()); 

mais il est assez bizarre, exigeant que chaque classe a cette propriété statique, et au-dessus de cette c.getData() est également de type * ... 0 L'accès aux métadonnées à travers describeType fonctionne toujours bien ...la pire chose qui puisse arriver est que vous finissiez par itérer un XMLList vide, mais il n'y a rien de mal à cela à la fin ... si vous encapsulez cette traversée dans une classe d'utilité ou quelque chose comme ça, alors vous vous retrouvez avec un solide solution ... et si elle utilise un cache pour les données récupérées, vous n'êtes pas vraiment plus lent qu'avec l'accès aux variables statiques ...

à la fin, je pense que l'idée est simple: vous devez utiliser des balises de métadonnées pour capturer méta-données et actionscript pour saisir les données ... la distinction n'est pas 100% évidente, mais à la fin, il est à vous de tracer la ligne entre les deux ...

greetz

back2dos

Questions connexes