Programming languages 面向方面编程的弱点?

Programming languages 面向方面编程的弱点?,programming-languages,aspectj,spring-aop,aop,Programming Languages,Aspectj,Spring Aop,Aop,面向方面编程有什么主要缺点吗?我喜欢通过限制对其方面中一个类的调用来减轻横切关注的想法。但对我来说,这有点奇怪 问题1。让我们以Logger类为例。每个类/方法可能需要调用Logger类的某些方法。在Logger方面中编写所有这些调用可以简化将来的修改。但是,谁应该维护记录器的方面?如果Logger类的开发人员这样做,他/她需要对整个项目有一个全局视图,我认为如果项目足够大,这是不可能的。另一方面,如果我们允许每个人修改记录器的类,那么将有太多人访问同一段代码。如果其中任何一个出错,代码就会失败

面向方面编程有什么主要缺点吗?我喜欢通过限制对其方面中一个类的调用来减轻横切关注的想法。但对我来说,这有点奇怪

问题1。让我们以Logger类为例。每个类/方法可能需要调用Logger类的某些方法。在Logger方面中编写所有这些调用可以简化将来的修改。但是,谁应该维护记录器的方面?如果Logger类的开发人员这样做,他/她需要对整个项目有一个全局视图,我认为如果项目足够大,这是不可能的。另一方面,如果我们允许每个人修改记录器的类,那么将有太多人访问同一段代码。如果其中任何一个出错,代码就会失败。那么,一般来说,谁应该维护这些方面呢

问题2。性能会有问题吗?我认为一个切入点就像注册一个事件侦听器。如果在运行时有太多的切入点,它会减慢程序的速度吗


谢谢,问题1

我认为这在很大程度上回答了这个问题:记录器方面与记录器类/实现不同。因此,虽然记录器实现可以存在于一些独立的单元中,这些单元确实执行日志记录任务,但任何日志记录方面都存在于应用程序的域中,它们可以在截取时延迟工作。因此,责任定位于应用方面的实体,这是很有意义的

问题2

性能将非常特定于实现,我不知道任何人是如何具体实现的,但在编译(或有效编译)的情况下,猜测将方面的行为有效地“注入”到适当的位置(或实现类似目的的事情)并不是不可行的因此,对性能的影响将是最小的

然而,将这一点考虑到解释语言中,您实际上是处于“事件侦听器”风格的开销中

弱点

我不是专家,但我会得出几个结论,并邀请任何补充:

  • 缺乏可见度。通过查看目标无法看到哪些方面正在影响它,这可能会导致调试困难,特别是在影响代码流的情况下。良好的IDE支持可能会缓解这一问题
  • 当方面被编译到代码中时,可能会产生更大的二进制文件,尽管我认为这可以忽略不计

希望这能有所帮助。

Hi@jstephenson,非常感谢您的及时回复。所以你的意思是,也许,对于调用Logger方法的每个类,他们都可以指定自己的Logger方面?嗨@jstephenson,AOP有什么主要的弱点吗?我添加了几个潜在的弱点,但可能还有更多(当然是哲学上的)-我建议使用谷歌的优缺点。我知道至少有一个AOP工具通过IDE插件具有良好的可见性:PostSharp/Visual Studio,但我不知道AspectJ/Spring是否存在类似的工具。@mgroves Spring IDE还能够指示建议哪些对象。