什么是面向切面编程?

16

重复:

什么是面向切面编程(AOP)?

每当我听到有关它的播客或阅读有关它的博客文章时,即使在这里,他们也让它听起来像弦理论之类的东西。 最好的描述它的方式是带有依赖注入的面向对象编程吗?

每当有人试图解释它时,就会出现诸如"方面"(Aspects)、[成人的花生漫画声音]、正交(Orthogonal)、[更多噪音]、横跨性问题(cross-cutting concerns)等。 真的没有人能用通俗易懂的语言描述它吗?


已经有很好的回答了:https://dev59.com/iXVC5IYBdhLWcg3wnCWA - Kev
我更喜欢在这里得到的答案。是的,本质上是同一个问题,但请注意答案的不同之处。 - Charles Graham
好的,那么我将这些答案复制到原始问题中以保证完整性,这也是它们应该去的地方。常见问题解答清楚地说明:“在提问之前,请先四处查看是否已经有人问过(甚至可能已经得到了答案)。” - paxdiablo
5个回答

34
简单来说,让我举个例子。假设你有一个Web应用程序,需要添加错误日志记录/审计。一种实现方法是进入每个公共方法并添加try catch块等等...
而面向切面编程则可以在不改变原始代码的情况下,注入一个新的方法来增强功能。例如,系统可能会调用LoggingHandler.CallMethod()来替代YourClass.UpdateModel()方法。这个方法会将调用重定向到UpdateModel(),但同时也包装了一个try catch块来处理日志记录错误。
关键在于,这种重定向是自动完成的,可以通过配置或将属性应用于方法来实现。
它适用于跨领域的常见编程元素,如日志记录、审计、事务管理和授权等。
其思想是将所有通用的基础设施代码从业务/应用层中移除,使您可以专注于解决问题,而不必担心记录此方法调用或那个方法调用。

有没有商业或开源系统的例子可以提供这样的功能,无论是作为附加组件还是内置的? - dkretz
我记得多年前在《Dr. Dobbs》上读到过这个,但我从未见过其他的进展。 - dkretz
有一个叫做Postsharp的东西可以在编译时实现这个功能。此外,我认为Castle也支持AOP。另一个选择是使用标准的.NET工具,但这很昂贵。你需要看一下ContextBound对象。 - JoshBerke
Java Spring框架支持AOP。 - Jesse Nelson

10

.NET 中的类和方法属性是面向方面编程的一种形式。您可以使用属性对类/方法进行装饰。在幕后,这会向您的类/方法添加代码,执行属性的特定功能。例如,将类标记为可序列化,可以使其自动序列化以便存储或传输到另一个系统。其他属性可能会将某些属性标记为不可序列化,并且这些属性将自动从序列化对象中省略。序列化是一个方面,由系统中的其他代码实现,并通过应用“配置”属性(装饰)将其应用于您的类。


2

AOP是关于管理应用程序中的共同功能的,这些功能跨越整个应用程序,因此是横切面的。目的是将它们从业务逻辑中分离出来。

这些横切面关注点的一些例子包括日志记录、安全管理、事务管理等。

框架可以在一些配置文件的帮助下自动进行管理。


1

我目前使用Post Sharp,并从他们的网站上阅读相关信息。我使用它来提供方法调用的安全性。

"PostSharp是一个用于分析和转换.NET程序集的开放平台。它配备了PostSharp Laos,这是一个强大而简单的插件,让您开发自定义属性,实际上添加了代码行为。PostSharp Laos是.NET Framework的领先面向方面编程(AOP)解决方案。"


调试器或分析器是否可以被归类为面向方面编程? - dkretz

1
经典的例子是安全和日志记录。与其在应用程序中编写代码来记录x的发生或检查对象z的安全访问控制,不如使用一种语言构造“超出”正常代码的方式,可以系统地将安全性或日志记录注入到没有本地支持它们的例程中,以便即使您的代码没有提供它,也会得到处理。
更具体的例子是操作系统为文件提供访问控制。软件程序不需要检查访问限制,因为底层系统会为其完成这项工作。
如果您认为需要AOP,根据我的经验,实际上您需要投入更多时间和精力来适当地管理系统中的元数据,并专注于经过深思熟虑的结构/系统设计。

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