2005年07月15日

****摘抄**************************** 对一名软件开发人员而言,计算机语言只是手段,开发平台是工具,而技术才是真正的实现。所以任何一位在软件开发领域奋斗的朋友,都应努力把握目前软件开发的主流技术与知识,才能在这个领域中立于不败之地。 多层模式(N Tier) 从事过Windows下MIS程序开发的人,都很清楚C/S是怎样实现的,在此笔者并不是要抛弃两层模式,只是希望通过笔者的描述帮助大家建立概念及了解三层结构带给我们的是什么空间。 误解一:C/S退出历史舞台了 笔者以为,C/S并没有到这么惨的地步,任何一个项目或任何一种方案,都要分析一下它实现的是什么东西,并且它将要面对的最终用户是什么性质。比如开发一个在Windows下运行的程序,或开发一个在局域网内并且只针对少量用户的程序,或者一个管理程序、后台运行程序,未必一定强求使用多层模式,因为它并不能给你带来什么,反而会增加你的工作量与维护量。 我们不应该单纯追求技术的先进性,而要追求实用技术,当你要实现一个方案时,你要分析项目的性质及最终用户,然后再寻找能解决你问题的最实用手段。因为用户并不关心你采用多么先进的技术,用户关心的是可靠(Reliable)、快速(Rapid)、方便(Convenient)。 误解二:多层模式只适用于大型项目 这是常见的一种误区,包括笔者自己,在进入N Tier领域之前都是这种想法。但随着对N Tier了解的不断深入,才发现这种理解是错误的。具体的选择应根据项目的特点及面向的最终用户群性质来决定。 如果你的项目运行在广域网,就必须考虑数据的安全以及带宽问题,或者当你面对的是普通用户,他们不可能完成复杂的程序设置、安装等工作,或者简单地讲,如果你要实现一种零成本或者最小成本的最终用户维护,你就必须考虑采用N Tier的B/S模式来开发该系统。 我们习惯把N Tier模式称作三层结构体系,因为N Tier实际上是三层结构的变体。正确理解三层结构对于程序员而言非常重要,因为这里面包含着许许多多的理论和技术背景,融合了多少天才式人物的奋斗,才有了我们今天成熟的N Tier开发基础。 三层结构的技术实现手段 要开发一个三层结构,这些技术是必不可少: 中间件、通信协议以及交易模式。 中间件 中间件是构造应用服务器不可缺少的。目前在Window平台下通用的三层结构中间件有下面几种: Midas、CORBA、COM/DCOM/COM+以及Asta。 Midas是Borland公司从Delphi 3开始达到应用级的产品,功能强大,也是Borland公司的旗艇产品,可应用在Windows及Linux下; CORBA是OMG(对象管理组织)推出的产品,有强大的跨平台能力; COM/COM+是Microsoft的拳头产品,也是每次Microsoft都要宣传的理念之一,目前已整合到操作系统中。它的结构非常庞大,如果把Midas比喻成一只野马,那COM+就像是一头狮子。狮子看起来比野马强壮很多,但要驯服它却很不容易。最后一个是Asta中间件,可能大家不太熟悉,实际上从1997年开始Asta公司就致力于发展这个产品。它内嵌了Socket连接,有强大的“消息”开发机制。 通信协议(或连接方式) 通用的中间件连接模式有TCP/IP(如Socket)、DCOM、CORBA等。程序员经常会把DCOM与COM混淆,实际是有区别的,COM只是一种服务提供,而DCOM才能使COM真正发挥它的魅力,DCOM在COM的基础上增加了分布的概念。目前,微软又新推出了.NET,对DCOM进行了发展和完善。 Midas既可使用DCOM连接,也可使用Socket连接,Borland公司在Delphi 5中对Midas进行了核心性的改造,所以要使用Midas,一定要看Delphi 5以上版本的书籍。 COM/COM+只能使用DCOM连接,CORBA使用自己的连接协议。这里笔者还想提一下DCOM,DCOM连接虽然优点很多,但设置过于复杂,所以连Microsoft也承认其缺陷。Microsoft在.NET平台中将首推SOAP连接协议,SOAP是建立在HTTP上层的协议,主要为了适应XML的发展,目前已得到许多大公司的支持(如IBM、Oracle等)。 交易模式 最著名的是MTS,它的英文全称是Microsoft Transaction Server,交易模式实现的功能非常多,比如,多段提交模式,其Pooling技术,也就是缓冲池技术,让数据提交更加安全、快速。很难想像,如果没有交易模式,三层结构要做什么:你要自己动手写大量的代码实现事务机制,如果解决得不好,还降低了程序的可靠性与速度。而MTS是建立在系统层的,可以帮助你解决许多本应在程序里解决的东西。还有一点要记住,目前市面上Windows开发平台上,只有Delphi与VC才能真正发挥MTS的功能。 三层结构编程要点   对此笔者不想讲太多理论,只给大家一句经典名言,这句话每个程序员都应该牢牢记住:All business logic in the Middle Tier(所有的商业逻辑处在中间层上)。如果不这样,你开发的三层结构程序就不专业,或者只是C/S模式的翻版产品。这句话虽然很简单,要达到这一境界却需要大量的经验积累。   另一个要领是: 一定要尽量减少应用服务器与前台程序的数据传递量以及Round Trip。因为如果你的三层结构存在频繁的Round Trip,那么你开发的应用服务器效率一定非常低下,当同时进入10个连接时,你就会发现应用服务器接近瘫痪。   在开发三层结构的系统时,应该养成一种好习惯,就是在系统分析或者设计报告中,较为详细地描述如何解决商业逻辑、如何有效降低数据传递量,以及只使用必要的Round Trip。只有这样,别人才能与你一起探讨你的解决方案是否合理,是否有更有效的实现方式。同时,经过不断归纳,提高自己的系统分析能力。   在开发大量用户连接的应用服务器时,多线程技术是必要的,否则当应用服务器在处理一个用户的请求时,另一用户只能等待,如果这种等待的时间太长了,用户就会对软件失去信心。还有一个是分布式的概念,你可以根据商业逻辑来切分,开发并发布多个应用服务器解决不同的商业逻辑;或者你可以将运行应用服务器的多个进程分布在不同的服务器中,并根据访问流程自动引导用户到合理的应用服务器中。   正是因为三层结构比C/S复杂,所以你要成为三层结构的高手,一定要经过一段较长的时间和大量项目的锻练。但三层结构体现了一个开发人员与系统人员的专业素质,因为它涉及太多东西: 技术工具的选型、模块化和组件化思想、前后台功能的分割等等。从真正意义上来讲,只有三层结构的项目才能完整反映软件项目的每个过程。 B/S模式与发展   主流的软件架构B/S与N Tier模式都有一些缺点,所以现在出现了许多B-N Tier的系统,就是基于Web浏览器的多层结构开发模式,它吸收了两者的优点。   我们知道单纯的B/S方式,虽然很令人兴奋,并且最终用户使用成本几乎为零,但它存在许多不足,它的功能较弱,无法非常容易地实现你的理念。比如你要实现一种商业模型,你会发现实际上Web方式是不安全、不可靠的,比如,用户可通过页面回退或前进来改变你所有希望的结果、报表制作能力不足等。   为什么Web会造成逻辑实现上的困难?因为它是基于Stateless(无状态)的。打个比方,Stateless就是这样一种情形:你与你的用户中间有一道墙,你并不知道墙另一边的用户长得什么样子,甚至是男是女你都不知道,然后你通过墙上的一个小窗递给他一件礼物,至于礼物最终的流向,你也一无所知,这就是Stateless。所有基于HTTP的东西都是Stateless的。而Socket的魅力就在于它是有状态的。   笔者以为现在发展起来的ASP、jsP、Java技术,都是在弥补HTTP协议存在的无状态缺陷,但即使有了这些工具,仍会觉得网页编程无法随心所欲,因为这些技术再先进,也无法解决HTTP协议基于Stateless的事实。   也许有人会问,这些动态网页开发技术是如何在一定程度上避免了Stateless的弊端的?以基于IIS的ASP技术来说,它使用Session变量来实现State。但是不管什么技术,最终都落在了COOKIE上,也就是使用COOKIE来保留客户端状态。   这里还要提一下Socket。Socket目前应用十分广泛,ICQ、QQ等即时通讯软件,还有许多网络工具,大都基于Socket,因为Socket协议是有状态的,所以才能做到这一点。可以这么说,是Socket让网络生活更精彩! 目前基于Web的多层结构采用的底层技术主要有SOAP+State类协议或者HTTP+State类协议。这里有一个Delphi程序员的好消息,从Delphi 6开始引入WebSnap包(一种Web Provider产品),它的设计者被Borland公司称为Borland历史上最伟大的工程师之一。它同时支持HTTP与SOAP协议,也采用了一种类似Session变量的模式来实现有状态(State)。它可以说是目前市面上最强大的基于平台的Browse/Server开发工具之一,其不足是它还不能称为完全的RAD工具,而且门槛较高。为什么不是ASP或者ASP.NET呢?笔者认为ASP不是基于平台的,它是基于脚本语言的,它的运行效率不高,而且它的调试困难。在Delphi 7中还引入了IntraWeb控件包,笔者以为它是一种真正意义上的网页RAD开发工具,与WebSnap配合更会如虎添翼。   Web Provider、逻辑组件、多线程处理、交易机制、消息流转等组合在一起是N Tier开发的最高境界,笔者以为是大型商业软件架构的首选。笔者在前面很少提到消息机制,主要是怕大家混淆了概念,消息机制并不一定在所有的多层结构中都存在,而且,如果要实现消息机制,必须寻找实现手段(比如使用Socket),否则,如果在程序中强制实施大量消息流转(比如使用定时器监控和消息数据表方式),无论是效率还是实现的复杂性来讲都是要考虑的问题。 软件开发人员的选择   笔者愿意把软件设计看成音乐艺术,它有许多流派,也有主流,但并不意味着别的思想被彻底抛弃。比如单层结构或C/S方式,许多人仍然在用,而且很擅长。笔者不鼓励读者抛弃这些传统的东西,笔者的意思是要扩大眼界,开放思想。而多层反映的是一种集成的思想,以安全、高效、图形方式整合系统,以组件思想逐步构架整个公司的商业逻辑,并降低最终用户使用成本。其最核心的思想是集中,所有中间层是集中的,可以在不同的服务器上运行不同的商业逻辑组件(比如.NET),但这个逻辑组件一定是提供给所有前端程序使用的。现在许多企业都在走系统集中的道路,集中可以带来无限的好处,但没有软件平台的支撑,集中是非常肤浅的。我们追求的不单纯是机器的集中,机器的集中会同时带来网络带宽的压力,只有应用集中了,才能最终达到合理配置资源的目的,这也是为什么我们要用多层体系、要用分布式思想来构建企业应用的真正原因。   笔者以为,在软件开发的今天,作为一名专业人员,如果总在单层或C/S构架下,永远形成不了系统思想,只有多层体系才能真正体会软件生命周期的理念,从需求分析形成商业逻辑到系统设计、数据库结构设计、组件化程序编写、测试、推广,一个好的N Tier系统一定要踏实地做好各个阶段的工作。这不像程序语言的变化或者开发环境的简单变换,因为它是一种开发思想与开发模式的完全变革,所以它也一定是一个过程,不可能要求自己在一两个月内就能真正体会并开始驾驭N Tier模式,但商业模式变了,开发思想也要变,你必须也只能让自己去适应新的思想,才能成为一名更加专业的开发人员。一旦你进入了N Tier的殿堂,并熟练掌握了这种开发模式,就会发现你开始逐渐形成了软件开发的系统思想,并且在这个领域上越走越在前面,开发也会越来越有激情。&nbs

