可以用这样的思想:
最初的应用是单机,数据和功能都放在一台机器上。随着应用向工作组模式发展中,人们迫切需要
调用彼此的数据,也调用彼此的功能,这样人们就不用重复录入数据,程序员也不须重复写
功能。数据和功能先共享哪一部分?虽然说通过功能就可以把数取出来,数据在功能屏蔽之下,似乎
无须共享出来,但是功能是基于数据的,功能共享出来了,单独放在一台机器上让大家使用,但是这个功能
需要的数据在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要拆开,所以客户端也是界面和数据操作和数据显示分开,为了在界面上看到的是多个功能在一起
但实际中却各不混杂,这是个功能模块划分,不是层次划分。如果从界面观点来看,是层次问题,因为界面和功能算两个层次

不要拘泥于理论,也不要放弃理论埋头编程,而是互相借鉴前进,目的就是两个,为了业务处理需要,
为了我们好维护程序。

再看看我开头讲的历史,你会发现,历史就是为了这两个目的而变化

转载于:https://www.cnblogs.com/coollzh/archive/2004/04/03/5067.html

特老的文章:三层应该怎么划分。不知大家还有用否相关推荐

  1. 老y文章管理系统php,老y文章管理系统纯静态版

    老Y文章系统纯静态版v1.0(依照老Y官方v3.0sp1修改). 关于升级:如果没有改动下列文件,则其它文件按照老Y官方升级替换. Index.asp 修改显示首页幻灯片纯静态网页连接 Js.asp ...

  2. 网络***实战:老Y文章管理系统V2.2注入漏洞分析与利用

    网络***实战:老Y文章管理系统V2.2注入漏洞分析与利用 安天365团队     同学说让我帮忙架设一个网站,同时要保证整个网站的安全.自己开发,开玩笑,工作量巨大,还是通过网络,在别人的基础上进行 ...

  3. 被吐槽为“智商税”,老金磨方们的中式养生招牌还能挂多久?

    保健食品市场被无良企业精心策划,变成了一场"智商税"游戏. 当"养生"逐渐年轻化,保健食品市场营销玩出了新花样,一颗小小的黑芝麻丸功效居然堪比神药.保健食品市场 ...

  4. ChinaNet路由政策(较老的文章)

    针对早期的ChinaNet路由政策,可以作为参看CERNET,CNC,CMNET骨干网络的指南,现在网络核心节点一般还包括香港) 1. Chinanet骨干网结构概述 Chinanet 骨干网的拓扑结 ...

  5. [比较老的文章]三维渲染引擎 OGRE 与 OSG 的比较综述

    1 .引言 随着计算机可视化.虚拟现实技术的飞速发展,人们对实时真 实感渲染以及场景复杂度提出了更高的要求.传统的直接使用底层 图形接口如OpenGL.DirectX开发图形应用的模式越来越暴露出开 ...

  6. Action Service Dao三层的功能划分

    1. Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的.         Service是管理具体的功能的.         Action只负责管理 ...

  7. [转]Java Web基础——Action+Service +Dao三层的功能划分

    原文地址:http://blog.csdn.net/inter_peng/article/details/41021727 参考来源:http://www.xuebuyuan.com/2153333. ...

  8. Action+Service +Dao三层的功能划分

    来源:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO简介: Action是管理业务(Ser ...

  9. 很老的文章:Mapbar:地图搜索的人民战争

    把每个人身边的地理信息都反映在电子地图上,这是财大气粗的Google也无力承担的工作,但本地搜索企业Mapbar却找到了一个巧妙的办法,并且围绕地图开始了他们的生意 这是一个被搜索巨头们催生的市场,一 ...

最新文章

  1. linux Makefile中 make -C和M=的作用
  2. 重磅推荐 | 11个名企NLP项目,硅谷科学家帮你转型
  3. 【Oracle】【日期、时间】 date与数字时间戳互转
  4. python之递归函数和内建函数
  5. python加密与解密_Python加密与解密,pythonCrypt,和
  6. latex 无穷_《天龙3D》新资料片“骑乐无穷”即将上线
  7. #if defined 和 #if ! defined 的用法
  8. python3调用c代码_在Python3.6中调用C代码
  9. 海天味业打造高端调味品领衔食品美味
  10. Windows下编译sqlite3
  11. php 多元数组,php数组_php多元数组
  12. python3使用matplotlib绘制风速风向玫瑰图
  13. sharepoint 2010如何下载文件
  14. 2022 MegCup | 小模型盲降噪怎么比?资深炼丹师给你赛前指导!
  15. 联想Thinkpad E450C关闭触摸板方法
  16. python编辑函数求n阶乘fact_python中fact函数的用法
  17. 简单三步操作实现任意用户连接云服务器中的MYSQL数据库
  18. 6款超实用微信小程序,任何手机都需要!
  19. Linux编码解码指令-base64
  20. 李航 统计学习方法 课后习题答案 第二版

热门文章

  1. LeetCode 1620. 网络信号最好的坐标
  2. 05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)
  3. LintCode 1671. 玩游戏(贪心、难)
  4. LeetCode 611. 有效三角形的个数(双指针)
  5. LeetCode 686. 重复叠加字符串匹配
  6. python能做哪些客户端_发布一个Httpsqs的Python客户端
  7. crc java_java实现CRC16 MODBUS校验算法
  8. c语言分治算法求最大值,分治法找最大值(C語言)
  9. Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
  10. 论文浅尝 | 基于常识知识图谱感知和图注意力机制的对话生成