首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AOP是否能更好地解决某些问题?

使用AOP是否能更好地解决某些问题?
EN

Software Engineering用户
提问于 2010-11-16 03:43:48
回答 3查看 4.2K关注 0票数 22

我遇到了面向方面编程的想法,我对它有一些关注。

基本的思想似乎是,我们想要采取横切的关注点,但没有很好的模块化使用对象和模块化。这一切都很好。

但是AOP的实现似乎是从模块外部修改代码的实现。因此,例如,可以编写一个方面,以更改在将特定对象作为函数中的参数传递时发生的情况。这似乎直接违背了模块的思想。我不应该能够从模块外部修改模块的行为,否则模块的全部功能就会被推翻。但是各个方面似乎都在这样做!

基本上,方面似乎是代码修补的一种形式。它可能对一些快速的黑客有用;但是,作为一般的原则,也许这不是你想要做的事情。在我看来,面向方面的编程似乎是一种糟糕的实践,并且提高到了一个一般的设计原则。

AOP是一个很好的实践吗?使用AOP是否能更好地解决某些编程问题?

EN

回答 3

Software Engineering用户

发布于 2010-11-16 05:08:55

面向方面的编程使完成某些类型的编程成为可能,如果不将代码不必要地分散到应用程序或库中,这些代码与软件的主要功能(即横切关注点)无关。示例包括:

  1. 测井与监测
  2. 性能分析
  3. 调试和跟踪
  4. 撤消功能
  5. 输入和产出的验证
  6. 改变现有对象的行为
  7. 对象过滤器
  8. 安全实现
  9. 管理事务

通过将这种横切关注点限制在应用程序的单个部分,然后通过属性、方法调用拦截或动态代理在代码中引用这些特性,您就允许对横切行为进行封装;这具有所有优点(即,一个修改点),封装将在应用程序中的任何其他地方提供。

这里的关键点是,AOP封装了整个应用程序中常见的行为,以及应用程序主要功能的外围功能。

票数 21
EN

Software Engineering用户

发布于 2013-08-17 07:18:11

进入游戏后期,但我提供给以后的开发人员,他们可能会遇到这个问题。

如果您的应用程序依赖于AOP来正确操作,我强烈建议您不要使用AOP。各方面的工作方式如下:

  • 通知(附加行为)应用于
  • 连接点(可以附加额外代码的地方,例如方法的开始或结束,或给定的事件触发时间)
  • ..。切入点(检测给定连接点是否匹配的模式)模式匹配的地方

对于那些已经做了很长时间的计算机的人来说,使用模式的事实可能是值得仔细观察的。下面是一个与名为set的方法匹配的切入点示例,而不管参数是什么:

代码语言:javascript
复制
call(* set(..))

因此,这是一个相当广泛的切点,应该很清楚,谨慎处理这个问题是建议的(不是双关语),因为您正在将建议应用于许多事情。

或者见鬼,让我们把建议应用到每件事上,不管名字或签名!

代码语言:javascript
复制
execution(* *(..))

所以很明显,我们应该小心,因为这里有很多功能,但这不是反对方面的论点--这是一个谨慎的论点,因为这里有很多力量,模式匹配很容易出错(只需点击您最喜欢的aop bug搜索引擎,就可以玩得开心)。

以下是一个相对安全的切点:

代码语言:javascript
复制
pointcut setter(): target(Point) &&
                   ( call(void setX(int)) ||
                     call(void setY(int)) );

如果在一个setX对象上找到名为setYPoint的方法,它将显式地提供建议。这些方法只能接收ints,它们必须是void。看起来很安全对吧?如果存在这些方法,并且您已经应用了正确的建议,那么这是安全的。如果没有,那就太糟糕了;它默默地失败了。

举个例子,一个朋友试图调试一个Java应用程序,在这个应用程序中,每个人都会时不时地返回不正确的数据。这是一个罕见的失败,似乎与任何特定事件或数据无关。这是一个线程错误,是众所周知的很难测试或检测的东西。事实证明,他们使用方面来锁定方法并使它们“线程安全”,但是程序员重命名了一个方法,一个切入点无法匹配它,从而导致应用程序的无声破坏。

因此,我告诉人们,如果他们必须使用AOP,就像对待例外一样:在设计良好的系统中,如果没有出错,可以删除它们,软件仍然可以正常工作。但是,如果程序的功能依赖于AOP,则会给程序带来不合理的脆弱性。

因此,日志记录、调试和跟踪是很好的行为示例,对于方面来说是完美的,但安全性呢?不是的。线程安全?不是的。

有关AOP的健壮替代方案,请参阅特征。它们不是被栓在语言上,而是直接集成到语言中,不需要“特性感知的”IDE (尽管它可以帮助),并且在不存在所需方法的情况下会出现编译时失败。特性在处理关注点分离方面做得更干净,因为问题从一开始就有了更好的定义。我广泛地使用它们,它们非常棒。

票数 9
EN

Software Engineering用户

发布于 2010-11-16 04:58:57

AOP可能是唯一既体面又实用的解决方案的一种情况是,当您无法访问源代码时。要使用陈旧的日志记录横切关注点的例子:

假设您希望在您使用的第三方库中记录控制流。您自己的代码完全由日志语句组成。但是,对于这个库,您没有源代码,因此不可能添加日志语句。因为您确实有字节码,所以AOP允许您对第三方库进行测试。

而且,如果您无论如何都要创建一个日志方面,那么您也可以考虑使用AOP实现日志记录,这样您自己的代码也会出现问题。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/19244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档