(黑龙江八一农垦大学,黑龙江 大庆 163319)
摘 要:文章通过分析软件分层设计的优点,提出了对用户界面与业务逻辑进行分离,通过接口或抽象类实现两者间通信的方法,并对业务逻辑进行封装成动态链接库,以达到数据资源共享的目的,解决了应用逻辑重复使用问题,增加了系统的可复用性、可扩展性和健壮性。
关键词:分层设计;界面与业务逻辑分离;动态链接库
中图分类号:TP31 文献标识码:A 文章编号:1007—6921(2008)10—0142—02
三层结构是开发C/S或B/S系统经常采用的策略,这种分层方式将系统分为用户服务、业务服务和数据服务三部分,能够解决客户端与服务器结构维护成本问题、改善客户端与服务器结构延展性问题;解决应用逻辑重复使用的问题;还能够满足整合不同系统结构的需要与及时应用新技术的需要。但在实际应用中,如何更好的利用这种分层方式来解决实际项目中的问题,一直是程序设计者不断探索的方向。本文主要就DLL封装业务逻辑的实现方法进行探讨。
1 界面与业务逻辑的分离
MIS系统经常采用C/S结构来处理,在实际使用中用户界面与业务处理并没有进行详细的区分,这样编写出来的程序层次复杂,不仅阅读不够清晰,对于以后进行修改和维护也会遇到很大的困难,同时降低了代码的可复用性与可扩展性,所以在编写程序时需要将界面与业务逻辑进行分离,以此来降低数据的传输量、减少对客户端影响以及增强系统的安全性和健壮性,提高程序的可复用性和可扩展性。在用户层与业务层分离时,应尽量使客户端更“瘦”,将复杂的算法和业务逻辑规则放在中间层来处理,而数据层只用来保证提供给中间层所有的数据和操作能够正常进行。
例如:在进销存系统中对于货品的销售过程中供应商提供了对某种货品的保价处理,那么在销售时就不能对保价货品随意出售,需要对商品进行保价检查,如果是保价商品,则需经过特别处理或者不予销售,而对非保价商品就可以直接进行销售。下面是一段处理代码:
If No_BJ then //No_bj变量用来确定该商品是否是保价商品
Begin
{保价或不予销售代码}
{界面处理代码a}
End
Else
Begin
{销售代码}
{界面处理代码b}
End
上面这段代码将业务处理代码与界面处理代码放在一起,我们可以使用下面的代码对其进行
分离:
Function Sfbj_Sp(no_bj:boolean):Boolean;
Begin
If no_bj then
Begin
{保价或不予销售代码}
Result:=true;
End
Else
Begin
{销售代码}
Result:=false;
End;
End;
此段代码放在业务处理中,界面中有下面这段代码:
If Sfbj(no_bj) then
Begin
{界面处理代码a}
End
Else
Begin
{界面处理代码b}
End;
分析这两段代码的不同点,从中可以看出,后面这段代码使界面处理与业务处理分开来进行,从而使代码结构更加清晰、简洁;更重要的是,即使对界面和业务逻辑进行维护和修改,只需修改各自的处理代码就可以了,增加了独立性,同时也增加了程序的可复用性和可扩展性。
2 DLL封装业务逻辑
动态链接库给应用程序提供了一种调用不在其执行代码中的函数的技术。而在这里为了给更好的复用业务处理代码和全局变量,Dll用来对业务逻辑进行封装,使业务逻辑部分和界面部分分别形成Dll和Exe文件,从而使程序的执行更加高效。
为了实现对业务逻辑的封装,首先要定义业务类,然后对其进行继承,实现具体的业务代码。对于界面部分与业务部分的通信可以采用定义接口的形式来完成,在Delphi中我们可以使用Interface或抽象类来具体实现,但在实现中要保持接口的稳定,不能随意对其进行更改。如果想以后对其进行扩展或复用,还可以通过预留接口的方式来解决未来功能增长的需要。具体实现以下面这个例子来说明。
2.1 首先是对库存接口单元的定义,形成界面与业务通信的接口,为了实现多态,只对其进行定义而不作具体实现,在这里也可以预留接口。
IStock=interface
Funciton Select_Stock(sql_goods:string,Id_goods):Olevariant;
Procedure Save_Stock(Insert_stock:string,Nam_goods,Id_goods,Date_goods,Num_goods
:variant);
Procedure Update_Stock(Update_stock:string,Nam_goods,Id_goods,Num_goods:variant);
Procedure Delete_Stock(Delete_stock:string:Id_[FL)]
[HT][HJ*4][HT5”SS] 盛永生,等 ? Delphi中DLL封装业务逻辑的实现[JY,1]2008年第
10期[HT][CDF46][HT][HJ*8][HT5”,5SS][FL(2K2]
goods);
End;
2.2 具体实现库存业务类,它继承了Istock接口,具体实现了业务类,同时在这里也可以引用其他公共函数、数据处理单元等公共资源以供本单元使用。
TStock=Class(TinterfacedObject,ISto) //ISto为创建TStock类的函数
Constructor Create;
Destructor Destory;override;
Funciton Select_Stock(sql_goods:string,Id_goods):Olevariant;
Procedure Save_Stock(Insert_stock:string,Nam_goods,Id_goods,Date_goods,Num
_goods:variant);
Procedure Update_Stock(Update_stock:string,Nam_goods,Id_goods,Num_goods:variant);
Procedure Delete_Stock(Delete_stock:string:Id_goods);
End;
Implementation
{具体实现各函数、过程的功能,完成业务逻辑}
End;
2.3 在完成库存业务类后,即可对业务逻辑进行封装成DLL,具体代码如下:
Library Stock
Uses
ShareMem,Sysutils,Classes,
IStock in 'IStock.pas',
TStock in 'Tstock.pas'
dataModule in 'dataModule.pas' //用来处理TStock的数据模块,这里不做介绍
Function CISto:ISto;
Begin
Result:=TStock.Create; //创建TStock;
End;
Exports
CISto; //对外接函数的引用;
End;
2.4 编译生成Stock.dll文件后,用户界面部分就可以通过引用该文件对库存数据进行相应的操作,这样就实现了DLL封装业务逻辑,如果需要对业务类操作进行扩展和修改,可以通过修改接口函数或者预留接口来实现,只需重新编译即可而无需重新编译界面文件。
3 结论
通过对用户服务与业务服务的分离,实现了程序的可复用性、可扩展性,提高了系统的健壮性,解决了应用逻辑重复使用的问题,同时也为系统的后期维护提供了方便;尤其对B/S类系统和企业级系统来说所带了的好处是不言而喻的。使用DLL对业务逻辑类进行封装会更好的利用业务类与公共资源,摒弃全局变量,提高了程序的效率。
[参考文献]
[1] 飞思科技产品研发中心.Delphi分布式开发[M]北京:电子工业出版社,2002.
[2] John Ayres.Delphi Win32核心API参考[M]北京:中国电力出版社,2004.
[3] 董良,高磊等.Delphi6深入浅出[M]北京:清华大学出版社,2002.
[4] 飞思科技产品研发中心.Delphi下深入Windows核心编程[M]北京:电子工业出版社,2003.
[5] 李维.Delphi 5.x分布式多层应用系统篇[M]北京:机械工业出版社,2004.
联系客服