我浏览了在线文档,阅读了 wiki 条目、帖子和博客,但我仍然感到困惑。
- 简而言之,什么是面向方面的编程?
- 它比面向对象编程更好吗?我应该忘记 OOP 吗?
- 如果没有,我怎么知道何时使用其中一个?两者的主要区别是什么?
- 我可以将一个重构为另一个吗?
我一直是一个OO人,我想知道我是否需要叛国。
说真的,我很快就要开始一个新项目,我想在一开始就做出正确的选择。
简而言之,什么是面向方面的编程?
简而言之,AOP 是一种将动作注入到另一个程序的典型流程中的能力,不显眼。它允许您捕获类实例化、方法调用、分配等。
它比面向对象编程更好吗?我应该忘记 OOP 吗?
不,也不。它与任何支持它的编程环境一起工作。(往上看)。
如果没有,我怎么知道何时使用其中一个?两者的主要区别是什么?
通常,当您想在数百个类上实现某种操作时,您会使用 AOP,而无需操作这些类本身。典型的例子是安全性(授权调用给定方法/类的权利)或日志记录。但是,根据我的经验,我不会为此使用它。(老实说,我根本不使用它)。
如上所述,主要区别并不存在,因为它们不具有可比性。但是,假设您想“正常”实现日志记录,您只需在适当的位置调用记录器:
log.write("hello");
但是使用 AOP,您可以创建一个附加到每个方法调用的“方面”,并记录“方法 b 调用”。关键是在 AOP 中,你的方法更像是“猎枪”:你附加到所有东西,或者只是一个小子集。手动添加日志记录通常更好。
我可以将一个重构为另一个吗?
不是很相关,请参阅其他答案。再次考虑到安全性,您可以从典型的 OOP 模型 this.IsAllowed() 切换到 AOP 模型,例如 if(callingMethod.HasAttribute(foo)){ allowed = true; }
希望这些答案有用。如果您希望我进一步扩展,请告诉我。
AOP 与 OOP 不同,完全不同的开发方法。
基本上,如果您有日志记录、身份验证问题、性能检查代码,那么在程序的各个部分、不同的类中,这些代码大致相同。因此,您可以按照您的设想,用 Java 编写应用程序,然后当您需要添加这些其他类型的代码(横切关注点)时,您只需将它们注入程序中,以便可以编译它们,但是当您查看源代码,您只会看到您需要的业务逻辑。
至于何时使用 AOP 或 OOP,我建议你编写程序,让它工作,然后当你让它运行时,看看删除实际上与函数无关但用于其他目的的代码。例如,如果您需要在使用输入参数之前检查它们是否正确,则为此使用方面。如果您有类似的事件处理,例如数据访问层中抛出的所有异常都写入日志文件,则为此创建一个方面。
当您消除这些横切关注点时,您的代码将变得更小。
随着您获得更多经验,您将看到 AOP 的更多用途,但最初我建议您编写它,然后使用 AOP 重构。
对于 AOP,如果使用 Java,请使用 Eclipse,因为 AJDT 插件对于查看您在哪里添加方面非常有用。
面向方面的编程是一个吸引人的流行语,用于在调用和返回等关键点将操作(称为“建议”)插入方法或函数中。我对 AOP 有一个大问题,因为它违反了语言中内置的所有抽象障碍。模块没有办法说“这是一个方面可以解决的问题,这是一个方面不能解决的问题”。结果,您冒着违反内部不变量的风险,并且破坏了模块化推理的原则(您可以理解一个模块,而无需理解它导入的其他模块的接口)。
几年前,Raymie Stata 写了一篇精彩的博士论文,关于面向对象语言如何控制子类化并防止它违反关键不变量。AOP 的相应工作尚未编写。
虽然与任何其他获得流行的想法一样,AOP 已经取得了一些惊人的成功(例如,将日志改进到设计时没有考虑到日志的应用程序),总的来说,我会敦促您将 AOP 的使用限制在非常简单的情况下. 或者更好的是,对面向方面的编程说不。