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

可以用这样的思想:
最初的应用是单机,数据和功能都放在一台机器上。随着应用向工作组模式发展中,人们迫切需要
调用彼此的数据,也调用彼此的功能,这样人们就不用重复录入数据,程序员也不须重复写
功能。数据和功能先共享哪一部分?虽然说通过功能就可以把数取出来,数据在功能屏蔽之下,似乎
无须共享出来,但是功能是基于数据的,功能共享出来了,单独放在一台机器上让大家使用,但是这个功能
需要的数据在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Guava RateLimiter限流原理解析

来源:https://zhuanlan.zhihu.com/p/60979444 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级。限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等。 限流的目的是通过…

脑洞大开:未来二十年将兴起的88个微型产业

来源:资本实验室概要:目前,我们正在进入一个指数级技术变革的时代。这个时代既催生出前所未有的科技巨头,其实也催生了一个微型创新的新时代。目前,我们正在进入一个指数级技术变革的时代。这个时代既催生出前所未有的…

并查集算法c语言版,并查集及其C程序实现.doc

并查集及其C程序实现等价关系与等价类从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意对象x,y, z,下列性质成立&#xff1a…

Web 服务策略断言语言 (WS-PolicyAssertions)

原文:http://www.microsoft.com/china/msdn/library/webservices/webservices/WebServicesPolicyAssertionsLanguage(WS-PolicyAssertions).mspxWeb 服务策略断言语言 (WS-PolicyAssertions) 发布日期: 4/26/2004| 更新日期: 4/26/2004版本 1…

周志华:严肃的研究者就不该去触碰强人工智能

来源:知识分子概要:关于人工智能,长期存在两种不同的目标或者理念。关于人工智能,长期存在两种不同的目标或者理念。一种是希望借鉴人类的智能行为,研制出更好的工具以减轻人类智力劳动,一般称为“弱人工智…

几种限流器(RateLimiter)原理与实现

来源:https://blog.csdn.net/netyeaxi/article/details/104270337 限流器(RateLimiter)主要有两种算法: 漏桶算法 令牌桶算法 它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经…

c语言如何随机选择入口,c语言随机排列-----适用于初学者

本程序只是实现了基本的数字随机排列,如有不懂,留言提问。。。// 随机排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "time.h"#include "stdio.h"#include "stdlib.h"int _tmain(int …

The Best and the Worst

Joe Sanders has the most beautiful garden in our town. Nearly everybody enters for “The Nicest Garden Competition” each year,but Joe wins every time.Bill Friths garden is larger than Joes.Bill works harder than Joe and grows more flowlers and vegetables,…

guava限流器RateLimiter原理及源码分析

来源:https://www.cnblogs.com/zhandouBlog/p/11743660.html 前言 RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行处理,当然他并不是一个分布式限流器,只是对单机进行限流。它可以应用在定时拉取接…

185页深度报告 扒一扒AI金融的老底【附下载】

来源:智东西概要:2016年,中国爆出8家独角兽,总估值964亿美元位冠全球;2017年,毕马威全球百佳金融科技企业前三甲,蚂蚁金服、众安保险、趣店,皆来自中国;过往两年&#xf…

夹娃娃动画Android,手机模拟抓娃娃

手机模拟抓娃娃让你通过手机足不出户也能感受娃娃机的乐趣,萌趣的卡通形象,清新治愈的设计风格,简单上手的玩法,赶快加入进来冲击最高分吧,点击下载手机模拟抓娃娃开始你的挑战!手机模拟抓娃娃介绍手机模拟抓娃娃游戏是一款模拟进行的真人在线抓娃娃的掌上控制的休闲…

Inline Method(内联函数)

一个函数的本体与名称同样清楚易懂 int getRating() {return moreThanFiveLateDeliveries() ? 2 : 1; }boolean moreThanFiveLateDeliveries() {return numberOfLateDelivers > 5; } 重构后 int getRating() {return (numberOfLateDelivers > 5) ? 2 : 1; }

XML 简单操作

<?xml:namespace prefix o /> <?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Oberons Legacy</title> <author>Corets, Ev…

android友盟错误日志,Taro(React-native)集成友盟错误日志分析U-App移动统计

1、先去友盟官网注册应用&#xff0c;获取到appkey&#xff0c;友盟移动统计分析U-App&#xff0c;这个步骤就不贴出来了&#xff0c;需要注意的是ios和Android 不能使用同一个appkey&#xff0c;需要分别创建两个应用&#xff0c;应用名称可以在后面加上平台名称&#xff0c;例…

2018年中国新零售市场研究报告——概念、模式与案例【附下载】

来源&#xff1a;亿欧概要&#xff1a;“新零售” 之“新”在于顺势下的“变化”&#xff0c;不应该局限于“阿里巴巴的新零售”。报告尝试从一个更宽广的视角&#xff0c;对当前零售业变化的背景和各种驱动因素进行分析&#xff0c;总结当下时间段零售行业参与者的新动作&…

[导入]ASP.NET 配置节架构

ASP.NET 配置节架构文章来源:http://blog.csdn.net/21aspnet/archive/2004/11/04/167417.aspx转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/11/05/816261.html

重构--思维导图

#原图 System.out.println("https://www.processon.com/view/60fa8c441e085366ea4c2b9e?fromnew1");

Android代码导出数据库,导入/导出到android sqlite数据库

我看过几篇关于如何在android中导入和导出数据库的帖子,我找到了这些代码,但我似乎无法使它工作.我收到错误java.io.filenotfoundexception / storage / sdcard0 / BackupFolder / DatabaseName&#xff1a;打开失败的ENOENT(没有这样的文件或目录).我改变了一些东西,但我仍然没…

谷歌Jeff Dean团队提出利用深度学习对「电子健康记录」数据进行分析,可提高医疗诊断预测的准确性

原文来源&#xff1a;arXiv作者&#xff1a;Alvin Rajkomar、Eyal Oren、Kai Chen、Andrew M. Dai、Nissan Hajaj、Peter J. Liu、Xiaobing Liu, Mimi Sun、Patrik Sundberg、Hector Yee、Kun Zhang、Yi Zhang、Gavin E. Duggan、Gerardo Flores、Michaela Hardt、Jamie Irvine…

想太多……

想太多总是伤神&#xff0c;不晓得是因为早上打针打太多了还是晚上想太多了&#xff0c;现在有点头疼…… 被成全的人&#xff0c;应该是幸福的人&#xff0c;还有什么好抱怨的呢……亲眼看到成全我的人的痛苦&#xff0c;难道不应该更珍惜现在的快乐和幸福么&#xff1f; 不去…