First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 2960 评论 :: 298 Trackbacks

2004年9月13日 #

     摘要: SharpICTCLAS 1.0 发布了,修正了测试版的几处错误。  阅读全文
posted @ 2007-04-18 15:52 吕震宇 阅读(7965) | 评论 (66)编辑

     摘要: SharpICTCLAS(测试版)发布了!  阅读全文
posted @ 2007-03-15 12:52 吕震宇 阅读(14611) | 评论 (39)编辑

具体内容请访问我的文章:

SharpICTCLAS分词系统简介(7)OptimumSegment

SharpICTCLAS分词系统简介(8)其它

===全文完===

非常高兴在这最后一篇文章写完之时得到了张华平老师的授权。我会尽可能快的将SharpICTCLAS源文件放上来供大家测试使用的。

posted @ 2007-03-14 23:19 吕震宇 阅读(3699) | 评论 (6)编辑

具体内容请访问我的文章

SharpICTCLAS分词系统简介(6)Segment

posted @ 2007-03-13 22:38 吕震宇 阅读(3141) | 评论 (1)编辑

具体内容请访问我的文章

SharpICTCLAS分词系统简介(5)NShortPath-2

posted @ 2007-03-12 22:44 吕震宇 阅读(3563) | 评论 (3)编辑

具体内容请访问我的文章

SharpICTCLAS分词系统简介(4)NShortPath-1

posted @ 2007-03-09 22:51 吕震宇 阅读(3644) | 评论 (1)编辑

具体内容请访问我的文章

SharpICTCLAS分词系统简介(3)DynamicArray

posted @ 2007-03-09 09:02 吕震宇 阅读(3653) | 评论 (0)编辑

具体内容请访问我的文章

SharpICTCLAS分词系统简介(1)读取词典库

SharpICTCLAS分词系统简介(2)初步分词

posted @ 2007-03-08 14:36 吕震宇 阅读(3976) | 评论 (2)编辑

在研究了一段时间中科院计算所张华平、刘群所开发的ICTCLAS分词系统(Free版)代码后,阅读了大量的相关资料,我开始着手将C++的ICTCLAS分词系统移植到.net平台下,并取得了较好的实验结果。这种移植并不容易,在研究了ICTCLAS分词理论的同时还要阅读C++代码实现,其中遇到了很多困惑、迷茫,也不得不重写了一小部分代码,我将在随后的文章中介绍具体实现。

目前除了最后的词性标注部分还没有完全完工外,其它部分已经接近尾声(包括初始切分、N最短路径、人名、地名的识别以及最终优化等)。

部分分词结果以及移植思路请访问我的文章:《实现ICTCLAS到C#平台的移植

posted @ 2007-03-07 22:45 吕震宇 阅读(3924) | 评论 (9)编辑

上篇文章《天书般的ICTCLAS分词系统代码(一)》 说了说ICTCLAS分词系统有些代码让人无所适从,需要好一番努力才能弄明白究竟是怎么回事。尽管有很多人支持应当写简单、清晰的代码,但也有人持不同意见。主要集中在(1)如果效率高,代码复杂点也行; (2)只要注释写得好就行;(3)软件关键在思路(这我同意),就好像买了一台电脑,不管包装箱内的电脑本身怎么,一群人偏在死扣那个外面透明胶带帖歪了(这我坚决不同意,因为只有好思路出不来好电脑,好电脑还要性能稳定,即插即用的好硬件;另外天书般的代码不仅仅是透明胶带 贴歪的问题,他甚至可能意味着电脑中的绝缘胶带失效了...)。

这两天在抓紧学习ICTCLAS分词系统的思路的同时,也在消化学习它的代码实现,然而我看到的代码已经不仅仅是为了效率牺牲代码清晰度的问题了,我看到的是连作者都不知道自己真正想要做什么了......

更多内容请参考我的文章《天书般的ICTCLAS分词系统代码(二)

posted @ 2007-02-26 13:34 吕震宇 阅读(3010) | 评论 (4)编辑

ICTCLAS分词系统是由中科院计算所的张华平、刘群所开发的一套获得广泛好评的分词系统,该版的Free版开放了源代码,为初学者提供了宝贵的学习材料。

然而在我阅读代码的过程中,越来越对ICTCLAS天书般的代码感到厌烦。我不得不佩服中科院计算所的人思维缜密,头脑清晰,能写出滴水不漏而又让那些“头脑简单”的人百思不得其解的代码。将一件本来很简单的事情做得无比复杂...

更多内容请参考我的文章《天书般的ICTCLAS分词系统代码(一)

posted @ 2007-02-21 00:29 吕震宇 阅读(3776) | 评论 (10)编辑

     摘要: 为了今后随笔中所带的代码更具特色一些,特给代码格式来个“Copy Code”功能,允许直接将代码内容拷贝到剪贴板上。大家可以试一试。目前至少支持IE和FireFox两种浏览器的访问。  阅读全文
posted @ 2007-02-08 10:09 吕震宇 阅读(4733) | 评论 (14)编辑

最近阅读了黄忠成的Object Builder系列文章感到受益匪浅,所以将该系列文章整理了一番(将繁体转换为简体,另外对于一些习惯用法进行了调整,对文章及代码格式重新进行了调整,修订了文中几处小错误),现放上来供大家参考。

[转][黄忠成]Object Builder Application Block (1)
[转][黄忠成]Object Builder Application Block (2)
[转][黄忠成]Object Builder Application Block (3)
[转][黄忠成]Object Builder Application Block (4)

~~~~~~~~~~~~~~~~~~~~~~~~~~~

另外受这一系列文章的启迪,目前正在构思几篇新文章,初步题目定为《创建对象的方法及其应用》。目前文章用到的代码调试已经完成了大半,如果有时间我会开始着手文章写作工作。基本内容分以下几部分:

  • 1、CreateOjbWithNew

使用new命令完成对象的创建。(既然是一个系列,缺少此部分就不完整了)

  • 2、CentralizeObjCreation2Factory

针对接口编程(使主程序依赖于公共接口与工厂)

集中对象的创建(出现问题好找)

问题(仍然摆脱不了工厂对其它对象的依赖,仅仅实现了创建对象的集中管理而已)

  • 3、IndependentFactoryModel

使用Assemby以及CreateInstance方法创建对象,实现了工厂与产品间解耦。

  • 4、AddinSample

案例分析,使用上面模型实现一个插件结构的应用程序。该程序运行机制仿照SharpDevelop(当然是大大简化了)的AddinTree结构,只要在Addins目录下存放的文件会被自动的Pickup并容入主界面。

  • 5、BeforeDependencyInjection

为了后面的案例做准备工作。在没有Dependency Injection框架时,自己手工创建对象。

  • 6、DependencyInjectionWithConfig

