完成了一个物业管理软件,想谈谈自己的一点体会。1.对delphi的看法 2.所谓的三层 3. 简单地应用XML作为数据缓存 4.统领全局的Singleton对象

  • 主题发起人 主题发起人 chinaplate
  • 开始时间 开始时间
C

chinaplate

Unregistered / Unconfirmed
GUEST, unregistred user!
完成了一个物业管理软件,想谈谈自己的一点体会。1.对delphi的看法 2.所谓的三层 3. 简单地应用XML作为数据缓存 4.统领全局的Singleton对象(200分)<br />最近,我完成了一个物业管理软件,想谈谈自己的一点体会。

一。个人对Delphi的看法,我觉得可以从三个方式来用Delphi
1.象用vb一样用Delphi;
2.象用vc一样用Delphi;
3.象用c#/java一样用Delphi;

我很早之间先用vb做了一个项目,然后才转手学Delphi,那时感觉
Delphi比vb强大多了,项目做的也很顺手。这种用法的典型特征就是:
项目基本上是由Form组成,充斥着各种控件。

我曾经看过一个同事的原码,才感到Delphi的另一个层次的强大。它娴熟
的应用了API函数,代码中处处能看到message,pchar的影子。甚至于,他
将.pas文件分成了两部分,定义部分分离到了.inc文件中,然后用
{$I x.inc}将其包含进来。更精彩的是,他在.inc文件中用个技巧,使的
自己的程序可以另外灵活的独立编译成dll。

我在用过了c#/java后,对OO有了一定的了解后,再用DELPHI写项目时,很自然
得,我只想用DEPHI的OO元素。所有的变量和函数都定义在某个类中。所有的form
组成界面层,负责与用户的对话,同时向业务层提交请求;业务层来完成具体业务及
各业务类之间的关系协调,需要对类进行永久化时,向存储层提交请求;存储层
完成类的永久化,并自动适应可能的不同DB类型。想法如此,但具体设计时,我很难
象c#/java那样自然的实现物理上的分层(我对写成的dll控制不好),只好只实现了
逻辑上的分层,不过,这也就够了。

(未完)
 
他在.inc文件中用个技巧,使的
自己的程序可以另外灵活的独立编译成dll。

-------------
什么技巧说来听听.
 
感兴趣 通过.inc文件独立编译成dll的方法,顶!
 
坦白的说,我对第2种方法的来龙去脉也不是很清楚。很可惜,我与这个同事共事很短。
 
牛人啊。放点水给我们。。呵呵,给点思路给我们学习下嘛
 
他在.inc文件中用个技巧,使的
自己的程序可以另外灵活的独立编译成dll。

-------------
什么技巧说来听听???
 
恩,使用时间越长越觉得自己懂得少
学习
 
呵呵!需要学习
 
还是比较肤浅
 
2.所谓的三层

想当年,三层概念刚开始火的时候,到处充斥着一些讨论和争吵,
当时,也搞的我一头雾水,不知所云。尤其是当时的李维那一套
书,我看的似乎明白了,似乎什么也不懂。(至少,现在都忘了)

等到用c#写了一个项目后,才知道分层是如此简单和自然。以前用Com+等
技术,为了真正实现分布式的分层技术,需要掌握太多的太难的,太枯燥的技术,
反而认为分层=分布。事实上,写一个项目,我们应把更多的精力放在业务实现,
用户交流上,这也正式.net/j2ee所追求的。

用Delphi写的这个物业项目,我最初想象用c#一样,将界面层,业务层,存储层
都分别做成单独的dll,然后用一个简单的wrapper程序调用ui.dll来启动程序。
但因为一些乱七八糟的问题,我控制不好dll,只好把所有的层次都放在一个工程里,
物理上没有分开。

1。存储层
存储类的基类为acBase,
DataMember:
FConn:TAdoConnection; //到DB的连接
FQuery:TAdoQuery; //事实上,它存放select语句的返回结果集
FDbms:TDBMS; //生成sql字符串的对象
FunctionMemeber:
select(where:string),update,insert,delete等抽象方法

//下面这两个方法真正进行数据库sql操作
QueryOpen(sql:string); //执行select语句,打开结果集
CommandExecSql(sql:string); //执行其它sql语句


FConn对象为所有的存储层对象共享,即系统只有这一个到DB的连接,它在程序启动时
建立并打开,存在在一个singleton类中。

为了实现对多种类型的DB的兼容,将生成sql字符串的功能代理给抽象类TDBMS,我的
系统中,TDBMS有两个子类,TDBMSAccess,和TDBMSSqlserver,它能根据各自数据库的
特点,生成不同的合适的sql语句。

2。业务层
业务类的基类为bsBase,
DataMember
FAcBase:TAcBase; //到存储层的引用
FId:String; //标记当前业务对象的ID
FunctionMember
Add,Alter,Del,Get,GetByCondition,DelByConditon等抽象方法

具体的每个业务类继承自bsBase,并增加定义各自的数据成员(一般对应于db中的字段)
如bsHouse房间业务类
TbsHouse=class(TBsBase)
public
num:string; //房间号
useDate:TDateTime; //启用日期
area:Real; //面积
typeId:string; //房间类型ID
...

3。界面层
同样定义界面类的基类为frmBase
其中实现了一些在大多数FORM中都会使用的一些公共函数。
在form类中,定义并建立相应的业务类,界面的诸如browse,add,del,alter等请求
向它的业务类提交。

4。一些说明
在存储层中,并没有象实现select一样来实现update,insert,delete,因为delphi
的query的方法可以更方便的实现。
业务对象即包含从存储类中传上来的Query,可以包含几条记录,又有对应着db字段
的DataMember,也即,又是一个业务个体。不知这么做是否合适?
物业管理看起来不大,但它的收费用到的数据有点复杂,需要几个table来配合存储
数据,所以系统中用xml来作为数据的缓存,bsBase中还包含一个TXMLDocument对象。
关于业务类中xml,我会单独再说明。

(未完)
 
能不能介绍下
他在.inc文件中用个技巧,使的
自己的程序可以另外灵活的独立编译成dll。
怎么实现用.inc独立编译成dll
 
to: QSmile,hongxing_dl,david_fwj

我记得他的程序中,将类或方法的接口,与这些接口的实现分离在.inc和.pas文件中,
程序中大量的使用编译开关,进行不同需要的编译。但,很抱歉,我对他的程序的理解
很片面,我现在也无法给你们更多的信息。
 
兄弟继续介绍,我们翘首以盼!
 
真是个够人啦!听课.
 
真得好好学一下了
 
正在学着用三层结构做东西
受教了
3Q
 
后退
顶部