14

我浏览了在线文档,阅读了 wiki 条目、帖子和博客,但我仍然感到困惑。

  • 简而言之,什么是面向方面的编程
  • 它比面向对象编程更好吗?我应该忘记 OOP 吗?
  • 如果没有,我怎么知道何时使用其中一个?两者的主要区别是什么?
  • 我可以将一个重构为另一个吗?

我一直是一个OO人,我想知道我是否需要叛国。

说真的,我很快就要开始一个新项目,我想在一开始就做出正确的选择。

4

5 回答 5

18

简而言之,什么是面向方面的编程?

简而言之,AOP 是一种将动作注入到另一个程序的典型流程中的能力,不显眼。它允许您捕获类实例化、方法调用、分配等。

它比面向对象编程更好吗?我应该忘记 OOP 吗?

不,也不。它与任何支持它的编程环境一起工作。(往上看)。

如果没有,我怎么知道何时使用其中一个?两者的主要区别是什么?

通常,当您想在数百个类上实现某种操作时,您会使用 AOP,而无需操作这些类本身。典型的例子是安全性(授权调用给定方法/类的权利)或日志记录。但是,根据我的经验,我不会为此使用它。(老实说,我根本不使用它)。

如上所述,主要区别并不存在,因为它们不具有可比性。但是,假设您想“正常”实现日志记录,您只需在适当的位置调用记录器:

log.write("hello");

但是使用 AOP,您可以创建一个附加到每个方法调用的“方面”,并记录“方法 b 调用”。关键是在 AOP 中,你的方法更像是“猎枪”:你附加到所有东西,或者只是一个小子集。手动添加日志记录通常更好。

我可以将一个重构为另一个吗?

不是很相关,请参阅其他答案。再次考虑到安全性,您可以从典型的 OOP 模型 this.IsAllowed() 切换到 AOP 模型,例如 if(callingMethod.HasAttribute(foo)){ allowed = true; }

希望这些答案有用。如果您希望我进一步扩展,请告诉我。

于 2009-08-25T00:04:48.603 回答
5

不,AOP 补充了 OOP,而不是取代它。AOP 和 OOP 提供了不同种类的“粘合剂”来​​帮助您组合行为。当然,OOP 允许您通过继承和组合等组合行为。另一方面,AOP 允许您添加行为以通过截取新代码在所选类的所选方法之前或之后运行的切点来解决横切关注点。

横切关注点的一些常见示例是:安全性、日志记录和事务控制。良好设计的基本原则是连贯性:理想情况下,一段代码应该只做一件事。因此,例如,将安全代码添加到数据访问类中会搅浑水。AOP 通过让您在“方面”中添加行为,然后将该方面应用于所有应该具有安全控制的类来解决该特定问题。

于 2009-08-25T00:13:03.517 回答
2

AOP 与 OOP 不同,完全不同的开发方法。

基本上,如果您有日志记录、身份验证问题、性能检查代码,那么在程序的各个部分、不同的类中,这些代码大致相同。因此,您可以按照您的设想,用 Java 编写应用程序,然后当您需要添加这些其他类型的代码(横切关注点)时,您只需将它们注入程序中,以便可以编译它们,但是当您查看源代码,您只会看到您需要的业务逻辑。

至于何时使用 AOP 或 OOP,我建议你编写程序,让它工作,然后当你让它运行时,看看删除实际上与函数无关但用于其他目的的代码。例如,如果您需要在使用输入参数之前检查它们是否正确,则为此使用方面。如果您有类似的事件处理,例如数据访问层中抛出的所有异常都写入日志文件,则为此创建一个方面。

当您消除这些横切关注点时,您的代码将变得更小。

随着您获得更多经验,您将看到 AOP 的更多用途,但最初我建议您编写它,然后使用 AOP 重构。

对于 AOP,如果使用 Java,请使用 Eclipse,因为 AJDT 插件对于查看您在哪里添加方面非常有用。

于 2009-08-25T00:09:18.170 回答
2

面向方面的编程是一个吸引人的流行语,用于在调用和返回等关键点将操作(称为“建议”)插入方法或函数中。我对 AOP 有一个大问题,因为它违反了语言中内置的所有抽象障碍。模块没有办法说“这是一个方面可以解决的问题,这是一个方面不能解决的问题”。结果,您冒着违反内部不变量的风险,并且破坏了模块化推理的原则(您可以理解一个模块,而无需理解它导入的其他模块的接口)。

几年前,Raymie Stata 写了一篇精彩的博士论文,关于面向对象语言如何控制子类化并防止它违反关键不变量。AOP 的相应工作尚未编写。

虽然与任何其他获得流行的想法一样,AOP 已经取得了一些惊人的成功(例如,将日志改进到设计时没有考虑到日志的应用程序),总的来说,我会敦促您将 AOP 的使用限制在非常简单的情况下. 或者更好的是,对面向方面的编程说不。

于 2009-08-25T01:08:52.323 回答
0

推荐阅读:Eclipse AspectJ:使用 AspectJ 和 Eclipse AspectJ 开发工具进行面向方面的编程

于 2009-08-25T00:19:14.257 回答