注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 数据库 > Delphi 内容正文:在Delphi中应用AOP实现日志功能

在Delphi中应用AOP实现日志功能

发布时间:2006-07-29 09:25:20 来源:blog 网友评论 0 条
  AOP现在很火,网上有这许多支持AOP的框架,对于Delphi来说同样也有MeAOP。不过觉得这些框架太复杂了。

  现在有一个系统,基本上都快结束了,整体上当然是没有采用什么AOP的框架。对于这样的系统能否用上AOP的一点点好处呢?

  项目组提出在现有的系统上加入日志记录的需求。大家一起来看看我是怎么来实现这个功能的吧。

  AOP简要说明

  根据网上对AOP的解释,它具有下面的特征:

  1、将通用功能从不相关类之中分离出来;
  
  2、能够使得很多类共享一个功能,一旦功能发生变化,不必修改很多类,只要修改这个功能就可以了。
  
  AOP的核心在于保持横切关注点的分离。

  日志功能

  这是一个比较典型的MIS系统,现在编码基本结束。不过某个开发人员接到了一个繁琐又看上去没什么技术含量的任务——实现日志功能。这个开发者就是本人了。

  虽然没什么难度,但还是设计一下吧,谁让我是一个自诩为高水平的程序员呢。



  一个设计图就这么做出来了。其中设计一个接口ILog来封装日志实现的细节。模块甲乙丙只需要使用接口ILog就可以。满足了XXX面向对象的设计原则。太完美了!

  泡杯茶,然后开始写代码实现这个简单而庞大的任务。
 
  开始编码了!

  TLog,ILog实现比较简单,在此略去不谈。稍微修改一下以前模块的代码,将ILog接口传入每一个模块中。

  接下来只需要实现日志功能的调用就可以了。

  模块甲:

procedure TModule1.acAction1Execute(Sender: TObject);
begin
……
Flog.LogCommand(“模块甲 操作一”);
end;

procedure TModule1.acAction2Execute(Sender: TObject);
begin
……
Flog.LogCommand(“模块甲 操作二”);
end;

  模块乙:

procedure TModule2.acAction1Execute(Sender: TObject);
begin
……
Flog.LogCommand(“模块乙 操作一”);
end;

  就这样,写了大约二十几个地方,突然觉得自己太可悲了,作为一个高科技人才就干这种体力活吗?
 
  坏味道的出现
 
  在许许多多的地方都出现了Flog.LogCommand这样的函数调用,正是这些函数调用让我崩溃,在这么做下去估计我撑不到周末了。

  “CV大法”已经让我觉得羞愧加恼怒,系统中到处出现了这样的重复代码。

  无奈之中,我耷拉着脑袋走到一个同事桌前。

  “嘿,救救我吧,我想解脱”

  “怎么回事?”同事善意地问道。

  “事情是这样子的……”

  通过了一番讨论,我们一致认为这个应该用AOP的思想来解决。但怎样在Delphi中来实现AOP呢,修改整个程序框架是不可能的,我们只能在现有的基础上做。

  正当我们要放弃的时候,突然想到了一个突破点:日志中记录的功能在程序实现的时候全部使用Action组件来做的,是否可以考虑在Action上面做文章呢?

  曙光啊,曙光!

  解决方式——瞒天过海

  通俗点理解AOP,就是将一段代码统一“插入”某一类地方。但像Delphi这样的语言是很难实现“插入”代码的这一功能。不过我们可以通过事件机制来实现同样的效果。

  Action的执行代码都写在事件OnExecute中,如果能在执行事件之前和之后执行我想要的动作是不是就可以解决了?

procedure TModule1.acAction1Execute(Sender: TObject);
begin
// do something
end;

procedure TActionHook.RegisterAction(Action: TAction);
begin
// 记录Action与原始的OnExecute事件
FActionList.Add(Action);
SetLength(FActionEvents, Length(FActionEvents) + 1);
FActionEvents[High(FActionEvents)] := Action.OnExecute;
// 瞒天过海,偷换事件
Action.OnExecute := HookActionExecute;
end;

procedure TActionHook.HookActionExecute(ASender: TObject);
begin
DoBeforeActionExecute(TAction(ASender));
// 触发原始事件
FActionEvents[FActionList.IndexOf(ASender)](ASender);
DoAfterActionExecute(TAction(ASender));
end;

procedure TActionHook.DoAfterActionExecute(Action: TAction);
begin
// 所有的Action执行完毕后调用此处
FLog.LogCommand(Action.Caption);
end;

  相关的UML图如下:


  采用这样的方式后,很明显我们不需要将日志相关代码分散到系统的各个地方,只需要在一个统一的地方将所有Form上的Action组件注册到TActionHook中就可以了。

  扩展思考

  在Delphi中可以通过事件的机制实现代码注入技术,当然同样在其他支持事件的语言中也可以实现。相比之下这种方法实现AOP比较简单,并且不需要在系统的整体结构上作什么调整,完全通过语言层面支持。

  例子中针对Action的组件来处理日志功能,将TActionHook扩展之后可以将其他的控件操作也通过这套机制记录到日志中。

  很多同行们都埋怨自己做的是体力活,没什么技术含量。同样在刚开始的时候,我也认为这个任务是体力活,但是如果我们能勤于思考新的解决方法,体力活绝对能够变为技术活。只有这样才能不辜负“高科技”这个美誉啊。

  上面介绍的方法肯定不是最好的,这次拿出来和大家分享,一方面是将自己的经验献给需要的朋友,另外也特别希望大家能给一点好的建议,一起交流,共同学习。
相关文章
  • 用DELPHI在状态栏中显示进程条
  • 用Delphi实现24位真彩色图标
  • 用Delphi开发视频聊天软件
  • Delphi快速入门(二)
  • Delphi快速入门(一)
【评论】【收藏本文】【打印】【关闭】
上一篇文章:在DBGrid组件中显示和编辑MEMO字段
下一篇文章:Delphi中为TreeView添加单选和复选框
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • Delphi快速入门(七)
  • Delphi面向对象的编程方法(六)
  • Delphi面向对象的编程方法(二)
  • 程序界面设计模式慨述
  • 全面剖析Delphi 2006新增特性
  • Delphi面向对象的编程方法(七)
  • Oracle平台应用数据库系统的设计与开发
  • 用DELPHI在状态栏中显示进程条
  • NoahWeb实现表格多行多列
  • Delphi文本编辑器的设计(一)
阅读排行
  • 1.全面剖析Delphi 2006新增特性
  • 2.用Delphi开发视频聊天软件
  • 3.用Win32 API枚举应用程序窗口和进程
  • 4.软件的架构与设计模式之什么是架构
  • 5.软件的架构与设计模式之模式的种类
  • 6.Delphi中为TreeView添加单选和复选框
  • 7.用Delphi实现24位真彩色图标
  • 8.VS.NET2005 Beta2初体验之感受2005
  • 9.程序界面设计模式慨述
  • 10.没落的奇迹 谁会买下Delphi?
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载