自己实现的一个“依赖注入”框架(非常简单,纯粹演示目的),使用配置文件指导对象创建工作。

  • 7、DependencyInjection与Ioc

通过上面两个例子我们了解了什么是依赖注入,可为什么依赖注入为什么最开始叫做控制反转呢?本段内容揭示其中的联系以及“容器”这个概念的特殊含义。

  • 8、ObjectBuilder

可以将ObjectBuilder理解成一个智能加工工场,根据用户的不同订单策略在流水线上加工各种对象。该部分内容对ObjectBuilder做一个宏观的介绍。先将文中一张图放上来:

  • 9、TranslatorSampleUsingOB

对OB的一个实际应用案例。模拟TechEd英文会场,参会人员可根据需要选择不同的翻译服务,充分享受"容器"以及"依赖注入"的强大功能,系统借助ObjectBuilder实现。

 

posted @ 2007-02-06 11:25 吕震宇 阅读(4648) | 评论 (18)编辑

大家好!好久没有在园子里面写点什么了,感觉好像欠了一屁股的债似的。放假了,整理了点东西先放上来,希望对大家有用!

~~~~~~~~~~~~~~~~~~~~

文章内容为本人在《数据库原理》课程中的一个课堂案例,幻灯片提供的动画演示有助于理解并发控制的本质,文章内容为幻灯片的摘要及部分代码。

1、下载本文所对应的幻灯片; 2、下载本文对应的VS2005代码

如果你对自己并发控制的能力很有自信的话,读完“一、问题提出”后直接可以跳转到“四、看来问题真不简单”处阅读。

本文最后给出了部分测试用代码的简单讲解。

阅读全文请访问我的文章:《数据库并发一致性案例分析

posted @ 2007-01-29 15:43 吕震宇 阅读(3562) | 评论 (25)编辑

文中所有内容均代表本人对问题的理解,可能与实际有所差别!文中C语言代码的调试环境为MyTc 5.4.1,C#代码调试环境为VS.NET 2003。

为什么VB.net的Shared(共享)方法在C#中叫Static(静态)? 这个问题看起来很愚蠢,但是透彻的了解它确需要掌握面向对象程序设计语言中深层次、本质上的内容。本文将通过以下几个层面的分析深入剖析隐藏在Shared与Static背后的究竟是什么。

    一、C#中的Static方法为什么在VB.net中叫Shared方法

    二、VB.net中的Shared方法为什么在C#中叫Static方法

    三、实例方法及其实现

    四、为什么实例方法不能叫动态方法?

另外本题目仅仅是个引子,本文除了讨论静态外,同时还要更多的讨论"动态"方法(Object Method或Instance Method),并试图揭示面向对象的本质。

感兴趣可以访问我的文章《为什么VB.net的Shared(共享)方法在C#中叫Static(静态)?》。

posted @ 2006-04-26 00:42 吕震宇 阅读(3756) | 评论 (3)编辑

前几天一个学生问了一个关于接口的问题,程序代码如下:

using System ;
interface IControl 
{
   void Paint();
}
public class EditBox: IControl 
{
   void IControl.Paint() 
   {
      Console.WriteLine("IControl.Pain method is called!");
   }
}
class Test 
{
   static void Main() 
   {
      EditBox editbox = new EditBox(); 
      editbox.Paint();
   }
}

程序在编译时报错,错误信息如下:

“EditBox”并不包含对“Paint”的定义

EditBox明明实现了IControl接口,而又为什么说Paint方法没有定义呢?由于问题比较复杂,所以特写了篇文章介绍C#中的接口。感兴趣可以访问我的文章《C#中的接口

posted @ 2006-04-17 23:58 吕震宇 阅读(3753) | 评论 (12)编辑

第2章 并发操作的一致性问题 (2)》已经全部完成,又添加了RepeatableRead以及Serializable两种隔离模式的分析以及后台锁定机制研究,感兴趣可以阅读一下。

posted @ 2006-02-16 22:01 吕震宇 阅读(3115) | 评论 (1)编辑

数据库应用基础系列》好长时间没有更新了,上次说到并发操作的一致性问题只说到50%,这后50%一隔就是半年。假期终于抽出点时间,看看上次写的代码,居然是2005年8月的事了。这次将并发一致问题的后半部分争取尽快补全。

这次放上来的是并发操作中并发一致的问题表现、封锁协议、事务隔离以及使用SQL Server 2000 + ADO.NET演示的ReadUnCommitted与ReadCommitted的区别。文中深入讨论了后台的锁机制。目前此部分工作已经完成。有关RepeatableRead以及幻影读的解决办法随后也会添加进去。对此感兴趣的可以访问我的文章《第2章 并发操作的一致性问题 (2)

posted @ 2006-02-14 15:52 吕震宇 阅读(3566) | 评论 (0)编辑

笔迹鉴别的最后一部分内容,放到了我的文章区,请访问《笔迹鉴别(5) —— 笔迹判别》。

posted @ 2006-02-07 10:58 吕震宇 阅读(3131) | 评论 (0)编辑

放到了我的文章区,请访问《笔迹鉴别(4) —— Gabor变换(2)》。

posted @ 2006-02-06 11:02 吕震宇 阅读(2699) | 评论 (0)编辑

放到了我的文章区,请访问《笔迹鉴别(3) —— Gabor变换(1)》。

posted @ 2006-02-05 20:38 吕震宇 阅读(2745) | 评论 (1)编辑

放到了我的文章区,请访问《笔迹鉴别(2) —— 纹理制作》。

posted @ 2006-02-05 11:33 吕震宇 阅读(2600) | 评论 (0)编辑

几年思索、徘徊、彷徨后,还是准备放弃已经学了很多、下了很多功夫的程序开发方向,潜下心准备读完拖了好几年的计算机应用专业的同等学力研究生。

二零零五年对于我是不寻常的一年,这一年发生了很多事,从无所事事的年初(给爷爷八十大寿制作了一张Flash盘和一张DVD盘,边学边做,效果还算不错,但不能算是正事),到被逼无奈考研(同等学力那种,从2002年开始上课,可自己一直觉得研究生没什么,一直到2005年,全国统考仅仅通过了英语,专业课一点没看。迫于外界强大压力,从三月中旬到五月底,自己从头自学了《离散数学》《组合数学》《计算机系统结构》等几门课程,没想到居然以60分成绩通过了综合考试,可以参加毕业设计和毕业答辩了,实属万幸),然后紧接着就是喜得贵子(儿子6月份出生,给我添了不少乐趣,也增加了不少负担,几个月下来基本上都是围着他转了),10月份从导师那里拿到毕业设计题目“笔迹鉴别”对于我又是一个不小的打击(从前认为研究生不过尔尔的看法不攻自破,自己才发现业已学习了很久的程序开发技术在这个毕业设计面前显得如此无力,面对导师推荐的一大堆参考书中复杂的数学公式懊悔不已,后悔自己没有早上正途。亡羊补牢,为时不晚,下定决心即使是同等学力研究生——让人看不起的那种,也要做出个样子来)。2005年的倒数第二天,八十五岁的奶奶平静的离我们而去,我从小跟奶奶的感情非常深,她走了对我是一个沉重的打击,我真的非常想念奶奶。

