[观点] RIA是三层应用体系的二次革命_weixin_30355437的博客-程序员宝宝

技术标签: ViewUI  java  数据库  javascript  

RIARich Internet Application)为何而产生,它的意义何在?流行的说法是:为Web应用提供丰富的操作体验,提高系统的友好性云云。这种看法不能说错,但是我希望从另一个角度来理解:为什么说RIA的出现是历史的必然,以及RIA对于多层应用的意义究竟是什么。

 

我们回头来看一看程序分层结构发展的历史。早期的程序是没有什么分层的概念的,包括界面、逻辑和数据在内的所有内容全部编译到单一的执行文件中,如下图所示:


随着应用程序的发展,对数据管理的需求越来越强烈,于是数据库出现了。从而数据这一部分从应用程序中剥离,成为独立于编程语言而单独发展的分支。数据库的独立发展是客户/服务器(C/S)体系结构的前提和必要条件,从此应用程序发展为下图所示的两层结构:


数据库与应用程序的分离,应用程序从单层过度到两层,是分层体系发展历史上的一个重大的里程碑——我个人把它叫做“应用程序的第一次社会大分工”。

 

想当然耳,有了第一次就会再有第二次。促成第二次社会大分工的是Web的蓬勃发展,HTML成为发布应用界面的标准手段,表现层从逻辑层分离出来,两层结构进化为三层结构:


第二次社会大分工已经发生,三层应用成为标准,那么是不是我们这个历史时代已经结束了呢?接下来是不是应该开始期待四层结构的到来呢?我说不是,三层结构还没有发展到头,革命尚未成功,同志仍需努力。

 

还有什么任务还没有完成呢?在回答这个问题之前,请你先考虑这样一个问题,多层体系的本质特性是什么?当然不同的人对这个问题会有不同的理解,就我而言,最基础的观点是:一个应用究竟是不是多层应用,要看它的每一层是不是具有独立可替换性。换句话说,把应用程序中的一层完全替换为其他实现,对其他层(理论上)完全没有影响,或者(实际上)只有很小的影响,这个应用才能称为多层应用,否则就是伪多层应用。如果在层与层之间存在严重的耦合,那么分层就没有一点意义了。千万别挂着三层的羊头,卖着两层或单层的狗肉(尽管狗肉不见得不好)。

 

让我们从这个观点来考察第一次社会大分工的结果。不妨问问以下几个问题:

1.       如果把应用逻辑层从Java换成C#(或者其他语言,看你的实际情况),程序还能跑吗?数据库需要改变吗?

回答:能。数据库不用修改。

2.       如果把数据库从Oracle换成Mysql(或其他数据库,同上),程序还能跑吗?逻辑层需要改变吗?

答:如果程序没有依赖于某个数据库独有的特性,就没有问题。通常需要对数据库驱动程序和连接信息作一些修改,对于配置良好的应用程序,这些修改是很小的。

 

从这些问题我们可以认为,两层结构的这一次社会大分工是非常成功、非常彻底的,数据库和编程语言基本上已经完全解耦,数据库不再依赖于编程语言,编程语言也不再依赖数据库。同时我要强调一点,之所以能够进行这样完全的解耦,主要功劳在于标准化的数据库查询语言——SQL的存在。试想如果每种数据库都有自己的一套完全不兼容的API会怎样?那样任何一个程序都会绑死在特定的数据库上,根本谈不上什么分层。

 

现在再来看一看三层的情况,同样有如下问题:

如果把业务逻辑层从C#切换到Java,表现层需要修改吗?

 

问题来了。这种情况下何止是需要修改,所有的ASP.NET Server Control全部废掉了,除了用JSP重写一遍以外,别无他法。这种问题对于Java来说更加严重,因为Java表现层框架可以说是山头林立,每个框架都有自己的一套语法机制,换个框架基本上就意味着推倒重来。这也是Java社区为什么从前几年就开始推崇“无侵入”设计理念的重要原因——切换的代价太大了。

 

基于此种现状可以得出结论:相对于第一次大分工来说,三层应用这一次分工是不完全、不彻底的。像ASP.NETJSF,甚至包括RORRHTML,这些使用服务器生成技术的框架只能叫做伪三层应用,因为表现层被绑死在了特定的后端技术上,根本没有脱离后端平台获得重用的机会。在这些框架里,表现层只能算是应用逻辑层的附庸,还谈不上是独立的一个层。

 

第二次大分工还没有完成,三层应用还不算完整,那么谁来发起二次革命,完成未竟的事业呢?这就引出了我在标题提出的观点:RIA将完成三层体系的二次革命。

 

我不想再重复RIA有哪些好处、带来什么体验之类老生常谈,只想说从历史发展来看,RIA的出现是时代使然,它的出现将补上三层结构最后那缺失的一部分。从RIA技术发展的现状也可以清楚的看到这种趋势:所有现代RIA技术,包括Flash/FlexSilverlightAjaxCurl等等,它们的一个基本的共同点就是不依赖于特定的后台技术,可以和任何服务端搭配使用。甚至可以说,不具备此特点的技术不应当称之为RIA。(当然,各种RIA技术或多或少还是有一定平台倾向,但做到平台无关性不再是一个困难的目标)此外我在前面也说过,多层技术的发展有赖于层与层之间的标准接口,这种趋势现在也已经非常明显。XML-RPCSOAPJSONREST各种技术的不断涌现,无不是顺应历史的要求,力图解决接口标准的问题,为三层结构的最终实现奠定必要的物质基础。

 Ajax是略微特殊的一个案例。尽管也称之为RIA,但相较Flex和Silverlight这样完整的解决方案,许多Ajax框架还是不太容易脱离服务端生成技术。OPOA(One Page, One Application)的概念多年前就已经出现,其核心思想就是不要再让服务器参与页面生成,在浏览器中利用Javascript来构造一个完整的应用。但现状来看,用Ajax实现OPOA在许多实例中仍然有很大难度,Ajax在所有RIA方案中对后台的依赖性是最大的一个。不过HTML/CSS/Javascript仍然在不断进步,利用一些尚未标准化的技术(如Google Gears)也能解决大多数问题,Ajax的前景应当还是值得期待的。


