我正在为Actionscript 3寻找一个功能齐全的AOP库.
到目前为止我注意到的以下项目,但他们似乎都遇到了问题:
http://farmcode.org/page/Sodality.aspx
到目前为止看起来最有希望,但是它要求你为我认为的每个AOP"调用"创建一个全新的类,它会迫使你遵循很多限制,有人有经验吗?
http://code.google.com/p/loom-as3/
这个已停止使用
http://code.google.com/p/floxy/
动态代理生成?据我所知,这不是真正的AOP,对吧?
http://code.google.com/p/flemit/
动态字节码生成?这是我认为AOP需要的东西,但不是我正在寻找的全功能AOP框架
有谁知道更好的解决方案?或者有没有人在Actionscript 3中有过AOP的经验?
最好的祝福,
汤姆
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有匿名类型的概念.在运行时,这些仅仅是*
(因此预期会出现性能损失),但在编译时,它们是类型安全的.你可以做的是为你需要的任何类型的对象创建一个代理,并将其用作AOP容器.在你的整个代码中,你永远不会使用它的类型,而是一个等效的匿名类型.我所描述的代理问题将会消失.您唯一需要做的就是将代理的不安全转换为匿名类型.