我尽可能在有限时间内将我的毕业论文做好,虽然没有什么创新的地方,但毕竟做下来了,而且实验结果很成功。以往做数字图像处理和模式识别的人多用C++来开发,而此次我全部使用的是C#语言,这也从一个侧面展示了C#强大的功能。为此,我在文章分类中特意增加了一个分类“笔迹鉴别”,随后将此次设计中用到的关键技术、关键代码放上来,以供大家参考。

做设计的这几个月一直没有在博客园发表什么文章,尽管在这里发表.net开发的笔迹鉴别程序似乎有些不入主流,还是恳请各位批评指正。我会在随后一段时间内在我文章“笔迹鉴别”分类中将关键的东西放上来。

笔迹鉴别(1) —— 实现步骤概述

笔迹鉴别(2) —— 纹理制作

笔迹鉴别(3) —— Gabor变换(1)

笔迹鉴别(4) —— Gabor变换(2)

笔迹鉴别(5) —— 笔迹判别

=== 全文完 ===

posted @ 2006-02-03 16:08 吕震宇 阅读(2608) | 评论 (9)编辑

这学期教ASP.NET,期末考试试题中有这样一道题:

使用RangeValidator控件验证TextBox控件输入的数据是在0到150之间的整数,需要设置该控件的MaximumValue属性值为【    】, MinimumValue属性值为【    】......

有些学生如此回答:

MaximumValue:【0】 ;MinimumValue:【150】。

如果说这些学生不知道什么是Max,什么是Min的话,还有一部分学生如此回答:

MaximumValue:【2004-10-1】 ;MinimumValue:【2004-10-7】。

天啊!我真的不是一个好老师。

posted @ 2006-02-03 15:04 吕震宇 阅读(2798) | 评论 (23)编辑

这是一张拍自我家小区门口的照片,由于有一辆汽车阻挡,没能将所有文字都拍下来,其实完整的内容是"北大青鸟软件工程师培训,高薪、尊贵、一生无忧的选择"。这张横幅已经在这里挂了近一年的时间了。我无意评论北大青鸟软件工程师的培训究竟如何,只想就"高薪、尊贵、一生无忧的选择"谈谈想法。

我是一名计算机教师,我的任务就是教授程序设计语言、数据库技术,培养学生对计算机知识的兴趣,然而昨天与一个学生的对话却让我再也抑制不住埋在内心里的情绪,去揭露隐藏在计算机华丽外衣之下的漂亮的真实的谎言。

这两年,计算机培训可以说是比比皆是。程序员培训、软件工程师培训、软件认证的广告充斥了大街小巷;很多国际大公司纷纷与高校联合,力争将培训认证课程融入计算机教学体系;更有很多培训机构甚至打出"就业"牌,包找工作、包就业。我们暂且不谈包就业,就说说他们用到的宣传词"高薪"、"尊贵"、"白领"等等就足以让很多计算机软件开发的门外汉们怦然心动。我曾经见到很多培训机构定制的两年、三年计划,任何人看了后都会相信"高薪"与自己只有咫尺之遥。就连给我家擦油烟机的人,当得知我是教计算机的后也表示几年后自己体力跟不上的时候就去转行做程序员。

我不排除有很多人通过这种途径找到了理想的工作,但我怀疑这些人中很多人最初就有很好的功底。我在高校教书多年,大学本科4年的时间都不足以将每个学生都打造成"尊贵"的程序员,何况集中授课的短短时间呢?我的怀疑来自以下方面:

1、究竟有百分之多少的人能够在任何形式计算机培训后"一生无忧"?又有百分之多少的人能够"高薪"呢?从我对高校大学生计算机学习的经验上估计,这个数字恐怕要在5%甚至更少。

2、计算机发展太快了,即使任何一个培训中心实现三年打造高薪白领程序员,恐怕三年后的计算机早就不是三年前的模样了。

3、经过短、平、快出来的程序员真的能够承担程序开发重任吗?还是一座空中楼阁?没有扎实的基础知识,单单靠写代码混口饭吃的日子不会长久的。

昨天,一个学生对我说"咱们信息管理与信息系统专业的学生什么都不行,我又不想考研,看来唯一的出路就是去做程序员了"。这让我很是气愤。至少我认为管理信息的学生深入学习"用友"、"金碟"ERP,然后到企业中去实施、维护也比单纯走编程这条路要好。作为一名程序开发人员,所要学习的何止是那些培训中定制的内容,要远比这个多得多。成为一名优秀的开发人员不比考研容易多少。

这让我联想到一件事情:我从小成长在一个小县城里,当初中毕业时,很多我和很多同学一样面临考中专还是考高中。在我们县里,只有最优秀的学生才能够考上中专,并且当时在人们眼里,上中专的学生是最优秀的学生,早毕业、早上班、早挣钱,尤其是可以到父母单位里工作,有人罩着,真可谓"一生无忧"了。当时我已经拿到了中专的录取通知,后来没去,在人家都开课了好几天后,我上了高中。现在看来,我虽然晚拿了四年的工资,但并不后悔。其中缘由不言而喻。

培训广告中过分的浮夸造成了有关程序员生活的真实谎言,在这里我奉劝很多朋友不要过分沉迷于谎言造就的云端,飘飘然起来。一定要脚踏实地,从根基做起,不断努力提升自己的认知层次,软件是一种工具,程序员做的工作是创造工具,在我们为创造工具而感到骄傲和自豪的同时千万不要忘了工具是用来干什么的。不要被眼前一些华而不实的宣传所吸引,环顾四周,也许你能找到更好的选择。

写这篇文章的目的:

(1)比尔盖茨辍学成就了微软帝国,但今非昔比。我实在不忍心看到很多“精英”过度沉迷于计算机,以至丢弃了学业。有很多大学生计算机很有灵性,甚至早把ASP.NET 2.0学的烂熟(我做不到),可英语四级还没有通过,其它课程一塌糊涂,我感到很惋惜。

(2)有些学生在“没有出路”的情况下投奔了程序开发,我更不赞同。不管有人爱听不爱听,我认为学好程序开发有很大一部分取决于天赋(我说的“天赋”是指对计算机无比的兴趣和百折不挠的精神),单纯相信一些广告宣传是徒劳无功的。

