Shuhari

[观点] RIA是三层应用体系的二次革命

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,相信将会“道路越走越宽阔”。

posted on 2009-09-01 17:50  Shuhari  阅读(3582)  评论(21编辑  收藏  举报

导航