我对typed/generic方面做了一些研究。关于方面的一个重要事实是遗忘。所以这些方面的问题应该与领域问题是正交的。尽管如此,仍有调查使AspectJ类型安全(StrongAspectJ)/使用泛型引入每类型方面。一篇论文提到了享元模式的一个实现方面。现在我想知道泛型方面是否还有更多用例?类型/通用方面值得付出努力吗?
回答
PostSharp是弱类型的,即建议将参数和返回值看作'对象'。在PostSharp中有一些对通用方面的支持(方面可以是泛型类),但它不是非常有用,因为这些建议是弱类型的。
请注意,在封面后面,由PostSharp生成的粘合代码是强类型的。但是当暴露于方面代码时,所有东西都会被向下转换为对象。
我正在考虑在PostSharp的下一个版本中实施强类型建议,可能支持泛型参数。原因在于运行时性能,因为将值类型装入对象会带来相当大的性能开销。请注意泛型在.NET中的实现方式与在Java中的实现方式不同,因此这两点可能需要在两个平台上进行不同的讨论。
如果您需要任何关于论文的帮助,请随时与我联系。
自动生成一些样板到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转换为空返回值。
你是什么意思*我们可以用“抛出后”的建议做类似的事情,但是我们不能操纵返回值来将RemoteException转换为空返回值。我对AspectJ没有太多经验,我更熟悉PostSharp,它是C#的AOP框架。尽管如此,我认为AspectJ是最好的选择,因为它是AOP研究的领导者。 – Matthias
问题是,AspectJ可以让你忽略不关心它的建议中的返回值。在这些情况下,不需要泛型类型来保存返回值。 “抛出后”是仅在抛出异常时才应用的建议,因此没有返回值。但是如果你想操纵返回值,就像这段代码所做的那样,你需要能够将它保存在一个变量中。如果切入点遇到多个具有不同返回类型的连接点,您将从一个通用参数中受益。返回null而不是抛出异常就是这种情况。 –
同意。另一方面,有许多使用另一种方法的AOP实现。你会得到一个包含参数和返回值的IInvocation对象。所以在建议中没有'return',除非你想早点退出。您可以在'IInvocation'对象上设置的字段是'object'类型。因此,你几乎不可能谈论类型安全。在我看来,你的RMI例子(以及我的轻量级!)是AOP的某种滥用。不知道AOP,我会为他们两个使用工厂模式。即使使用AOP,我也会说这是更好的选择。 – Matthias
- 1. MonoDroid是值得付出的努力吗?
- 2. 深度嵌套多态资源值得付出努力吗?
- 3. 什么时候平行磁盘I/O值得付出努力?
- 4. 值得努力学习D吗?
- 5. 我在Android应用帐单安全方面付出了多少努力?
- 6. 通过自定义结构对类型进行基本的.NET值类型校对:是否值得付出努力?
- 7. MVP for android。这是值得的努力?
- 8. 是值得努力的弹簧安全
- 9. Python努力获得方程来循环
- 10. 定制sprintf,值得付出吗?
- 11. 获得通过支付类型
- 12. 努力用NSNumber数据类型编辑NSMutableArray
- 13. 获得两个脚本共同努力
- 14. SQL Server 2005数据类型 - 努力获得使用当前数据类型的视图
- 15. 努力得到正确的xpath弹出图像
- 16. 努力将Maya模型变为Unity
- 17. 与Android一起使用Proguard值得付出吗?
- 18. 哪些开源的ASP.Net项目值得学习努力?
- 19. 我努力启用MySQLI
- 20. 努力用pip安装pygtk
- 21. 值得努力去尝试并覆盖DNN中的默认类别
- 22. 努力通过PHP了解JSON解析
- 23. 与普通的lisp库努力奋斗
- 24. 努力做出一个sql查询
- 25. 努力让日志文件输出PySpark
- 26. 努力打印出一个3d阵列
- 27. EF努力测试库抛出“TargetInvocationException”
- 28. 从Amazon RDS(MySql)迁移到Heroku Postgres需要付出多少努力?
- 29. 努力工作不
- 30. 努力学习Solr
关于泛型.NET和Java之间的区别的好处。 –