像这里和全世界的大多数开发人员一样,多年来我一直在使用面向对象编程(OOP)技术开发软件系统。因此,当我读到面向方面编程(AOP)解决了许多传统OOP不能完全或直接解决的问题时,我停下来思考,这是真的吗?

我已经阅读了大量的信息,试图学习这个AOP范式的关键,我也在同样的地方,所以,我想更好地理解它在现实世界应用程序开发中的好处。

有人知道答案吗?


当前回答

面向方面的编程提供了实现横切关注点(如日志记录、安全性)的好方法。 这些横切关注点是必须应用于许多地方的逻辑片段,但实际上与业务逻辑没有任何关系。

你不应该把AOP看作是OOP的替代品,而应该看作是OOP的一个不错的附加 使您的代码更加干净、松散耦合并专注于业务逻辑。

因此,通过应用AOP,您将获得两个主要好处:

每个关注点的逻辑现在都在一个地方,而不是分散在整个代码库中。 类更简洁,因为它们只包含主要关注点(或核心功能)的代码,次要关注点已经转移到方面。

其他回答

首先,AOP不会取代OOP。AOP扩展了OOP。面向对象编程的思想和实践始终是相关的。拥有一个好的对象设计可能会使它更容易扩展到方面。

我认为AOP带来的思想是重要的。我们需要想办法在程序中不同的类上实现横切关注点,而不必改变类本身。但是我认为AOP最终会成为我们使用的其他工具的一部分,而不是一个单独的工具或技术。我们已经看到这种情况发生了。

一些动态语言(如Ruby和Python)具有像mixins这样的语言构造,可以解决相同的问题。这看起来很像AOP,但是更好地集成在语言中。

Spring和Castle以及其他一些依赖注入框架都有向它们注入的类添加行为的选项。这是一种执行运行时编织的方式,我认为它有很大的潜力。

我认为您不需要学习一个全新的范例来使用AOP。这些想法很有趣,但正在被现有的工具和语言慢慢吸收。只要保持了解并尝试这些工具。

我认为这个问题没有通用的答案,但有一点需要注意,AOP并没有取代OOP,而是增加了某些分解特性,这些分解特性解决了所谓的主导组合(1)(或横切关注点)的暴政。

在某些情况下,只要您能够控制用于特定项目的工具和语言,它肯定会有所帮助,但它也增加了方面交互的复杂性,并且需要AJDT等其他工具来理解您的程序。

Gregor Kiczales曾经在谷歌Tech Talks上做了一个关于AOP的有趣的介绍性演讲,我推荐大家观看:面向方面的编程:模块化的根本研究。

OOP主要用来组织你的业务逻辑,而AOP帮助组织你的非功能性的东西,如审计、日志、事务管理、安全等。

通过这种方式,您可以将业务逻辑与非功能逻辑解耦,从而使代码更加清晰。

另一个优点是您可以非常一致地应用通知(例如审计),而不需要实现任何接口,这为修改提供了很大的灵活性,而不涉及业务逻辑。

这种方法很容易实现关注点分离和单一责任。

此外,当业务逻辑只解决业务问题时,很容易将业务逻辑从一个框架(比如Spring)移植到另一个框架(将来)

AOP是处理这一概念的一种新的编程范式。方面是实现应用程序特定的非功能性部分的软件实体。

我认为这篇文章是开始面向方面编程的好地方: http://www.jaftalks.com/wp/index.php/introduction-to-aspect-oriented-programming/

面向方面的编程提供了实现横切关注点(如日志记录、安全性)的好方法。 这些横切关注点是必须应用于许多地方的逻辑片段,但实际上与业务逻辑没有任何关系。

你不应该把AOP看作是OOP的替代品,而应该看作是OOP的一个不错的附加 使您的代码更加干净、松散耦合并专注于业务逻辑。

因此,通过应用AOP,您将获得两个主要好处:

每个关注点的逻辑现在都在一个地方,而不是分散在整个代码库中。 类更简洁,因为它们只包含主要关注点(或核心功能)的代码,次要关注点已经转移到方面。