(3)一个有“天赋”的人在学好基础后再深入学习程序开发仍然能赶得上。一个没有“天赋”的人就算舍弃一切学习程序开发也可能失败得很惨。因此,就象道器所说“培养起勤恳、踏实、好学、有恒的品质才是保证他们的人生能够步步向上的根本”,我非常赞同。

posted @ 2005-11-05 20:46 吕震宇 阅读(7005) | 评论 (88)编辑

TechEd2005上得到一张SQL Server 2005 Beta3光盘,并且里面有一个虚拟机和教程可以供使用者学习,只有30天期限,现在正在抓紧学习。今天要说的是一个SQL Server 2005编辑器Bug,如下:

首先启动SQL Server Management Studio,选择File | New | Database Engine Query(或是从Project中创建一个Query),向里面输入一多行SQL命令并存盘,入下图:

从图中可以看到左侧出现绿色线,表示已更改并存盘。现在将最后一行若干个字符用鼠标选中,然后按Del键删除,左侧变成黄色线,表示该行已经发生编辑,如图:

然后让我们按下键盘的“Ctrl+Z”,撤销刚才的修改,被删除的字符再次出现,但左侧标志线却出现了异常,第1、2行左侧的绿线没有了!

我在Visual Studio .net 2005 Beta2中用C#程序做同样的编辑操作(注意:一定要一条命令多行书写!),左侧标志线也会出现类似问题。我想应当是编辑器的问题。

posted @ 2005-10-04 11:22 吕震宇 阅读(2127) | 评论 (4)编辑

在TechEd2005中学习C# 2.0新特性时看到??运算符,表示从左向右取第一个不为空的值。这让我联想到Ruby中“||=”运算符的使用:

session[:cart] ||= Cart.new

This method is fairly tricky. It uses Ruby’s conditional assignment operator, ||=. If the session hash has a value corresponding to the key :cart, that value is returned immediately. Otherwise a new cart object is created and assigned to the session. This new cart is then returned.(该段内容引自《Agile Web Development with Rails》一书)

感觉C#2.0中的??运算符很象Ruby的这种用法,但仍然需要进一步改进。刚刚在虚拟机器上装了.net 2005和SQL 2005,有时间深入挖掘一下C# 2.0。

在idior的一篇文章中还曾经讲过C# 2.0模拟Closures的问题,这里不在重复了。等回去后再考证一番。

posted @ 2005-09-24 17:42 吕震宇 阅读(1393) | 评论 (1)编辑

不知道是否很多人在做网页时一直以IE为标准,最近我在学习《Agile Web Development with Rails》时,当案例做到store时却发现IE莫名其妙的出现了异常,当鼠标移动到Add To Cart超级链接上后,旁边的图片莫名其妙的被截去一截!最开始怀疑是CSS出现了问题,但使用FireFox访问同样网页却没有类似问题发生。在其示例CSS文件中有这样一段内容:

/* === Use the Holly Hack to fix layout bugs in IE on Windows === */
/* Hide from IE-mac \*/
* html .catalogentry { height:1%; }
/* End hide from IE-mac */

尽管该fix并没有解决IE显示问题,但顺着线索却发现原来IE在对CSS样式解析上存在如此多的bug!提醒大家在做项目时不要只认为IE就是最好的,并唯一以其为标准。

如果想了解更多信息,可以访问Positiong Is Everything网站:http://www.positioniseverything.net/

简体中文Positiong Is Everything:http://www.onestab.net/a/pie/

另外推荐一篇文章《How To Attack An Internet Explorer (Win) Display Bug

posted @ 2005-09-19 22:30 吕震宇 阅读(2111) | 评论 (11)编辑

奇怪的问题,我在写Blog时,超级链接内容为:<A href="http://www.cnblogs.com/zhenyulu/articles/233966.html"> ,可以保存后,却发现成了<A href="http://www.cnblogs.com/zhenyulu/zhenyulu/articles/233966.html">,甚至一度出现<A href="http://www.cnblogs.com/zhenyulu/zhenyulu/zhenyulu/zhenyulu/articles/233966.html">。而且有些时候成为<A href="http://zhenyulu.cnblogs.com/zhenyulu/zhenyulu/articles/233966.html">。有的链接可以正常访问,有的链接(比如文件下载)就无法正常访问。不知为什么?

posted @ 2005-09-12 09:18 吕震宇 阅读(2355) | 评论 (10)编辑

在上篇随笔《文章预告:你真的了解Ioc与AOP吗?》中已经做了半天广告了,这里就不再多说什么。文章内容比较长,所以分成了五个部分。最好顺序阅读,前后连带关系比较强。欢迎大家多提宝贵意见!

本系列的全部源代码及二进制文件可以从这里下载:IocInCSharp.rar

你真的了解Ioc与AOP吗?(1)

你真的了解Ioc与AOP吗?(2)

你真的了解Ioc与AOP吗?(3)

你真的了解Ioc与AOP吗?(4)

你真的了解Ioc与AOP吗?(5)

posted @ 2005-09-10 23:29 吕震宇 阅读(4443) | 评论 (8)编辑

呵呵,这年头为了挣点点击率,居然做起广告来了,羞愧...

言归正传,现在Ioc与AOP在Java阵营早就炒的沸沸扬扬,但在.net中似乎仍然升温不够。尽管在大名鼎鼎的Martin网站上有专门的Ioc中文版文章,但给人的感觉就是--简单。通过构造函数或Setter注入的实现方式总给人一种“不屑”的感觉,甚至很多人觉得我早就用Ioc了,只是Martin给了名罢了。网上更是有人在说其实.net早在2000年设计的IComponent就应用了Ioc技术。

但是,你真的了解Ioc的强大威力吗?恐怕不多。Ioc又能为我们带来什么呢?《你真的了解Ioc与AOP吗?》将试图通过一个循序渐进的例子展示Ioc的强大威力。

现在编码工作基本完成,文章正在写作中。一共有6个案例,分别是:(1)类之间的依赖;(2)接口依赖;(3)基于配置文件和Reflection的工厂模式;(4)使用Spring.net实现Ioc;(5)Romoting;(6)利用Ioc在不动一行代码的情况下实现Remoting。

现在将编译好的最后一个案例放上来,可以在这里下载:Ioc.rar

解压缩后有3个目录:Server、Client、WithoutRemoting。首先运行Server目录下的RemotingServer.exe,然后运行Client目录下的MainApp.exe进行远程调用。系统通过Remoting完成远程调用。关闭所有程序后,进入到WithoutRemoting目录,里面有个Readme.txt文件,按照操作步骤将文件:

..\Server\HelloGenerator.dll
..\Client\MainApp.exe
..\Client\ICommon.dll
..\Client\SayHello.dll
..\Client\Spring.Core.dll
..\Client\log4net.dll

