|
盒子资源分类 |
|
|
|
|
Delphi AOP(Aspect Oriented Programming) Frame - MeAOP v0.5 |
|
关键字:DelphiAOP Featrure Aspect Oriented Programming MeAOP 代码注入 |
来 自:原创 |
平 台:Win9x,Win2k/XP/NT,Win2003 |
下载所需:0 火柴 |
深浅度:高级 |
完成时间:2006/5/14 |
发布者:riceball |
发布时间:2006/5/14 |
编辑器:D7/D10 |
语 种:简体中文 |
分 类:对象 |
下载浏览:1320/16696 |
|
|
|
|
== 面向方面编程思想简介 == 面向方面编程,正确的理解应该说是面向功能的一种编程方法。它作为对象建模的辅助,目的就是为了重用功能: 1、将通用功能从不相关类之中分离出来; 2、能够使得很多类共享一个功能,一旦功能发生变化,不必修改很多类,只要修改这个功能就可以了。
因此,我认为老外的定义并不妥当,故,我这里将其称之为 Feature 而不是 Aspect,也许说成是 Featrure Oriented Programming 更为恰当。
在我看来,它实现的核心思想就是对类(对象)的方法的拦劫和注入。
我的 AOP For Delphi Frame 是基于代码注入,核心也就是黑客的技能,对原始代码进行注入替换——通过对过程方法注入代码完成对方法的拦截处理!我对基于动态代理(对对象类进行包裹)的AOP形式不敢兴趣,这样性能太低,而代码注入则是速度最快的解决方案,内存开销也比动态代理小多了。
我希望我的AOP架构简单高效并且易于使用。随便提一句,我把我的AOP叫做MeAOP.
在MeAOP中,你不必去想什么joint, advise, cross-cut 等等莫名的概念。你只需要知道功能这个概念, MeAOP的核心就是抽象出了定制功能类,你所做的开发就是围绕开发自己特有的功能类展开的。 你只要简单的调用 TMeCustomFeature 的类函数 AddTo 就可以将功能添加到你指定的类的方法上。 eg, <code> TMyFeature.AddTo(aClass, @aClass.aMethod, 'aMethod'). </code>
那么如何设计自己的功能类呢? 很简单,只需要在你的功能类中重载你需要拦截的位置的方法即可,如:BeforeExecute, AfterExecute 等等。 你的所有的功能类都应该从 TMeCustomFeature 派生.
注意:[Ver0.5] 现目前版本我只是实现了对于无参数的过程和方法(不包括有返回值函数)的支持。
<code> TMyFeature = class(TMeCustomFeature) protected {: 仅当返回为真才执行拦截的方法 MethodItem } { 如果你没有重载,它总是返回真.} function AllowExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem): Boolean;override; {: 在MethodItem被执行前被触发,发生在AllowExecute返回为真后 } procedure BeforeExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem);override; {: 在MethodItem被执行后被触发(即使MethodItem引发了异常也依然会被触发) } procedure AfterExecute(Sender: TObject; MethodItem: TMeInterceptedMethodItem);override; {: 执行MethodItem的过程中引发了异常后被触发。} procedure AfterException(Sender: TObject; MethodItem: TMeInterceptedMethodItem; E: Exception);override; end; </code>
=== MeAOP 架构 === 我的AOP 架构大致分为三层: 1.底层核心:过程方法注入器: 提供最简单最轻巧的注入器(一个注入器大约仅占内存36个字节) 2.中层核心:则是过程方法拦截器 2.1. 只支持无参数的过程方法拦截器 2.2. 支持带参数的过程方法拦截器 3.上层核心:提供面向功能的编程类库,最终实现能够将很容易将新的功能附加到指定类的方法上。 |
|
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们! |
相关文章 |
|
|
|
相关评论 |
|
共有评论26条
当前显示最后6条评论
|
ralf_jones |
2006/5/24 11:16:24 |
DELPHI现在走在MDA的路上,可能不会去特别打AOP和GP的大旗了.而且一般也会将MDA和AOP归到GP的下面,那么有MDA也就可以了,基本上都是基于代码生成的OO技术. 不知道为什么要骂人啊? 唉... |
wu_yanan2003 |
2006/5/25 21:06:34 |
加我聊聊吧,riceball。我专门研究网络,系统底层,和三层技术。 QQ:11718111, 注明:riceball 我掌握类似的技术及代码。最近准备用这个原理做一个AOP框架。目的是想实现DELPHI下三层真正技术。功能如下: 1.支持o/pmaping映射。 2.安全性,与业务无关的多种底层通信协议(http, tcp, udp等) 3.元数据代码生成工具。 4.远程调用采用动态代理技术,AOP技术。 5.类似于spring的框架简单实现。 6.客户端UI自动生成功能。 等等,如果有兴趣。呵呵。加我吧。
|
wu_yanan2003 |
2006/5/26 12:54:17 |
http://www.delphibbs.com/keylife/iblog_show.asp?xid=22250 基本原理,附简单代码实现。要想达到riceball 的实用程度,还需修改。 |
riceball |
2006/5/26 16:38:38 |
to ralf 唉,Delphi 的开发小组没有发挥它们的效力,可能和Borland公司管理层有关,所以要想能有高效(高速,占用内存下)的类库,只有自己写咯。 也是因此FastCode, FastMM,FastObj等等一系列为底层提速的Library才被Delphi Fans开发出来。这些本来应该是Delphi Team的工作。 举着MDA的大旗,就不管效率了?MDA(模型驱动技术)只是辅助生成源代码的手段而已。它再怎么牛,最终还是落实到底层类库上。 说起类的Model架构,就是气,看看后来Delphi Team写的WebService,一来就是Interface,SOAP,XML!它倒是一下满足需求了,可它也就只能干这个! 能卸能装,才是一个好的架构,就像工厂的车间生产标准化的零件,将不同的零件装配起来,就能够实现不同的功能。每个零件都能独立出来, 另作它用,这才是Delphi的精髓。 Delphi 的MDA我没有用过,我觉得MM就很好用,但是它的缺点就是不支持Object和条件编译令人烦恼。 我依稀记得 RemObjects 就是写了一个工具,用来自动生成远程方法的源代码。看得我想吐。
to wu_yanan 对,我在0.50版本用的就是这个技术手段: 1、保存方法的入口代码(5字节) 2、修改函数方法的入口代码为跳转到我的方法入口 3、执行我自己的处理 4、恢复原来方法的入口代码 5、执行原始的方法 7、再次修改函数方法的入口代码为跳转到我的方法入口 这种方式的缺陷就是无法支持多线程,因为拦截的过程根本无法重入! 所以在0.53版本我想到预先打洞的方式,来解决这个问题。 后来我又在0.54版本想到(就是这个周)一招,嘿嘿,不用打洞,也能重入了!!这下全部搞定!不过,注入器的大小增加到了64个字节, 幸好还是比TObject类占用的空间少(TObject至少占用了76个字节VMT)。 抱歉,我基本上很少上qq,除非是工作上的原因,时间紧阿。 有什么需要问的就问吧。对我来说技术不是问题,难的只是架构!
O/R map: 是数据库记录和对象的映射,开发BO对象我也有这个打算,我目前用的InstantObjects。 通信协议:我从来没有想过开发这个玩意,我只要我的零件能勾挂上我想用的通信协议类库就可以了(RealThinClientSDK, synapse, indy[越开发越忘记它的初衷被我枪毙了]) 安全性:我已经有了一个非常棒的Cipher 类库,我在此基础上开发了非对称加密算法RSA。 元数据代码生成工具: 似乎没有这个必要,不过在未来漫长的日子,也许我会考虑编写一个针对EXE文件的工具:用于静态编织(weave). 客户端UI自动生成功能:这个我从2004年开始就在构思中,但是还是我觉得我的构思还不是很完美,架构始终是最烦人的。Delphi RTTI信息太弱了!大部分都要靠自己。 Spring的框架: 你指的是哪一部分? Core(Bean Container)? AOP? ORM? DAO? Web? MVC? 它真就有这么好么?它的缺点和短处你都明白了? |
wu_yanan2003 |
2006/5/30 10:02:19 |
谢谢指教。 |
yeeler |
2007/2/10 9:02:27 |
说了这么多 演示代码是干嘛的啊,我是菜鸟, 学习中....... 惭愧 |
我要发表评论 |
查看全部评论 |
|
|
|
|