ActionScript 3的面向方面编程库/框架?

时间:2010-05-12 09:49:43

标签: actionscript-3 frameworks aop

我正在为Actionscript 3寻找功能齐全的AOP库。

到目前为止我注意到了以下项目,但他们似乎都遇到了问题:

有谁知道更好的解决方案?或者有没有人在Actionscript 3中有任何AOP经验?

致以最诚挚的问候,

汤姆

2 个答案:

答案 0 :(得分:7)

ActionScript 3中的AOP非常难。所有的aproaches都有他们的问题:

  • 代理:实际上对程序员来说工作得很好而且透明,但对运行时却没有。如果任何函数签名需要类型A的对象,那么类型A的对象的代理将无法通过类型检查
  • 字节码生成:嗯,有点工作,但不太好。在AVM2中加载字节码是异步的,所以你不能及时做到这一点。此外,一旦加载了字节码,就无法丢弃它,因此您无法再次修改类。
  • 其他任何事情都是冗长的

您可以使用Haxe。 Haxe不仅具有优于AS3的其他优势,而且还允许一些AOP。有两种方法:

动态方法

在Haxe中,您可以声明方法是动态的。这些可以在运行时替换以提供建议。让我解释一下,幕后发生了什么。以下Haxe代码:

public function foo(param1:Type1):Type2 { /*body*/ }
public dynamic function bar(param1:Type1):Type2 { /*body*/ }

是否等效于以下AS3代码:

public function foo(param1:Type1):Type2 { /*body*/ }
public var bar:Function = function (param1:Type1):Type2 { /*body*/ }

使用后者总是比前者表现更差,因为涉及很多运行时类型检查。但是,在Haxe中,与AS3不同,您不会失去严格键入的编译时间优势。

同样,使用Haxe的访问器(确实与AS3非常不同),您也可以使用AOP进行属性:

public var foo(get_foo, set_foo):Type;
dynamic function get_foo() {//Haxe will automatically infer types: http://haxe.org/ref/type_infer
    return this.foo;
}
dynamic function set_foo(param) {
    return this.foo = param;
}

任何动态方法都可以在运行时替换为您想做的任何事情。 AS2允许这样,像as2lib这样的库提供了AOP。不幸的是,它已不再可用。但我想你可以自己弄清楚其余部分。

代理功能

Haxe有anonymous types的概念。在运行时,这些只是*(因此预期会出现性能损失),但在编译时,它们是类型安全的。你可以做的是为你需要的任何类型的对象创建一个代理,并将其用作AOP容器。在您的整个代码中,您永远不会使用它的类型,而是一个等效的匿名类型。我所描述的代理问题将会消失。您唯一需要做的就是将代理的不安全转换为匿名类型。

答案 1 :(得分:2)