拷贝到该目录,再次运行MainApp.exe,你会发前它是一个地地道道的本地应用程序!本地与远程唯一的区别就是配置文件的不同以及增加了几个其它的DLL!这就是Ioc的魅力!所有源代码和详细说明随后放上来。

注:本示例程序中使用的Spring.net版本为:“Spring.NET-20050815-0137”,并对Spring.Services组件中的Remoting部分做了微小调整,删除了代码中用于输出的部分命令。

posted @ 2005-09-09 11:45 吕震宇 阅读(3055) | 评论 (23)编辑

posted @ 2005-08-30 19:53 吕震宇 阅读(2703) | 评论 (14)编辑

刚开始学习计算机,往往陷入一种对“语言光环”的追求中,程序员所使用的语言似乎就是罩在头上的光环,但现在这个“光环”却阻碍了对知识的追求和认知。Java里面包含了太多的“亮点”,这些“亮点”在.net中是没有或很难达到的(NHibernate、Spring.net多少让人有点心酸)。我下决心开始深入研究一下Java技术,亡羊补牢,为时不晚。只有踏上Java这艘船,才能了解真正的技术内涵。从.net角度看Java总有一种雾里看花的感觉。

BTW:我不会放弃.net的。

posted @ 2005-08-24 14:21 吕震宇 阅读(1732) | 评论 (7)编辑

我最近在团队发表文章很少,实在有些惭愧。前几天看了左光的《(23)设计模式-Iterator Pattern 》和Wayfarer的《.Net中的设计模式——Iterator模式》后,想起了自己以前在学习IEnumberator和IEnumberable接口遇到的一些困惑。尤其是.net中还支持“索引器”的概念,如何让Iterator与索引器统一起来,使用户可以以forearch方式访问也可以使用诸如Item[1]或Item["Name"]的方式访问便是当时我最关心的问题。

本想写一篇文章介绍如何实现的文章,后来发现CodeProject上已经有人做了这方面的工作,因此在这里留下个链接,推荐大家读一读。《Hashlist - Hashtable meets ArrayList》

另外,感觉设计模式中一个非常重要的模式“状态模式”在博客园讨论似乎不怎么多,我认为“状态模式”在UI设计或其它设计的地方用的非常多,希望能和大家一同研究一下。

posted @ 2005-08-23 09:07 吕震宇 阅读(2528) | 评论 (7)编辑

内容篇幅较长,请点击这里阅读全文
posted @ 2005-08-22 22:33 吕震宇 阅读(1350) | 评论 (0)编辑

最近在写《并发操作的一致性问题》的后半部分(目前只完成了50%)时,发现ADO.NET中的DataAdapter对更新用WHERE短语的生成策略支持并不很好,WHERE短语生成策略上DataAdapter尚差Visual FoxPro好大一截。并且如果不小心使用的话,甚至可能有某种“变态”更新出现。本文就DataAdapter这方面的问题进行了分析。

详细内容请访问我的文章《小心DataAdapter陷阱》。

在文章《让DataAdapter实现KeyAndModifiedField更新》中,我还会给出一个使用DataAdapter实现“关键字和已更新字段”更新策略的程序代码(由于DataAdapter本身在这方面支持不是很好,导致我不得不反编译了DataAdapter的代码,并重新做了调整,当仍有些问题需要绕着解决)。

posted @ 2005-08-22 17:17 吕震宇 阅读(1292) | 评论 (0)编辑

数据库应用基础系列》的《第2章并发问题及控制手段》已经完成50%的工作,我试图更易懂、完整的解释数据库操作中的并发问题及其解决办法。

这一章分成两大部分,一部分主要讲Visual FoxPro中并发控制机制。VFP中并发控制相对简单,数据加锁的形式比较单一,非常适合作为初步了解并发问题的切入点。第二部分以SQL Server 2000、ADO.NET以及C#为主要工具,深入了解并发一致性问题、封锁协议、事务隔离等内容,难度相对较深。现在Visual FoxPro部分已经完成,包括内容讲解和5个动手做实验。

尽管前50%主要基于Visual FoxPro,但它是后半部分基于ADO.NET的并发控制的基础,所以先放到首页上来。后半部分的动手做实验已经完成编码设计,内容部分也会尽快写完。请各位多提意见。

请访问:

第2章 并发操作的一致性问题 (50%)


实验 2-1 使用Visual FoxPro独占(共享)访问表 (100%)

实验 2-2 使用Visual FoxPro实现记录锁定与解锁 (100%)

实验 2-3 乐观缓冲模式下更新图书阅读次数及相关并发冲突 (100%)

实验 2-4 利用悲观缓冲策略实现自动增长型字段  (100%)

实验 2-5 用Visual FoxPro验证WHERE短语生成策略  (100%)

posted @ 2005-08-19 23:37 吕震宇 阅读(1400) | 评论 (0)编辑

由于《分析模式》实在难啃,听网友建议访问了Martin Flower的网站,还找到不少好东西。最近Martin正在整理《分析模式 第2版》,这版比上一版本要容易理解多了,附加了不少UML图,而且有Java代码的示例。

除此之外,《分析模式》第1版由于没有使用UML图,所以读起来很吃力,在Martin的网站上放了UML图,理解起来会更容易一些。可以访问:http://www.martinfowler.com/apsupp/uml.html

