三层应该怎么划分(发现很多朋友对三层的划分仍然有很多问题,所以集中说一下自己的观点)[阿朱原创](0分)

  • 主题发起人 主题发起人 阿朱
  • 开始时间 开始时间

阿朱

Unregistered / Unconfirmed
GUEST, unregistred user!
可以用这样的思想:
最初的应用是单机,数据和功能都放在一台机器上。随着应用向工作组模式发展中,人们迫切需要
调用彼此的数据,也调用彼此的功能,这样人们就不用重复录入数据,程序员也不须重复写
功能。数据和功能先共享哪一部分?虽然说通过功能就可以把数取出来,数据在功能屏蔽之下,似乎
无须共享出来,但是功能是基于数据的,功能共享出来了,单独放在一台机器上让大家使用,但是这个功能
需要的数据在A,B,C,D...上分布着,到底是谁?所以必须先共享数据。所以才有了C/S模式
一边是数据库,大家都对着这台机器访问数据,一边是大量的客户端,程序都在每台机器上。
随着部门间计算模式的发展,一个系统想存取另一个系统的数据,但是表结构已经很复杂了,
业务逻辑也已经错综复杂了,你已经不可能独自写一段程序存取另一个系统的数据。这时只能合作,
让对方写一个功能,给你开放出来,你一调用就能得到你想要的结果。但是这个功能写好是该放到哪台机器上吗?
肯定不可能放在每个客户端上,又需要单独放在一个机器上,于是C/S/S产生了
这是一个历史,你就明白了三层该放什么东西。
当然也顺便,就是另一些系统不调用的功能也放在了这个公共组件服务器上,来减少数据库连接
虽然有的文章上说这样可以减少更换程序的成本,这点倒不敢苟同,因为从实际开发中,如果客户端是GUI的,
你的很多改动会和GUI改变有关,你还得更新。如果你客户端是WEB,你还必须是三层,因为你客户端什么都没有
至于划分数据层,业务逻辑层只是为了引导你面向对象思考。说是为了更容易的修改,而不影响另一层,这个也是
比较困难,因为往往客户要求多显示一些东西或少显示一些东西,可以这样查,可以那样查,所以
往往数据层的SQL语句老变化,而且大多不能在原SQL上改,因为参数,字段或许都不一样,你改了,客户段的取数就很容易出错,
你也不敢保证它会在什么功能中被公用到,所以往往是又增加一个新SQL,和原SQL看起来90%一样,但又不完全一样。
客户端界面也老变,有时业务校验规则也不一样,业务处理方式也不一样,所以每层都需要改变
往往一个数据对象由两三张关系数据表组成,
在数据层表现为数据对象,但是由于业务处理的重点不一样,也为了速度考虑,取最必要的字段,
所以在这个数据对象中有各种各样的SQL,而不是一个SQL,但是每个SQL都是反映了这个数据对象的一个方面
然后写一些函数,专门针对这些数据对象做业务处理,还有一些函数专门负责数据校验,如不可为空,主键重复,类型出错等
在业务逻辑层分出两枝,一枝是业务逻辑规则校验,在其中也调用着数据层的数据校验规则,
另一枝是业务处理,就是调用数据层的各个函数来组合完成一件事,形成一个流程
总结一下,SQL一般都写在数据层,这是很自然的,业务逻辑层就是组合功能。不管数据层的函数
还是业务逻辑层的数据都和业务相关,对于数据层与业务无关的说法,在实际中行不通,因为在模型上
说,我们写在数据层上的那些接口方法应该是单独又分出一层,叫真正的业务逻辑层,而我这里写的业务
逻辑层,模型中叫Facade,就是为了简化客户端调用而做的外壳。但个人认为,模型中单分出一层意义不大,
因为每层都需要修改,少一层就好修改一些。而且纯粹的面向对象系统在世界上也从来没有存在过,如果
存在,那必定是一个理论家的东西,而不能实用,就象在实际中我们在设计关系型数据库时先三范式,后为了简化
编程和提供速度而反三范式。
客户端也不是多个功能放一个PAS文件中。因为客户往往要求功能组合。如A要和B功能放在一个界面,
B和C要拆开,所以客户端也是界面和数据操作和数据显示分开,为了在界面上看到的是多个功能在一起
但实际中却各不混杂,这是个功能模块划分,不是层次划分。如果从界面观点来看,是层次问题,因为界面和功能算两个层次
不要拘泥于理论,也不要放弃理论埋头编程,而是互相借鉴前进,目的就是两个,为了业务处理需要,
为了我们好维护程序。
再看看我开头讲的历史,你会发现,历史就是为了这两个目的而变化
 
“不要拘泥于理论,也不要放弃理论埋头编程”
我认为它总有个基础, 你说的我看了好几遍,还没看懂 ,
能不能用简单的几句话, 来说明你的观点, 以及三层体系结构的划分
 
听讲。 提前。
 
欧不太同意老兄的观点:
"SQL一般都写在数据层,这是很自然的..."
这要看什么样的SQL,如果是映射业务逻辑的,一定要放在业务层。
其实,大家不妨可以看看J2EE的构架,里面对presentation layer, logic layer,
persisitance layer描述得很清楚,是一个非常好的构架。
 
简单可以这么来说
我们为什么会有三层?
就是为了共享数据,共享业务逻辑处理
在三层中我们为什么会有数据层?
因为多个业务会涉及同一个数据对象,所以不能每个业务对象中都自己建立一个数据对象,那样就冗余了
在三层中我们为什么会有业务逻辑层?
因为一个业务与多个数据对象有关,如果我们把一个业务逻辑写在一个数据对象上,应该写在哪个数据对象上,所以必须单独分出来一个业务对象,来调用多个数据对象的功能,来组合完成一件事情
数据层的每个数据对象的校验是针对每个数据对象的
逻辑层的每个逻辑对象的校验是针对整个流程的
客户端为了功能可拆可合,所以功能在开发时不与固定的界面相连,即业务处理代码与界面操作无关,根据客户定制需要,把多个功能组合在一个界面中
J2EE由于是很理想化的框架,所以在真正搭建系统时我们也只是在遵照大框架的基础上做
裁剪,否则非常容易引起类爆炸和速度慢,所以我才说不要拘泥于理论
 
TO 阿朱:
文笔非常不错,您应该考虑写本书,象HUBDOG,NICROSOFT等.
 
我也想了解这方面的知识!
 
TO 阿朱,你能不能举个例子。
其实,理论都是抽象的。
 
接受答案了.
 
后退
顶部