三层中的业务封装

好久没来这里,我来尝试着为初学者做一个入门讲座。
业务:客户的需求描述稍作整理,就可以认为是业务
业务逻辑:业务的计算机具体实现,对于数据库应用来说,往往可以具体为一个SQL语句
你现在正跟客户进行关于工资模块需求的交谈:
客户说,我想要查某个部门的工资表,有时需要查某个人的工资表,这个工资表是按月查询的
你现在可以根据这个需求建立这样的工资服务模型(基于Com+):
mtsSalary.dll
function GetMonthSalaryByDep(DepartmnetId:WideString;Month:int;
   out Data:OleVariant)
function GetMonthSalaryByEmp(EmpId:WideString;Month:int
   out Data:OleVariant)
以上两个函数事实上是Mts的接口
第一个函数的实现核心:
select * from Salary where Dep_id=:DepartmnetId and Month=:Month
第二个函数:
select * from Salary where Emp_id=:EmpId and Month=:Month
封装业务逻辑的基本要求:
不要随便在客户端传递sql语句,典型地,客户调用某个服务的某个方法(接口),传递调用参数,客户端不知道数据库的存在
以下是客户端的调用原型:
function GetMonthSalaryByDep(DepartmnetId:WideString;Month:int)
var oSalary: ISalary
  Data:OleVariant;
begin
  oSalary:=CoSalary.CreateRemote(ServerName) as   ISalary;
  oSalary.GetMonthSalaryByDep(DepartmnetId,Month,Data);
//do something show the data;
  oSalary:=nil;
end;
以上只是伪代码,这种设计方法,代码实现与需求描述相当一致 


  谢谢你的讲解。
  还是有些不明白,如果像这样,都封装为接口,我觉得有二个问题:
  1、双方要协定那个OleVariant的格式
  2、服务端要组成一个大包后发出,客户端要解包后才能显示处理,这效率不是很低? 

程序员的成长历程
接到了一个开发任务:
为航天飞机设计一个驾驶方法


入门者:
TForm1.Button1Click(Sender:TObject);
begin
  加燃料
  开门
  进去
  穿航天服(刚才忘了,后来补进来的)
  启动
  呵呵,飞起来了
  (代码超过1000行)
end;


学了一点OO概念:
T航天飞机
  private
  加燃料
  开门
  进去
  穿航天服
  public
   驾驶
end;


完美的OO主义者:
T飞行器
  proitate
  ...
  public
   驾驶 Virtural
end;

T航天飞机=class(T飞行器)
  proitate
  ...
  public
   驾驶 Virtural
end;


拆分狂:
把"T航天飞机"封装为Com+,
在这基础上作了ASP封装,WEBService封装,
或者,J2EE,Corba, .net ...
交待他的团队:A写WEB飞行界面,B写ActiveX飞行界面,C写...


反扑归真:
航天飞机.pas
interface
  function 驾驶:boolean;
implimentation
  procedure 加燃料 ;forward;
  procedure 开门 ;forward;
  procedure 进去 ;forward;
  procedure 穿航天服  ;forward;
end;
然后交待他的团队完成其他任务


回 :

还是有些不明白,如果像这样,都封装为接口,我觉得有二个问题:
  1、双方要协定那个OleVariant的格式
     在DELPHI中,一般使用MIDAS技术,其格式就是TClientDataSet.data
     用Xml封装也是一种常用方法
  2、服务端要组成一个大包后发出,客户端要解包后才能显示处理,这效率不是很低?
  一般的入门者,在客户端用DComConnection ,效率是一样的
  对于多层结构编程,每次不要访问(传输)大量数据是基本要求
  以Com+ & WEBService技术来举例:
  一个数据包经过这样的传输过程:
database->com+->WebService->客户
传输过程中还涉及到编码、解码
性能确实有问题,所以对每个细节都要精心设计


首先肯定得说:多层系统绝对是要比两层系统要效率低,道理说白了很简单,本来数据从生产商直接到最终顾客,现在数据被多个中间商倒手,不慢才怪。
下面我来谈谈,多层系统中提升效率的几个关键点:
1,层次尽量简单,数据在层次之间进行传递,效率非常低下,因为数据经过不断的封包、解包过程,而数据封包解包过程是影响效率最直接的原因,所以一定不要让数据在中间层之间进行传递。
2,接口事务明晰,采用不同事务模式的接口执行效率是不同的,所以不需要事务的地方一定使用不支持事务的接口,尽量减少不必要的性能耗费,而需要事务的接口也要明确判断所需的事务类型。
3,取数尽量精简,大量数据的存取对于多层系统是致命的危害,所以取数应选择最少的不可缺少的列,尽量采用条件取数,该取数时再取数,不要动不动就把数据取一遍。
4,提交事务短暂,事务的发起和结束在尽量短的时间内完成,不要发起事务之后再做很多编辑计算工然后才提交,尤其对于一些公用的表,一定不要长时间占用,否则一个操作执行,其它操作都无法进行,你会死得很惨得。
5,数据库设计合理,字段使用不要洋洋洒洒,一定要合理设置类型和长度,效率来源于点点滴滴,数字类型比字符类型的效率要高很多,多使用视图和存储过程,存储过程的使用对于执行效率和程序的可维护性都大有裨益,而触发器最好少用,对于效率和危害性都有很大影响。 

posted @ 2010-11-26 00:02  覆雨翻云  阅读(793)  评论(0编辑  收藏  举报