第2版的责任模式一章已经放到了Martin的网站上,可以从(http://www.martinfowler.com/articles.html#ap)找到。读了一下,比第1版充实了不少内容,同时也更容易理解。从中我们还可以看出Martin风趣的一面。在谈及什么时候该使用Accountability模式时,Martin说:If your hierarchies start breeding like viagra infused rabbits, it’s time to look to Accountability.(不要说你不知道viagra是什么呀)。

在读这篇文章时发现几处小错误:(1)文章的图0.9中有错误,最右边的方框应为"functional structure"。(2)第31页存在代码错误

public void setUp() {
   PartyType[] levels = {nation, state, county, city}; 
   usa = new Party("usa", nation); 
   ma = new Party("ma", state); 
   nh = new Party("nh", state); 
   middlesex = new Party("usa", county); 
   melrose = new Party("usa", city); 

最后2行应为

middlesex = new Party("middlesex", county);
melrose = new Party("melrose", city); 

(3)35页倒数第2行出现了两个重复的单词Know

posted @ 2005-08-14 11:26 吕震宇 阅读(1655) | 评论 (2)编辑

内容较长,请访问我的文章《【翻译】Martin Fowler:分析模式-数量模式》。

posted @ 2005-08-10 17:30 吕震宇 阅读(1047) | 评论 (0)编辑

假期里总算挤出点时间,将买了很长时间、看了几遍看不下去的《分析模式-可复用的对象模式》再啃一啃。这本书的难度实在是让我举步为艰,里面的模型更是需要有丰富的想象力和理解力。对于我这个标准的"代码"脑袋的家伙来说,总想将分析模式转换成代码以便于理解,可这还是不能将分析模式中众多的变化和思想表现出来。

网上关于《分析模式》的文章非常少,博客园的老翅寒暑为第2章的内容给出了一个代码模型,可以帮助我们理解其中的内容。而我建议的读书顺序是:第1章、附录A、第2章……,附录A中关于技术和符号的描述有助于我们理解书中的各种图示的含义,毕竟UML在这本书完全起草后才刚刚发布,该书使用的类型图使用了Odell的符号。在读完2、3章后,感觉《分析模式》比起《设计模式》更抽象,更注重思想,而这种思想只能通过从书中各种模式中意会。

我的资质虽说不上愚钝,但也决不聪明,刚刚读完第3章,相对于全书15章的内容来说只能算是管中窥豹。我希望我的足迹能够给后来的人有所帮助,因此将2、3章的心得体会放上来与大家一同分享,一来抛砖引玉,二来也希望更多的人能够关注《分析模式》。

全文请访问我的文章《分析模式》第2、3章读书心得

posted @ 2005-08-08 22:09 吕震宇 阅读(1141) | 评论 (3)编辑

这两天发现从www.counter1234.com申请的FreeCounter居然清零了,积攒了十几万的访问量计数丢掉了。不得已重新从http://fastcounter.bcentral.com/fc-join又申请了一个,将计数器从123456上开始,希望日后不要再给我清零。
posted @ 2005-08-04 18:45 吕震宇 阅读(730) | 评论 (10)编辑

     摘要: 本应放在网站管理区,先放首页希望引起大家注意今天终于有点时间好好收拾一下我的Blog了,以前总是发现使用FireFox访问的博客园与使用IE访问的显示效果差别很大,今天自己重新设置了一下css样式,让FireFox中的显示效果更漂亮一下。经过调整后发现,有些东西可以通过调整CSS实现,而另外一些问题却是博客园的“Bug”了(说是Bug有点吹毛求疵了)。CSS调整方式:以我选... 阅读全文
posted @ 2005-08-03 15:12 吕震宇 阅读(1651) | 评论 (9)编辑

前些日子在随笔中提到想写写数据库应用基础方面的一系列文章,主要针对的对象是下个学习上我课的学生(有C#、设计模式以及数据结构基础,并学习了数据库原理与SQL Server)。现在已经开始“动工”了。内容主要包括数据库基础、并发控制、C/S、B/S、多层应用、XML、WebService、O/R Mapping工具以及性能测评等若干部分。本部分内容会随时更新。

请访问:

第0章 序 (100%)

第1章 数据库基础 (100%)

第2章 并发操作的一致性问题 (1) (100%)

第2章 并发操作的一致性问题 (2) (100%)

数据库并发一致性案例分析(100%)

第3章 数据库设计 (0%)

第4章 常用数据库访问方式 (0%)

第5章 组合成应用程序 (0%)


第1章实验 (100%)

实验 2-1 使用Visual FoxPro独占(共享)访问表 (100%)

实验 2-2 使用Visual FoxPro实现记录锁定与解锁 (100%)

实验 2-3 乐观缓冲模式下更新图书阅读次数及相关并发冲突 (100%)

实验 2-4 利用悲观缓冲策略实现自动增长型字段  (100%)

实验 2-5 用Visual FoxPro验证WHERE短语生成策略  (100%)

posted @ 2005-07-31 22:06 吕震宇 阅读(3139) | 评论 (16)编辑

dudu:

最近我发现很多人留言说一些示例代码下载不了,检查后发现,曾经有段时间因为网通用户博客园访问速度较慢,所以改用“www2.cnblogs.com”发文章,现在就遗留了一些问题。以前所有用www2的链接现在都不可以用了,包括文件下载和一些图片。(请看:http://www.cnblogs.com/zhenyulu/articles/93152.html),手工一个一个修改非常麻烦,不知道dudu可否帮忙从数据库中调整一下,将所有“www2.cnblogs.com”替换成“www.cnblogs.com”?

posted @ 2005-07-29 16:20 吕震宇 阅读(602) | 评论 (2)编辑

自从有了小孩后,几乎什么都不敢计划了,计划永远赶不上变化。先把东西写在这里,日后慢慢实施吧。

现在正在读的几本书:(1)夏昕 曹晓钢 唐勇《深入浅出Hibernate》,读了将近一半,写得非常不错,以前只是略知毛皮,现在好好研究一下。(2)《Dissecting a C# Application Inside SharpDevelop》,中文翻译版在唐山买不到,感觉自己E文还算可以,就将就了。草草读了一大半,是一本很不错的介绍C# Windows应用程序开发的好书,尤其是插件式开发(虽然Eclipse很叫好,可SharpDevelop可是原生C#版的呀)很值得借鉴,有时间再读一遍(有些细节还没有完全明白)。博客园也有几篇很不错的文章写这方面的东西。(3)《Spring.NET Reference Documentation》,正准备读,刚刚开始...,我是被Spring Framework吸引来的。

最近的写作计划:想写写数据库应用方面的一系列文章,主要针对的对象是下个学习上我课的学生(有C#、设计模式以及数据结构基础,并学习了数据库原理与SQL Server),如何将数据库应用起来是写作的目的,初步想法是:(1)注重动手能力培养,提供众多“动手做”的实验,并辅以理论讲解。(2)内容包括数据库基础、并发控制、C/S、B/S、多层应用、XML、WebService、O/R Mapping工具以及性能测评等若干部分。也许会有变化。(3)还没想好...

posted @ 2005-07-26 19:04 吕震宇 阅读(708) | 评论 (4)编辑

月子里的女人除了喂奶什么都可以不做,伺候月子的男人除了喂奶什么都得做。希望不要被老婆、老妈看到)

鱼与熊掌不可兼得,而鱼与猪掌却可兼得。最近总和鱼与猪掌打交道了。

儿时为了屎尿方便穿着开裆裤,现在不穿开裆裤了,却被儿子弄得满身是屎,满身是尿。

时间就像海绵里的水,只要是挤,总会有的。小孩就像一台最好的榨汁机,能够把所有的水一滴不剩的榨干。

待续......

posted @ 2005-07-26 18:41 吕震宇 阅读(1008) | 评论 (6)编辑

终于在2005年父亲节的前两天当上爸爸了!虽然很累,感觉真好。儿子6月17日下午4点出生,8斤3钱,长得象我。特在Blog上留个纪念
posted @ 2005-06-22 09:48 吕震宇 阅读(2165) | 评论 (23)编辑

各位博客园的朋友好!从3月起我一直忙于准备同等学力的研究生考试,从零学习了离散数学、组合数学、计算机体系结构等课程,埋头苦读了两个多月,终于考完试了,现在我又回来了!

两个多月没有更新我的Blog,看到Blog里积攒了很多人的热心回复和留言,实在没有时间一一回复,所以在这里先道个歉。

这次先放一个C#写的排序程序上来,是根据以前博客园某个朋友提供的VB.NET程序改编的(只是忘了他的名字了),重新设计了控件并添加多种排序算法。算法包括:快速排序法、希尔排序法、冒泡排序法、冒泡排序法2、归并排序法、插入排序法、基数排序法、堆排序以及选择排序法一共九种。是这个学期我教数据结构时写的。全部基于数组操作,演示目的,所以导致一些算法的演示速度和实际执行速度可能有出入(例如在我的程序演示中堆排序比快速排序还要快,而理论上,快速排序法的平均速度要比堆排序快)。

没有时间写说明文档了,自己下载看看吧,先贴个图上来:



源程序和代码下载请访问:Sorting.rar

呵呵,再有一两个礼拜我就要做爸爸了
posted @ 2005-06-03 07:22 吕震宇 阅读(4354) | 评论 (34)编辑

寒枫天伤要求,对上次的期刊XML规范设计进行了二次调整(第一稿请参考《博客园期刊杂志格式规范(讨论稿)》):

一、添加了两个元素:Editor(编辑)以及Issue(第几期的编号)。

二、期刊栏目分类采用《博客园期刊栏目分类(试行)》,分成12类,其编号从1~12,如下:

1) 最新动态(News Updates)
2) 专题策划(The Topic)
3) 语言平台(Languages and Platforms)
4) 算法结构(Algorithms and Structures)
5) 开源天地(The Open Source)
6) 实用工具(Pratical Tools)
7) 臭虫博览(Views of Bugs)
8) 开发技术(Development Technology)
9) 架构设计(Design and Architecture)
10) 软件工程(Software Engineering)
11) 程序人生(Experiences of Programmers)
12) 读编往来(Feedbacks)
 
