2012-07-02 24 views
3

我对typed/generic方面做了一些研究。关于方面的一个重要事实是遗忘。所以这些方面的问题应该与领​​域问题是正交的。尽管如此,仍有调查使AspectJ类型安全(StrongAspectJ)/使用泛型引入每类型方面。一篇论文提到了享元模式的一个实现方面。现在我想知道泛型方面是否还有更多用例?类型/通用方面值得付出努力吗?

回答

2

PostSharp是弱类型的,即建议将参数和返回值看作'对象'。在PostSharp中有一些对通用方面的支持(方面可以是泛型类),但它不是非常有用,因为这些建议是弱类型的。

请注意,在封面后面,由PostSharp生成的粘合代码是强类型的。但是当暴露于方面代码时,所有东西都会被向下转换为对象。

我正在考虑在PostSharp的下一个版本中实施强类型建议,可能支持泛型参数。原因在于运行时性能,因为将值类型装入对象会带来相当大的性能开销。请注意泛型在.NET中的实现方式与在Java中的实现方式不同,因此这两点可能需要在两个平台上进行不同的讨论。

如果您需要任何关于论文的帮助,请随时与我联系。

+0

关于泛型.NET和Java之间的区别的好处。 –

1

自动生成一些样板到make a class callable via RMI是另一个用例。该示例为一堆方法实现了一些周围的建议。

pointcut callsToServer(Type T): 
    call(public T Server.*(..)) && this(Client) 
T around(Type T): callsToServer(T) { 
    T obj = null; 
    try { 
     obj = proceed(); 
    } catch (java.rmi.RemoteException ex) {} 
    return obj; 
} 

泛型允许您说“我们将返回一个与方法签名相同类型的对象”。当然,如果我们只是返回对象,这是真的。我们可能可以通过“抛出”建议来做类似的事情,但是我们无法操纵返回值来将RemoteException转换为空返回值。

+0

你是什么意思*我们可以用“抛出后”的建议做类似的事情,但是我们不能操纵返回值来将RemoteException转换为空返回值。我对AspectJ没有太多经验,我更熟悉PostSharp,它是C#的AOP框架。尽管如此,我认为AspectJ是最好的选择,因为它是AOP研究的领导者。 – Matthias

+0

问题是,AspectJ可以让你忽略不关心它的建议中的返回值。在这些情况下,不需要泛型类型来保存返回值。 “抛出后”是仅在抛出异常时才应用的建议,因此没有返回值。但是如果你想操纵返回值,就像这段代码所做的那样,你需要能够将它保存在一个变量中。如果切入点遇到多个具有不同返回类型的连接点,您将从一个通用参数中受益。返回null而不是抛出异常就是这种情况。 –

+0

同意。另一方面,有许多使用另一种方法的AOP实现。你会得到一个包含参数和返回值的IInvocation对象。所以在建议中没有'return',除非你想早点退出。您可以在'IInvocation'对象上设置的字段是'object'类型。因此,你几乎不可能谈论类型安全。在我看来,你的RMI例子(以及我的轻量级!)是AOP的某种滥用。不知道AOP,我会为他们两个使用工厂模式。即使使用AOP,我也会说这是更好的选择。 – Matthias