面向切面编程的弱点?

4

面向切面编程有哪些主要弱点?我喜欢通过将对一个类的调用限制在其方面内来缓解横切关注点的想法。但对我来说,这有点奇怪。

问题1. 我们以Logger类为例。每个类/方法可能需要调用Logger类的某些方法。将所有这些调用写在Logger方面内可以使未来的修改更加容易。然而,谁应该维护Logger的方面?如果Logger类的开发者这么做,他/她需要全局了解整个项目,如果项目足够大,这似乎是不可能的。另一方面,如果我们允许每个人修改Logger类,那么会有太多人访问同一段代码。如果其中任何人犯了错误,代码就会失败。因此,通常由谁来维护方面呢?

问题2. 性能会成为问题吗?我认为一个切入点就像注册一个事件监听器。如果运行时有太多切入点,程序会变慢吗?

谢谢,

1个回答

6

问题1

我认为这在很大程度上回答了问题:Logger方面不同于Logger类/实现。因此,虽然Logger实现可以存在于某些独立的单元中,确实执行记录日志的任务,但任何记录日志方面都存在于您的应用程序域中,并且它们可以在其拦截器中推迟工作。因此,责任被局限于应用该方面的实体,这是很有道理的。

问题2

或许感兴趣。

性能将非常特定于实现,我不知道任何人如何做到这一点,但猜测在编译(或有效编译)的情况下,可以有效地将方面的行为“注入”到适当的位置(或事物以达到类似的目的),因此性能损失将是最小的。但是,在解释语言中,您实际上确实处于“事件侦听器”样式的开销中。

弱点

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

  • 缺乏可见性。无法通过查看目标来看到哪些方面正在影响它,可能会导致调试困难-特别是如果影响了代码流程。良好的IDE支持可以缓解此问题。
  • 当方面编译到代码中时,可能会导致更大的二进制文件,尽管我想象这是可以忽略不计的。

希望这有所帮助。


嗨 @jstephenson,非常感谢您的及时回复。所以您的意思是,也许每个调用Logger方法的类都可以指定自己的Logger方面? - Geni
嗨@jstephenson,AOP有什么主要的弱点吗? - Geni
1
我已经添加了一些潜在的弱点,但可能还有更多(从哲学上讲)- 我建议在Google上搜索优缺点来了解更多。 - jstephenson
1
我知道至少有一种AOP工具可以通过IDE插件进行良好的可视化:PostSharp/Visual Studio,但我不知道是否存在类似的AspectJ/Spring工具。 - Matthew Groves
1
@mgroves Spring IDE还能指示哪些对象被建议使用。 - tobsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接