当前位置:首页 > 网络编程 > 软件语言 > DELPHI > 在Delphi中应用AOP实现日志功能

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

点击次数:62 次 发布日期:2008-11-09 08:44:51 作者:源代码网
源代码网推荐
广告载入中
  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中,如果能在执行事件之前和之后执行我想要的动作是不是就可以解决了?

源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华