三、目前存在的问题:

由于XSL对“&nbsp;”符号的转换存在一些问题,所以要求各编辑将文章中所有“&nbsp;”符号替换成“&#160;”。详细内容,请参考http://www.dpawson.co.uk/xsl/sect2/nbsp.html

四、转换方式:

最好用XMLSPY来进行操作,如果没有XMLSPY,使用手工编辑也可以。步骤如下:

1、将选好的素材存为HTML格式,然后用FrontPage 2003或Dreamweaver打开,对文件应用XML格式。保存。
2、打开我给的示例XML文件(cnblogsArticle.xml),先将对应的其它节点信息填充好,例如:

<Editor>Allen Lee</Editor>
<Issue>博客园期刊第三期</Issue>
<Title>使用ASP.NET 2.0提供的WebResource管理资源</Title>
<Authors>
   <Author>birdshome</Author>
</Authors>
<PostDate>2004-12-19</PostDate>
<KeyWords>
   <KeyWord>WebResource</KeyWord>
   <KeyWord>资源管理</KeyWord>
</KeyWords>
<OriginalURL>http://www.cnblogs.com/birdshome/archive/2004/12/19/79309.html</OriginalURL>
<Version>1.0</Version>
<Abstract>使用ASP.NET 2.0提供的WebResource管理资源</Abstract>
…………
<ModifyHistorys>
   <Modification>
      <ModifyDate>2005-01-01</ModifyDate>
      <Description>文章初稿</Description>
   </Modification>
</ModifyHistorys>
<Classification>
   <ClassifyMethod ClassifyMethodID="2"/>
</Classification>
<CreativeCommons>
   <Item>Attribution</Item>
   <Item>Noncommercial</Item>
   <Item>No Derivative Works</Item>
</CreativeCommons>


其中Classification还有待进一步商量,目前ClassifyMethodID表示对应分类代号。其它就不再多做解释。

3、将正文内容填入XML文件中,在XML文件中可以看到一段:

<MainContent>
   <DIV xmlns="
http://www.w3.org/TR/REC-html40">
  
   >>>>>>>>>>> 这里填入正文
  
   </DIV>
</MainContent>

填入正文,注意XML标记成对使用。

4、将XML文件中所有“&nbsp;”符号替换成“&#160;”

5、在IE中打开XML文件,看看效果,如果不合适再进行调整。



本文的XML文件下载请访问:cnblogsArticle2.rar

另外,最近要准备考试,恐怕在2、3个月的时间里会很少更新我的BLOG。
posted @ 2005-03-20 21:13 吕震宇 阅读(2322) | 评论 (1)编辑

推荐一本电子书《Apress.ASP.Dot.NET.2.0.Revealed.eBook-LiB.chm》,电驴上可以下载到。(先借首页宣传一下)
posted @ 2005-03-11 09:32 吕震宇 阅读(14871) | 评论 (29)编辑

最近使用Premiere Pro制作了一个DVD,在制作滚动字幕时,查找了很多网上的资料,可基本都是东抄西抄,没有几个能够提供"实质"性的东西。所以,在摸索了半天后,将制作方法放上来,以备查看。

请访问我的文章>>>《使用Premiere Pro制作滚动字幕
posted @ 2005-03-03 19:42 吕震宇 阅读(1355) | 评论 (1)编辑

“数据结构+算法=程序”。前面修改了很多数据结构,现在是修改算法的时候了。我重新设计的棋盘布局的坐标表示,简化了运算。详细内容请访问《华容道与数据结构 (续 3)》。
posted @ 2005-02-25 21:46 吕震宇 阅读(1254) | 评论 (2)编辑

在这部分内容里,将通过HashTable优化检索效率,将基于比较运算的最小算法复杂度O(Log2(n))级别降低至1。程序设计并实现了链地址法的HashTable。使用HashTable后,程序执行时间从原来的1秒缩短至0.8秒。详细内容请参考《华容道与数据结构 (续 2) 》。

posted @ 2005-02-24 20:47 吕震宇 阅读(6571) | 评论 (0)编辑

在《华容道与数据结构(续)》这部分内容中,我将从两个方面对原有程序进行改造,"以内存换效率",进一步提升华容道程序的执行效率。方法包括两方面:

1、将原有4字节棋局表示变为8字节表示以省去原有程序中的排序操作。
2、用HashTable取代原有的AVLTree,提升检索效率。

在本部分内容中,先说说通过8字节棋局表示提高程序执行效率。具体内容,请访问《华容道与数据结构 (续 1) 》。
posted @ 2005-02-22 14:24 吕震宇 阅读(4766) | 评论 (0)编辑

