AOP ......我应该忘掉OOP吗?

Phi*_*ere 14 oop paradigms aop

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

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

我一直是一个OO男人,我想知道我是否需要犯叛国罪.

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

Noo*_*ilk 18

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

简而言之,AOP能够以不显眼的方式将动作注入另一个程序的典型流程中.它允许您捕获类实例,方法调用,赋值等.

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

不,不.它与支持它的任何编程环境一起使用.(往上看).

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

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

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

log.write("hello");
Run Code Online (Sandbox Code Playgroud)

但是使用AOP,您可以创建一个附加到每个方法调用的"方面",并记录"方法b调用".关键在于,在AOP中你的方法更像是"霰弹枪":你附加到一切,或者只是一小部分.手动添加日志记录通常更好.

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

不太相关,请参阅其他答案.再次使用安全性,您可以从典型的OOP模型交换到AOP模型this.IsAllowed()到if(callingMethod.HasAttribute(foo)){allowed = true; }

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


non*_*ont 5

不,AOP补充OOP,而不是取代OOP.AOP和OOP提供不同类型的"粘合剂",以帮助您组合行为.当然,OOP允许您通过继承和组合等组合行为.另一方面,AOP允许您通过拦截新代码在所选类的所选方法之前或之后运行的点切割来添加行为以解决横切问题.

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