像这里和全世界的大多数开发人员一样,多年来我一直在使用面向对象编程(OOP)技术开发软件系统。因此,当我读到面向方面编程(AOP)解决了许多传统OOP不能完全或直接解决的问题时,我停下来思考,这是真的吗?
我已经阅读了大量的信息,试图学习这个AOP范式的关键,我也在同样的地方,所以,我想更好地理解它在现实世界应用程序开发中的好处。
有人知道答案吗?
像这里和全世界的大多数开发人员一样,多年来我一直在使用面向对象编程(OOP)技术开发软件系统。因此,当我读到面向方面编程(AOP)解决了许多传统OOP不能完全或直接解决的问题时,我停下来思考,这是真的吗?
我已经阅读了大量的信息,试图学习这个AOP范式的关键,我也在同样的地方,所以,我想更好地理解它在现实世界应用程序开发中的好处。
有人知道答案吗?
当前回答
我认为这个问题没有通用的答案,但有一点需要注意,AOP并没有取代OOP,而是增加了某些分解特性,这些分解特性解决了所谓的主导组合(1)(或横切关注点)的暴政。
在某些情况下,只要您能够控制用于特定项目的工具和语言,它肯定会有所帮助,但它也增加了方面交互的复杂性,并且需要AJDT等其他工具来理解您的程序。
Gregor Kiczales曾经在谷歌Tech Talks上做了一个关于AOP的有趣的介绍性演讲,我推荐大家观看:面向方面的编程:模块化的根本研究。
其他回答
OOP和AOP不是相互排斥的。 AOP可以是OOP的一个很好的补充。 AOP特别便于向方法添加标准代码,如日志记录、性能跟踪等,而不会用标准代码阻塞方法代码。
AOP是处理这一概念的一种新的编程范式。方面是实现应用程序特定的非功能性部分的软件实体。
我认为这篇文章是开始面向方面编程的好地方: http://www.jaftalks.com/wp/index.php/introduction-to-aspect-oriented-programming/
首先,AOP不会取代OOP。AOP扩展了OOP。面向对象编程的思想和实践始终是相关的。拥有一个好的对象设计可能会使它更容易扩展到方面。
我认为AOP带来的思想是重要的。我们需要想办法在程序中不同的类上实现横切关注点,而不必改变类本身。但是我认为AOP最终会成为我们使用的其他工具的一部分,而不是一个单独的工具或技术。我们已经看到这种情况发生了。
一些动态语言(如Ruby和Python)具有像mixins这样的语言构造,可以解决相同的问题。这看起来很像AOP,但是更好地集成在语言中。
Spring和Castle以及其他一些依赖注入框架都有向它们注入的类添加行为的选项。这是一种执行运行时编织的方式,我认为它有很大的潜力。
我认为您不需要学习一个全新的范例来使用AOP。这些想法很有趣,但正在被现有的工具和语言慢慢吸收。只要保持了解并尝试这些工具。
OOP主要用来组织你的业务逻辑,而AOP帮助组织你的非功能性的东西,如审计、日志、事务管理、安全等。
通过这种方式,您可以将业务逻辑与非功能逻辑解耦,从而使代码更加清晰。
另一个优点是您可以非常一致地应用通知(例如审计),而不需要实现任何接口,这为修改提供了很大的灵活性,而不涉及业务逻辑。
这种方法很容易实现关注点分离和单一责任。
此外,当业务逻辑只解决业务问题时,很容易将业务逻辑从一个框架(比如Spring)移植到另一个框架(将来)
我认为这个问题没有通用的答案,但有一点需要注意,AOP并没有取代OOP,而是增加了某些分解特性,这些分解特性解决了所谓的主导组合(1)(或横切关注点)的暴政。
在某些情况下,只要您能够控制用于特定项目的工具和语言,它肯定会有所帮助,但它也增加了方面交互的复杂性,并且需要AJDT等其他工具来理解您的程序。
Gregor Kiczales曾经在谷歌Tech Talks上做了一个关于AOP的有趣的介绍性演讲,我推荐大家观看:面向方面的编程:模块化的根本研究。