RIA(Rich 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.NET或JSF,甚至包括ROR的RHTML,这些使用服务器生成技术的框架只能叫做伪三层应用,因为表现层被绑死在了特定的后端技术上,根本没有脱离后端平台获得重用的机会。在这些框架里,表现层只能算是应用逻辑层的附庸,还谈不上是独立的一个层。
第二次大分工还没有完成,三层应用还不算完整,那么谁来发起二次革命,完成未竟的事业呢?这就引出了我在标题提出的观点:RIA将完成三层体系的二次革命。
我不想再重复RIA有哪些好处、带来什么体验之类老生常谈,只想说从历史发展来看,RIA的出现是时代使然,它的出现将补上三层结构最后那缺失的一部分。从RIA技术发展的现状也可以清楚的看到这种趋势:所有现代RIA技术,包括Flash/Flex、Silverlight、Ajax、Curl等等,它们的一个基本的共同点就是不依赖于特定的后台技术,可以和任何服务端搭配使用。甚至可以说,不具备此特点的技术不应当称之为RIA。(当然,各种RIA技术或多或少还是有一定平台倾向,但做到平台无关性不再是一个困难的目标)此外我在前面也说过,多层技术的发展有赖于层与层之间的标准接口,这种趋势现在也已经非常明显。XML-RPC、SOAP、JSON、REST各种技术的不断涌现,无不是顺应历史的要求,力图解决接口标准的问题,为三层结构的最终实现奠定必要的物质基础。
历史大势,浩浩荡荡,顺之者昌,逆之者亡。表现层脱离后台技术的桎梏,自由独立地发展,这已经是确定不移的趋势。试图将表现层绑定在后台实现上的技术(典型代表ASP.NET和JSF),尽管在设计上极尽精妙,终究是背离历史发展方向的,有如再贤