手机站
网通分站
电信主站
密 码:
用户名:
热门关键字:  虚拟主机  cn域名  域名注册  非法  seo
当前位置 : 主页>程序设计>Java技术>列表

面向方面的编程:它的好处是什么?

来源:互联网 作者:west263.com 时间:2008-02-23 点击:
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

图4: 具体的跟踪方面

图5所示的是来自于运行实例部分的输出结果。注意:输出结果打印关于每一个对象的信息。这是每一个对象的toString程序的一部分。既然myClasses切入点公布对象到建议,那么建议就可以轻易地增加关于对象的信息。

图5: 跟踪结果举例

使用AOP方法进行跟踪比在需要的地方人工的插入跟踪代码有以下几条好处。

  • 你只需要在一个(两个方面)地方放置你所有代码需要的用于跟踪的功能。
  • 插入和删除跟踪代码是很容易的。你可以轻易地从构建配置中删除方面。
  • 在任何你需要的地方跟踪代码,即使你增加了新的方法到目标类。这可以消除人为的错误。同时你知道所有跟踪代码被删除了,并且当你从构建配置中删除方面时不会忽略任何东西。
  • 你有一个可重复使用的方面,它可以被应用和升级。

契约式设计或防御性编程

Bertrand Meyer介绍了契约式设计的概念。4这个原理声称一个类的设计者和这个类的使用者,共同分享关于类的实现的假设。合同包括不变量,先决条件和后置条件。契约式设计让类的设计者专注于实现了类的功能性的逻辑,而不用担心实参的有效性。当然,前提是合同规定了实参的先决条件。契约式设计避免了额外的编码并提高了性能,只要所有的客户都遵守契约。

当你为了广泛的使用而建立程序库时,你可能不能做关于实参有效性的假设,并且使用于你的程序中。你需要在继续进行每一个程序的逻辑之前检查实参。这是一个防御编程的实例。你假设任何可以发生错误的东西都可能会发生错误,并且你可以完美地解决它。

让我们说你们正要去使用简单状态程序并使它为公共所用时。你想要保证所有坐标在第一Euclidean象限——也就是说,x和y坐标是非负的。这是一个有效的约束,使得所有点都可以在一个窗口坐标中很好地表示出来,因为大多数视窗系统都将左上角的点作为(0, 0),并且x坐标增加是向右,在你向下移时y坐标增加。为了你的内部需要,你要使用契约式设计进而来使用类,因为你已经在你的组织中控制开发人员。当你将它向外界的客户公布时,你要检查实参并且如果实参无效,你要给出一个例外。方面提供了一个一流的方法来实现它,这正是你要求实现的东西。

我们将建立一个方面来检查公共程序中的所有实参。我们要做的第一件事就是构造切入点。我们将使用来自于先前实例的myClass切入点,并增加切入点来选择需要检查实参的构造方法,并且距离程序保证了它没有调用无效值。图6所示的是我们需要的一套切入点。注意:第二个切入点规定了切入点的目标是TwoDShape的一个实例。这意味着在这样一个对象中这个切入点只会选择对距离程序的调用。

图6: 用于检查实参的切入点

最后,我们需要合适的通知。为了简单,当遇到一个无效的实参时,我们要打印一个信息并将实际值变为0,在构造方法方面,当一个无效值被通过时,忽略对距离的调用。图7所示的是这两个通知条目。

图7: 实参检查建议

当我们试图执行下列语句时:

Circle c3 = new Circle(3.0,2.0,-2.0);

c1.distance(null>);

在我们的程序中,我们得到如下的输出结果:

Negative argument encountered at: execution(tracing.Circle(double, double, 

	double)) All arguments changed to 0.0

Null value given to distance at: 

	call(double tracing.Circle.distance(TwoDShape))

我们可以通过显示准确的行数值和原始文件名称来做更多的有关错误信息的工作,但是这个实例显示的是基本的技术。

在一个大的项目中,你有很多类并暴露少数的一些接口,你可以使用用于方面的一个单独的目录来组织你的编码,进而实现实参的检查。我可以想象组织方面的几种方法,它们可以被很容易地识别和维护。当你为内部使用而构建系统时,你将使用一个内部的构建配置,并且当你为外部使用而构建它时,你将使用一个包含方面的配置。Eclipse AJDT使得新构建配置的创建变得简单。

方面和设计模式

对于好的编程来说,设计模式已经变成了 常用的方式。AOP可以给我们一种改进已经存在的模式和发现新模式的方法。实际上,横切关注点代码的注入,就是一种类型的模式。当前,一些研究人员正在评价使用AOP方法的设计模式的实现。英国哥伦比亚大学的Jan Hannemann一直在研究这个主题来作为他的哲学博士研究的一部分。他的主页,还有实现“四人帮”模式的代码下载位于:http://www.cs.ubc.ca/~jan/AODPs/上。5同样,Nicholas Lesiecki为IBM developerWorks写了关于方面和设计模式的文章。6查阅他的文章能得到比我这里提供的更详细的讨论。

让我们来看一个非常简单的关于如何实现一个标准设计模式的实例,它就是用AspectJ语言写的Adapter模式。

图8显示的是Adapter模式的一个Unified Modeling Language(UML)图。在这个模式中,客户需要一个服务并要为它设置一个请求。可能有很多服务的提供者,并且他们中的每一个可能对于服务有一个不同的名称,或者另外一些非标准要求是服务请求者所必须遵守的。好的面向对象的设计建议我们要将服务请求整合到一个目标接口中,在这个接口上编程,并建立一个适配器。要作为一个媒介在客户和服务之间工作(图表中的Adaptee),这就是必需的。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名
注册