搜狐首页-新闻-体育-娱乐-财经-IT-汽车-房产-家居-女人-TV-ChinaRen-邮件-博客-BBS-搜狗 

数码天下 > 网狐学园-全中国人的电脑学习中心 > 程序开发-网狐学园 > 程序设计其他
日志记录 封装的变化之封装对象创建的变化
时间:2006年03月07日09:41 我来说两句(0)  

 
来源:天极网】 【作者:wayfare



25亿像素的大照片
P2P视频下载60%为情色
两大浏览器龙虎争霸
最佳创意产品NuLOOQ
迅雷存在严重DDOS漏洞
Windows的环保卫士
Vista和XP响应速度相近 用注册表砌安全墙
插件让IE向Maxthon看齐 把摄像头变3D扫描器
搜狐数字艺术博客大赛 低端显卡Aero亦流畅
搜狗拼音输入法 | 暴风影音 | WinRAR | FlashGet | 瑞星卡卡 | Firefox | Picasa
搜狗工具条 | ACDSee | Maxthon | Internet Explorer | Windows Live Messenger

  考虑一个日志记录工具。目前需要提供一个方便的日志API,使得客户可以轻松地完成日志的记录。该日志要求被记录到指定的文本文件中,记录的内容属于字符串类型,其值由客户提供。我们可以非常容易地定义一个日志对象:

public class Log
{
 public void Write(string target, string log)
 {
  //实现内容;
 }
}

  当客户需要调用日志的功能时,可以创建日志对象,完成日志的记录:

Log log = new Log();
log.Write(“error.log”, “log”);

  然而随着日志记录的频繁使用,有关日志的文件越来越多,日志的查询与管理也变得越不方便。此时,客户提出,需要改变日志的记录方式,将日志内容写入到指定的数据表中。显然,如果仍然按照前面的设计,具有较大的局限性。 现在我们回到设计之初,想象一下对于日志API的设计,需要考虑到这样的变化吗?这里存在两种设计理念,即渐进的设计和计划的设计。从本例来分析,要求设计者在设计初就考虑到日志记录方式在未来的可能变化,并不容易。
再者,如果在最开始就考虑全面的设计,会产生设计上的冗余。因此,采用计划的设计固然具有一定的前瞻性,但一方面对设计者的要求过高,同时也会产生一些缺陷。那么,采用渐进的设计时,遇到需求变化时,利用重构的方法,改进现有的设计,又需要考虑未来的再一次变化吗?这是一个见仁见智的问题。对于本例而言,我们完全可以直接修改Write()方法,接受一个类型判断的参数,从而解决此问题。但这样的设计,自然要担负因为未来可能的再一次变化,而导致代码大量修改的危险,例如,我们要求日志记录到指定的Xml文件中。

  所以,变化是完全可能的。在时间和技术能力允许的情况下,我更倾向于将变化对设计带来的影响降低到最低。此时,我们需要封装变化。

  在封装变化之前,我们需要弄清楚究竟是什么发生了变化?从需求看,是日志记录的方式发生了变化。从这个概念分析,可能会导致两种不同的结果。一种情形是,我们将日志记录的方式视为一种行为,确切的说,是用户的一种请求。另一种情形则从对象的角度来分析,我们将各种方式的日志看作不同的对象,它们调用接口相同的行为,区别仅在于创建的是不同的对象。前者需要我们封装“用户请求的变化”,而后者需要我们封装“日志对象创建的变化”。

  封装“用户请求的变化”,在这里就是封装日志记录可能的变化。也就是说,我们需要把日志记录行为抽象为一个单独的接口,然后才分别定义不同的实现。如图一所示:

change01.jpg 

图一:封装日志记录行为的变化

  如果熟悉设计模式,可以看到图一所表示的结构正是Command模式的体现。由于我们对日志记录行为进行了接口抽象,用户就可以自由地扩展日志记录的方式,只需要实现ILog接口即可。至于Log对象,则存在与ILog接口的弱依赖关系:

public class Log
{
 private ILog log;
 public Log(ILog log)
 {
  this.log = log;
 }
 public void Write(string target, string logValue)
 {
  log.Execute(target, logValue);
 }
}

  我们也可以通过封装“日志对象创建的变化”实现日志API的可扩展性。在这种情况下,日志会根据记录方式的不同,被定义为不同的对象。当我们需要记录日志时,就创建相应的日志对象,然后调用该对象的Write()方法,实现日志的记录。此时,可能会发生变化的是需要创建的日志对象,那么要封装这种变化,就可以定义一个抽象的工厂类,专门负责日志对象的创建,如图二所示:

change02.jpg 

图二:封装日志对象创建的变化

  图二是Factory Method模式的体现,由抽象类LogFactory专门负责Log对象的创建。如果用户需要记录相应的日志,例如要求日志记录到数据库,需要先创建具体的LogFactory对象:

LogFactory factory = new DBLogFactory();

  当在应用程序中,需要记录日志,那么再通过LogFactory对象来获取新的Log对象:

Log log = factory.Create();
log.Write(“ErrorLog”, “log”);

  如果用户需要改变日志记录的方式为文本文件时,仅需要修改LogFactory对象的创建即可:

LogFactory factory = new TxtFileLogFactory();

  为了更好地理解“封装对象创建的变化”,我们再来看一个例子。假如,我们需要设计一个数据库组件,它能够访问微软的Sql Server数据库。根据ADO.Net的知识,我们需要使用如下的对象:SqlConnection, SqlCommand, SqlDataAdapter等。

  如果仅就Sql Server而言,在访问数据库时,我们可以直接创建这些对象:

SqlConnection connection = new SqlConnection(strConnection);
SqlCommand command = new SqlCommand(connection);
SqlDataAdapter adapter = new SqlDataAdapter();

  如果在一个数据库组件中,充斥着如上的语句,显然是不合理的。它充满了僵化的坏味道,一旦要求支持其他数据库时,原有的设计就需要彻底的修改,这为扩展带来了困难。


[1][2][下一页]

(责任编辑:luwei)



共找到 2,280,562 个相关新闻.

我来说两句 全部跟贴(0条) 精华区(0条) 辩论区(0条)

用户:  匿名发表:  隐藏地址:


设为辩论话题      


精彩图片新闻


激情四溢沙滩宝贝


数码公社专栏

相关链接





搜狐短信 小灵通 性感丽人 言语传情
三星图铃专区
[周杰伦] 千里之外
[誓 言] 求佛
[王力宏] 大城小爱
[王心凌] 花的嫁纱
精品专题推荐
短信企业通秀百变功能
浪漫情怀一起漫步音乐
同城约会今夜告别寂寞
敢来挑战你的球技吗?
 精彩生活 

星座运势 每日财运
花边新闻 魔鬼辞典
情感测试 生活笑话


今日运程如何?财运、事业运、桃花运,给你详细道来!!!





菊花台
迷迭香
青青河边草
丁香花
原来你也在这里
爱如空气
不要再来伤害我

公社热图


·北美惊现若干神秘UFO/图
·范冰冰真空写真露点[图]
·传说中国内第一美女车模


频道精彩推荐

·2006年全国两会专题
·菲律宾再次暴发兵变
·德国世界杯 奥运会
·奥斯卡金像奖 馒头血案
·别克君越发布 购车指南
·AMD与英特尔的双核之争
·2006日内瓦车展
·NBA F1 刘翔 国足
·两会:三农、新农村建设
·人民币升值压力增大






不怕不怕
吉祥三宝
桃花朵朵开
千里之外
大城小爱
梁祝
迷糊娃娃可爱粉红卡通
四季美眉给你最想要的

news
搜狐分类 ·搜狐招商


创意就是这么简单
女星豪乳尺码大曝光
·现场抓拍明星着透视装
·芙蓉二代横空出世
·央视女主持辞职拍艳照
·徐若瑄15岁全裸写真曝光
·拍摄:娱乐圈性交易过程
·抓拍模特海滩宽衣解带
·外国女生流行拍的艺术照
·台湾十大波霸照片大比拼
·网络美女全裸人体摄影
·范冰冰终于还是脱了

推荐企业
2006年世界电信展 诺基亚 瑞星 联想 摩托罗拉 三星 清华紫光 金山 索尼爱立信 索尼
给编辑写信



设置首页 - 搜狗输入法 - 支付中心 - 搜狐招聘 - 广告服务 - 客服中心 - 联系方式 - 保护隐私权 - About SOHU - 公司介绍 - 全部新闻 - 全部博文
Copyright © 2018 Sohu.com Inc. All Rights Reserved. 搜狐公司 版权所有
搜狐不良信息举报邮箱:jubao@contact.sohu.com