自定义元数据和静态函数之间的区别

时间:2009-08-24 17:46:40

标签: actionscript-3

Actionscript类中的自定义元数据非常酷。你可以在类,函数和变量前放置方括号中的任何内容;告诉编译器将其(按名称)包含在SWF中;并使用describeType()来检索它。

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

添加到“其他编译器参数”

-keep-as3-metadata+=MyMetaData

并使用describeType()查找具有该元数据的项目

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

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

另一方面,静态函数非常简单:

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

虽然我希望静态函数是虚拟的,但它们可以做他们应该做的事情。


元数据对类级项的静态函数有什么优势?

2 个答案:

答案 0 :(得分:3)

我认为存在与使用元数据相关的一些性能问题。 describeType并不便宜,那么你必须从大型XML树中提取你想要的东西。

肯定存在与类型相关的问题。如果数据在一个类中,即使你发送Object的第二个例子也会好得多。这些天我很少非常在我的代码中的任何地方使用Object,除非我正在进行原型设计。而且您的代码可以更加简洁:

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

此外,静态类函数可以与其他静态类函数和静态属性进行交互:

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

}

我可以想象用于元数据(例如,对于不需要实现接口的库代码),我可以看到为什么Flex为此目的使用它们(例如构建远程对象,事件,可绑定的列表)但我会从不推荐它们正常使用。

答案 1 :(得分:3)

我更赞同詹姆斯。但是,元数据有一个优势:统一访问 ...

如果你有一个类数组,并且你知道它们每个都有一个属性classMetaData,那么这段代码将不起作用:

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

这将:

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

但它相当古怪,要求每个类都有该静态属性,并且c.getData()之上的类型也是* ...

通过describeType访问元数据总是很好......可能发生的最糟糕的事情是,你最终迭代一个空的XMLList,但最终却没有错...如果你将遍历封装到某个实用程序类或类似的东西中,那么你最终得到了一个可靠的解决方案...如果它使用缓存来检索数据,那么你实际上并不比使用静态变量访问慢......

最后,我认为这个想法很简单:你应该使用元数据标签捕获元数据和动作脚本以捕获数据 ......这种区别不是100%显而易见,而是最后,由你来划分两者之间的界线...

格尔茨

back2dos