自从《华容道与数据结构》系列文章写完后,有很多热心的朋友提出了宝贵的意见,使得华容道程序的运行效率不断提升。在这里特别感谢“智能算法爱好者”与sumtec,给程序提出了很多宝贵的意见。

Sumtec指出:“AVLTree是否可以用HashTable来替代,毕竟你的目的不是要排序,而是要检验是否容易产生重复。从纯粹的理论上来说,HashTable在这方面的性能消耗应该比AVLTree要好一些,因为AVLTree的复杂度至少是O(Log2(x))级别的,而HashTable则接近于O(C)级别的。”,因此我将程序重新进行了调整,目的是:在不考虑内存使用的情况下再次提高系统执行效率。

我的修改包括两部分:1、用HashTable取代AVLTree,设计并实现自己的HashCode算法。2、修改华容道布局表示方式,从原来的4字节表示改为8字节表示,这么做可以省略掉原有程序中的排序操作。

经过修改后,每个节点平均比较3~5次便可知道是否有重复,接近于O(C)级别。Int64的布局表示省掉了排序,效率进一步提升。但内存占用总体要增加(以内存换效率)。

现在,原有系统中第四个布局的求解时间从最初的6.67秒降到了消除Execption影响后的1.55秒,现在又降到了使用HashTable的0.90秒。贴张图上来:



源代码我会随后放上来,并且进一步完善《华容道与数据结构》系列,这次的重点放在HashTable上面。
posted @ 2005-02-20 17:02 吕震宇 阅读(5775) | 评论 (8)编辑

在对华容道程序性能调优时,发现Exception的效率对程序的运行影响居然如此之大,以至于在不使用Exception后,程序的执行时间从6.67秒缩短到了1.55秒。

具体内容请访问《Exception对程序执行效率的影响》。
posted @ 2005-02-16 21:41 吕震宇 阅读(6220) | 评论 (0)编辑

河北理工大学经济管理学院管理科学与工程系招聘教师,要求:至少拥有硕士研究生以上学位,信息管理与信息系统专业或相关专业,35岁以下,相貌端正,口齿清楚,愿意致力于教育行业。有意者请将简历发送到 luzhenyu@gmail.com
posted @ 2005-02-12 17:58 吕震宇 阅读(3546) | 评论 (13)编辑

这是华容道与数据结构系列的最后一部分内容。这部分内容介绍了如何在应用程序中使用设计好的组件、如何在单独的线程中运行华容道求解程序以及“性能大比拼”,比较本程序与河北石家庄李智广的"华容道全能版 V1.1"在求解性能上的差异并分析了性能差异的可能原因以及未来可行的调整办法。

详细内容请参考《华容道与数据结构 (12) 》。
posted @ 2005-02-11 22:28 吕震宇 阅读(914) | 评论 (0)编辑

这部分内容主要介绍华容道程序中中介、协调各数据结构运作的Mediator对象的设计。详细内容请参考《华容道与数据结构 (11) 》。
posted @ 2005-02-11 16:41 吕震宇 阅读(784) | 评论 (1)编辑

这部分内容介绍环形链表CircularLinkedList的实现。具体内容请参考《华容道与数据结构 (10)》。

posted @ 2005-02-10 16:20 吕震宇 阅读(747) | 评论 (0)编辑

这部分内容介绍TreeLinkedList的代码实现。该结构将链表与树结合起来,用于存储华容道布局的搜索结果。详细内容请看《华容道与数据结构 (9) 》。

posted @ 2005-02-07 20:20 吕震宇 阅读(639) | 评论 (0)编辑

这部分内容主要介绍快速排序法。内容请参考《华容道与数据结构 (8) 》。
posted @ 2005-02-06 13:47 吕震宇 阅读(474) | 评论 (0)编辑

这部分内容介绍棋盘布局Layout的设计。具体内容请参考《华容道与数据结构 (7) 》。
posted @ 2005-02-06 10:17 吕震宇 阅读(563) | 评论 (0)编辑

这部分内容介绍棋子Chessman的设计。内容请参考《华容道与数据结构 (6) 》。
posted @ 2005-02-05 16:48 吕震宇 阅读(586) | 评论 (0)编辑

最近在给华容道程序进行性能调优时遇到了一个令人费解的效率问题,我最初始的代码是这样写的:

    public override void CheckAvailableSteps(BlankPosition _blankPosition, CallBackDelegate _callback)
    
{
      
if(CanMoveUp(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Up);

      
if(CanMoveDown(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Down);

      
if(CanMoveLeft(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Left);

      
if(CanMoveRight(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Right);

      
if(CanMoveLeft2(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Left2);

      
if(CanMoveRight2(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Right2);

      
return;
    }

  }

这是一个水平横放棋子的走法判断程序。可以看出来,我依次测试了一个水平棋子的六种走法是否可行。后来我认为可以进一步进行调优:比如说如果该棋子可以上移,那么其它五种移法就不用考虑了,肯定不行。类似如果该棋子可以左移两位,那么一定可以左移一位。这样我就可以减少判断的次数,进而提高程序运行的效率。所以我把程序改成了类似这个样子:

    public override void CheckAvailableSteps(BlankPosition _blankPosition, CallBackDelegate _callback)
    
{
      
if(CanMoveUp(_blankPosition))
      
{
        _callback(_newPosition, _newBlankPosition, MoveMethod.Up);
        
return;
      }


      
if(CanMoveDown(_blankPosition))
      
{
        _callback(_newPosition, _newBlankPosition, MoveMethod.Down);
        
return;
      }


      
if(CanMoveLeft2(_blankPosition))
      
{
        _callback(_newPosition, _newBlankPosition, MoveMethod.Left2);
        
        
// 此处添加MoveLeft代码并CallBack, 略
        
        
return;
      }


      
if(CanMoveRight2(_blankPosition))
      
{
        _callback(_newPosition, _newBlankPosition, MoveMethod.Right2);
        
        
// 此处添加MoveRight代码并CallBack, 略
        
        
return;
      }


      
if(CanMoveLeft(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Left);

      
if(CanMoveRight(_blankPosition))
        _callback(_newPosition, _newBlankPosition, MoveMethod.Right);

      
return;
    }

  }

结果猜怎么着?程序运行效率骤然降低,从原来的5.88秒一下子长到了6.23秒,这可不是一个小数。明明添加了一些return避免过多的运算,可系统效率反而下降,真不知道为什么?难道代码运行效率与代码行数还有关系?

放到“新手区”。我想原因可能有两个:1、此处的修改对效率影响太小以至于可以忽略不计。2、测试误差比较大。我已经放弃这种优化方法了。
posted @ 2005-02-05 11:16 吕震宇 阅读(820) | 评论 (13)编辑