我正在为Actionscript 3寻找功能齐全的AOP库。
到目前为止我注意到了以下项目,但他们似乎都遇到了问题:
有谁知道更好的解决方案?或者有没有人在Actionscript 3中有任何AOP经验?
致以最诚挚的问候,
汤姆
答案 0 :(得分:7)
ActionScript 3中的AOP非常难。所有的aproaches都有他们的问题:
您可以使用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)
查看Mixing Loom,这是Flex / ActionScript中AOP的基础: http://www.jamesward.com/2011/04/26/introducing-mixing-loom-runtime-actionscript-bytecode-modification