2005年07月09日

……纪录点点滴滴

查找替换自定字符串中的子字符串

function Replacing(S,source,target:string):string;
var site,StrLen:integer;
begin
  while pos(source,s) >0 do
  begin
    site:=pos(source,s);
    StrLen:=length(source);
    Delete(s,site,StrLen);
    Insert(target,s,site);
  end;

  Result:=s;
end;

 

2005年07月07日

1)不错的异常纪录工具http://clevercomponents.com/articles/article012/exwatcher.asp

如果你需要纪录程序中发生异常的具体信息,你可以去这个网址看看,还不错!

2)设定可选参数

function example(a:integer;b:string;e:exception=nil):integer;

 这样就可以把参数e设定成可选的了

2005年07月04日

运行期包中应当只包含所需要的单元。那些属性编辑器和组件编辑器的单元应当放在设计期包中。注册单元也应当放在设计期包中。

包的命名遵循下列模式:
iiiLibvv.pkg—设计期包
iiiStdvv.pkg—运行期包
其中,iii代表一个3字符的前缀,用于标识公司、个人或其他需要标识的事情。vv代表包的版本号,其中也包含了Delphi的版本号。
注意包名称中的lib或std分别表示这是设计期包还是运行期包。例如,
DdgLib50.pkg—设计期包
DdgStd50.pkg—运行期包