AOP。。。我应该放弃OOP吗?

AOP。。。我应该放弃OOP吗?,oop,aop,paradigms,Oop,Aop,Paradigms,我浏览了网上文档,阅读了维基条目,帖子和博客,但我仍然感到困惑 简而言之,什么是面向方面编程 它是否比面向对象编程更好?我应该放弃OOP吗 如果没有,我如何知道何时使用其中一个?两者的主要区别是什么 我能把一个重构成另一个吗 我一直是一个OO人,我想知道我是否需要犯叛国罪 说真的,我很快就要开始一个新项目了,我想在一开始就做出正确的选择。简而言之,什么是面向方面的编程? 简言之,AOP是一种将操作以不引人注目的方式注入到另一个程序的典型流中的能力。它允许您捕获类实例化、方法调用、赋值等 它是

我浏览了网上文档,阅读了维基条目,帖子和博客,但我仍然感到困惑

  • 简而言之,什么是面向方面编程
  • 它是否比面向对象编程更好?我应该放弃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进行重构


如果使用Java,请将Eclipse用于AOP,因为AJDT插件将非常有助于查看您在何处添加方面。

否,AOP是对OOP的补充,而不是取代它。AOP和OOP提供了不同类型的“粘合剂”,帮助您组合行为。当然,OOP允许您通过继承和组合等方式组合行为。另一方面,AOP允许您通过截取新代码在所选类的所选方法之前或之后运行的位置,将行为添加到地址


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

推荐阅读:

面向方面编程是插入操作的流行语(称为“建议”)在调用和返回等关键点插入方法或函数。我对AOP有一个很大的问题,因为它违反了语言中内置的所有抽象障碍。模块无法说“这是一个方面可以搞乱的,这是一个方面不能搞乱的。”因此,您可能会违反内部不变量,并破坏模块推理的原则(您可以理解一个模块,而不必理解它导入的其他模块的接口)

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


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

锤子比螺丝刀好吗?这取决于你想建造什么。我将建造一些大的,有很多零件的东西。我不知道(也可以)