历史大势,浩浩荡荡,顺之者昌,逆之者亡。表现层脱离后台技术的桎梏,自由独立地发展,这已经是确定不移的趋势。试图将表现层绑定在后台实现上的技术(典型代表ASP.NETJSF),尽管在设计上极尽精妙,终究是背离历史发展方向的,有如再贤明的君主也无法掩盖集权专制的弊端。唯有RIA,相信将会“道路越走越宽阔”。

转载于:https://www.cnblogs.com/shuhari/archive/2009/09/01/ria_second_revolution.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30355437/article/details/96591530

智能推荐

ubuntu16.04 rtl8821ce无线网卡wifi频繁掉线问题解决_加油加油好好工作热爱生活的博客-程序员宝宝

系统:[email protected]:~$ uname -aLinux frank 4.15.0-142-generic #146~16.04.1-Ubuntu SMP Tue Apr 13 09:27:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux刚买了电脑,连网卡都没注意什么型号,直接格式化装上ubuntu,公司都是用无线上网,结果装完系统后发现没有无线网卡驱动,不能无线上网,然后查了一下驱动型号。网卡型号:[email protected]:~$ lspci | g

pythonif条件结构的语法_带你学python基础:条件控制if与循环语句while、for 以及range函数..._weixin_39952031的博客-程序员宝宝

一、什么是条件控制条件控制用生活中的一个例子来说就是:当你去买车时,会有好多品牌,这个时候我们就需要做出选择,到底需要买哪个品牌的车,而在编程中,条件控制就是为了帮你做选择的。用专业点的话来说,条件控制语句,也可以称之为判断语句,通过一条或多条的执行结果来决定接下来要执行的代码块。上图就是一个条件控制。二、if条件控制简单的说if条件控制有多种表达的形式。最简单的if语句只有一个判断一个操作。语法...

android webview 调用js方法不起作用 jquery,在Android webview中没有调用Javascript函数_俞军的博客-程序员宝宝

我正在制作一个在android webview中运行的应用程序.我面临一个奇怪的问题,我的JavaScript函数未被调用< a>< / a> onClick方法.这是我的html和JavaScript代码:function openFileDialog(){//$("#file").click();alert("Test");}enctype="multipart/for...

多目标、多阶段、多层次的强化学习合作方法_当交通遇上机器学习的博客-程序员宝宝

1 文章信息COOPERATIVE MULTI-GOAL MULTI-STAGE MULTI-AGENT REINFORCEMENT LEARNING。这是佐治亚理工学院发表在计算机顶级会...

NAND FLASH学习笔记之MTD下nand flash驱动(六)_中華田園犬的博客-程序员宝宝

六、驱动层之Flash读操作MTD对NAND芯片的读写 主要分三部分: A、struct mtd_info中的读写函数,如read,write_oob等,这是MTD原始设备层与FLASH硬件层之间的接口; B、struct nand_ecc_ctrl中的读写函数,如read_page_raw,write_page等,主要用来做一些与ecc有关的操作; C、struct nand_c

随便推点

LeetCode 74. 搜索二维矩阵_余 一的博客-程序员宝宝

注:该篇文章会与我的个人博客同步更新。欢迎移步https://cqh-i.github.io/体验更好的阅读效果。题目描述编写一个高效的算法来判断m∗nm*nm∗n矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例 1:输入:matrix = [[1, 3, 5, 7...

UVa 12250 Language Detection (water ver.)_uva12250_synapse7的博客-程序员宝宝

12250 - Language DetectionTime limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3402English, Spanish, German, F

技术学习报告(Flask、Echarts、js、html、css)_Tgmmmmmmmm的博客-程序员宝宝

基本对一些技术进行了了解,确定是否可用以及如何使用

CentOS7下Cloudera ManagerCDH-5.11安装配置详解_什么是cm-5.11.0_张老湿的博客-程序员宝宝

最近一直在研究spark的实时计算,公司说最近可能会用CDH来替代Apache的hadoop,于是研究了一下怎么使用Cloudera Manager来安装CDH(以前一直都是手动安装的,不得不说Cloudera Manager实在是方便了很多),最方便的是不用考虑各种hadoop生态圈的版本问题,大赞在网上看到了一些安装教程都太老旧了,按照上面的配置,自己安装的时候还出了不少岔子,于是自己写了

51单片机之程序下载不进单片机_51单片机程序下载不进去_游戏绝缘体的博客-程序员宝宝

单片机初学者在自己学完AD或者立创EDA时,总会自己做一块属于自己的开发板,但是在最开始的时候,往往会遇到程序下载不进去的情况。常见原因有以下几种:1、在电路布局的时候把晶振电路放的离单片机过远,导致晶振不起振。从而下不进去程序。2、在STC程序烧录软件里面选择的程序下载波特率太高,导致程序下载不进去。一般我们默认下载的最低波特率为2400。3、单片机的RXD和TXD对应接到了下载器的RXD和TXD,而实际上,它们是交叉连接的,因为单片机的“发”,对应下载器的“收”,单片机的“收”,对应下载器的“发”

推荐文章

热门文章

相关标签