三层结构是开发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对业务逻辑类进行封装会更好的利用业务类与公共资源,摒弃全局变量,提高了程序的效率。

Delphi中DLL封装业务逻辑的实现相关推荐

  1. MySQL:尽量不要用存储过程封装业务逻辑

    本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php.java等就是调用存储过程". ...

  2. 减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同

    转:减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同 本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存 ...

  3. java_web:使用javabean实现登录操作(封装业务逻辑的javabean,且使用封装数据的实体类传参)

    javabean的使用 1.将jsp中要用到的登录操作的代转移到java类中 2.javabean的作用: a.减轻jsp的复杂度 b.提高代码复用 3.javabean的定义 a.public修饰的 ...

  4. java_web:使用javabean实现登录操作(封装业务逻辑的javabean)

    javabean的使用 1.将jsp中要用到的登录操作的代转移到java类中 2.javabean的作用: a.减轻jsp的复杂度 b.提高代码复用 3.javabean的定义 a.public修饰的 ...

  5. Delphi中DLL初始化和退出处理

    Delphi中DLL初始化和退出处理 choysan 2010-01-08 8:56:43 <1>利用Unit的Initalization与Finalization这两个小节 可以在Uni ...

  6. 超级账本Fabric学习(二)Fabric1.0.0网络搭建(中)无业务逻辑处理的Fabric网络

    整合三个有依赖关系的yaml文件 1:docker-compose-cli.yaml文件源码解析 2:docker-compose-base.yaml文件源码分析 3:peer-base.yaml文件 ...

  7. Delphi中DLL或Package窗体载入与显示

    Delphi应用程序架构中有一种模式,采用DLL或Package存储业务窗体,当需要时从其中载入到主程序中,这时候需要对DLL或Package中窗体进行处理,步骤如下: 1.定义窗体基类 typeTf ...

  8. 关于Delphi中DLL,BPL等无法调试的问题

    今天,整插件框架的时候,调试的时候,整来整去,发现,无法进入插件DLL进行调试,诧异的蛋疼,相同的框架,以前写的代码,调试一切正常,随意怎么调试都可以,今天换一个项目上来,调试居然无法进入到DLL模块 ...

  9. 设计模式之 抽象工厂 封装业务逻辑层和Dao层

    一般情况下软件应该尽量遵循以下的设计原则: 开闭原则(OCP) 对扩展开放,对修改关闭 里氏替换原则(LSP) 任何类出现的地方,子类一定可以出现(is-a) 依赖倒转原则(DIP) 尽量依赖抽象,不 ...

最新文章

  1. (C++)1046 Shortest Distance
  2. Spring AOP 简介以及简单用法
  3. 更换Spring底层日志框架
  4. GFS - The Google File System
  5. java dao模式_Java DAO 模式
  6. javascript 作用_JavaScript承诺如何从内到外真正发挥作用
  7. 获取本地ip地址适用于windows和Linux环境
  8. 技术面试的《飞鸽传书2007绿色版下载》
  9. idea关闭coverage
  10. 前端编码规范之JavaScript
  11. 通俗易懂的理解 Redux(知乎)
  12. 说好的「机器人出租车」和「自动驾驶汽车」,到底在哪? 原创 我爱至尊宝 科技行者 昨天...
  13. GB28181协议实现简介
  14. 将mysql数据库批量导出为word三线表格形式
  15. iPad 上播放 2160p (4K) mkv 视频的方法
  16. 如何用ps裁剪规定像素的图片
  17. 什么是大小端,为什么会出现大小端,如何检测是大端还是小端
  18. 图像处理总结2、图像增强
  19. axios-前后端数据交互流程
  20. websocket 协议ping pong text

热门文章

  1. 大棚骨架搭建好 科学施肥增收增产
  2. HD 1253 胜利大逃亡(bfs)
  3. poj 2455 Secret Milking Machine(二分枚举+最大流)
  4. LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words
  5. NYOJ 767 因子和
  6. NYOJ 201 作业题
  7. hdu 1800 Flying to the Mars
  8. 关于损失函数的一些个人理解
  9. linux 配置tensorflow 全过程记录
  10. final关键字细节