2009-08-24 9 views
3

Benutzerdefinierte Metadaten in Actionscript-Klassen sind sehr cool. Sie können alles in eckige Klammern vor Klassen, Funktionen und Variablen setzen; dem Compiler mitteilen, dass er es (mit Namen) in die SWF-Datei aufnehmen soll; und benutze describeType(), um es zu erhalten.Unterschied zwischen benutzerdefinierten Metadaten und statischen Funktionen?

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

In den „Zusätzliche Compiler-Argumente“

-keep-as3-metadata+=MyMetaData 

Und verwenden describeType() diese Elemente mit, dass Meta-Daten

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

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

Statische Funktionen zu finden, die auf die Andererseits sind eher geradlinig:

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

Während ich möchte, dass statische Funktionen virtuell sind, tun sie, was sie tun sollen.


Welchen Vorteil bietet Meta-Daten über statische Funktionen für Klassenstufe Artikel?

Antwort

3

Ich würde annehmen, dass es einige Leistungsprobleme im Zusammenhang mit der Verwendung von Metadaten gibt. describeType ist nicht billig, dann müssen Sie aus dem großen XML-Baum ziehen, was Sie wollen.

Es gibt sicherlich typbezogene Probleme. Selbst Ihr zweites Beispiel, in dem Sie eine Object senden, wäre viel besser, wenn die Daten in einer Klasse wären. Es ist sehr selten für mich in diesen Tagen zu verwenden Object s überall in meinem Code außer wenn ich Prototyping bin. Und Ihr Code könnte viel prägnanter sein:

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

Zusätzlich statische Klassenfunktionen mit anderen statischen Klassenfunktionen in Wechselwirkung treten können und statischen Eigenschaften:

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++); 
    } 
} 

} 

Ich kann für Metadaten (zB für die Bibliothek Code verwendet vorstellen, dass erfordert keine Implementierung einer Schnittstelle) und ich kann sehen, warum Flex sie für diesen Zweck verwendet (zB Listen von Remote-Objekten, Ereignissen, Bindables erstellen), aber ich würde sie nie für den normalen Gebrauch empfehlen.

3

Ich stimme James mehr und mehr zu. Allerdings gibt es einen Vorteil für Metadaten: einheitlicher Zugang ...

wenn Sie eine Reihe von Klassen, und Sie Art wissen, dass jeder von ihnen hat eine Eigenschaft classMetaData, dann wird dieser Code nicht funktioniert :

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

dieser Wille:

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

aber es ist eher skurril, zu verlangen, dass jede Klasse, dass statische Eigenschaft hat, und oben auf diesen c.getData() ist ebenfalls vom Typ * ...

Der Zugriff auf Metadaten über describeType funktioniert immer gut ...Das Schlimmste, was passieren kann, ist, dass Sie eine leere XMLList iterieren, aber am Ende ist nichts falsch daran ... Wenn Sie diese Traversale in eine Utility-Klasse oder etwas Ähnliches einkapseln, erhalten Sie einen Solid Lösung ... und wenn es einen Cache für abgerufene Daten verwendet, sind Sie nicht wirklich langsamer als mit statischen Variablenzugriff ...

am Ende denke ich, die Idee ist einfach: sollten Sie Metadaten-Tags zu verwenden erfassen Meta-Daten und Actionscript zu erfassen Daten ... ist die Unterscheidung nicht zu 100% klar, aber am Ende ist es an Ihnen, die Grenze zwischen beiden zu ziehen ...

greetz

back2dos

Verwandte Themen