我正在为 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 真的很难。所有方法都有其问题:
- 代理:实际上对程序员来说工作正常且透明,但对运行时却不是。如果任何函数签名需要 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 容器。在您的整个代码中,您永远不会明确使用它的类型,而是使用等效的匿名类型。我描述的代理问题将消失。您唯一需要做的就是将您的代理不安全地转换为该匿名类型。
关于actionscript-3 - Actionscript 3 的面向方面的编程库/框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817621/