|
RIA(Rich InterNET Application)為何而產(chǎn)生,它的意義何在?流行的說(shuō)法是:為Web應(yīng)用提供豐富的操作體驗(yàn),提高系統(tǒng)的友好性云云。這種看法不能說(shuō)錯(cuò),但是我希望從另一個(gè)角度來(lái)理解:為什么說(shuō)RIA的出現(xiàn)是歷史的必然,以及RIA對(duì)于多層應(yīng)用的意義究竟是什么。
我們回頭來(lái)看一看程序分層結(jié)構(gòu)發(fā)展的歷史。早期的程序是沒(méi)有什么分層的概念的,包括界面、邏輯和數(shù)據(jù)在內(nèi)的所有內(nèi)容全部編譯到單一的執(zhí)行文件中,如下圖所示:
隨著應(yīng)用程序的發(fā)展,對(duì)數(shù)據(jù)管理的需求越來(lái)越強(qiáng)烈,于是數(shù)據(jù)庫(kù)出現(xiàn)了。從而數(shù)據(jù)這一部分從應(yīng)用程序中剝離,成為獨(dú)立于編程語(yǔ)言而單獨(dú)發(fā)展的分支。數(shù)據(jù)庫(kù)的獨(dú)立發(fā)展是客戶(hù)/服務(wù)器(C/S)體系結(jié)構(gòu)的前提和必要條件,從此應(yīng)用程序發(fā)展為下圖所示的兩層結(jié)構(gòu):
數(shù)據(jù)庫(kù)與應(yīng)用程序的分離,應(yīng)用程序從單層過(guò)度到兩層,是分層體系發(fā)展歷史上的一個(gè)重大的里程碑——我個(gè)人把它叫做“應(yīng)用程序的第一次社會(huì)大分工”。
想當(dāng)然耳,有了第一次就會(huì)再有第二次。促成第二次社會(huì)大分工的是Web的蓬勃發(fā)展,HTML成為發(fā)布應(yīng)用界面的標(biāo)準(zhǔn)手段,表現(xiàn)層從邏輯層分離出來(lái),兩層結(jié)構(gòu)進(jìn)化為三層結(jié)構(gòu):
第二次社會(huì)大分工已經(jīng)發(fā)生,三層應(yīng)用成為標(biāo)準(zhǔn),那么是不是我們這個(gè)歷史時(shí)代已經(jīng)結(jié)束了呢?接下來(lái)是不是應(yīng)該開(kāi)始期待四層結(jié)構(gòu)的到來(lái)呢?我說(shuō)不是,三層結(jié)構(gòu)還沒(méi)有發(fā)展到頭,革命尚未成功,同志仍需努力。
還有什么任務(wù)還沒(méi)有完成呢?在回答這個(gè)問(wèn)題之前,請(qǐng)你先考慮這樣一個(gè)問(wèn)題,多層體系的本質(zhì)特性是什么?當(dāng)然不同的人對(duì)這個(gè)問(wèn)題會(huì)有不同的理解,就我而言,最基礎(chǔ)的觀點(diǎn)是:一個(gè)應(yīng)用究竟是不是多層應(yīng)用,要看它的每一層是不是具有獨(dú)立可替換性。換句話(huà)說(shuō),把應(yīng)用程序中的一層完全替換為其他實(shí)現(xiàn),對(duì)其他層(理論上)完全沒(méi)有影響,或者(實(shí)際上)只有很小的影響,這個(gè)應(yīng)用才能稱(chēng)為多層應(yīng)用,否則就是偽多層應(yīng)用。如果在層與層之間存在嚴(yán)重的耦合,那么分層就沒(méi)有一點(diǎn)意義了。千萬(wàn)別掛著三層的羊頭,賣(mài)著兩層或單層的狗肉(盡管狗肉不見(jiàn)得不好)。
讓我們從這個(gè)觀點(diǎn)來(lái)考察第一次社會(huì)大分工的結(jié)果。不妨問(wèn)問(wèn)以下幾個(gè)問(wèn)題:
1. 如果把應(yīng)用邏輯層從Java換成C#(或者其他語(yǔ)言,看你的實(shí)際情況),程序還能跑嗎?數(shù)據(jù)庫(kù)需要改變嗎?
回答:能。數(shù)據(jù)庫(kù)不用修改。
2. 如果把數(shù)據(jù)庫(kù)從Oracle換成Mysql(或其他數(shù)據(jù)庫(kù),同上),程序還能跑嗎?邏輯層需要改變嗎?
答:如果程序沒(méi)有依賴(lài)于某個(gè)數(shù)據(jù)庫(kù)獨(dú)有的特性,就沒(méi)有問(wèn)題。通常需要對(duì)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序和連接信息作一些修改,對(duì)于配置良好的應(yīng)用程序,這些修改是很小的。
從這些問(wèn)題我們可以認(rèn)為,兩層結(jié)構(gòu)的這一次社會(huì)大分工是非常成功、非常徹底的,數(shù)據(jù)庫(kù)和編程語(yǔ)言基本上已經(jīng)完全解耦,數(shù)據(jù)庫(kù)不再依賴(lài)于編程語(yǔ)言,編程語(yǔ)言也不再依賴(lài)數(shù)據(jù)庫(kù)。同時(shí)我要強(qiáng)調(diào)一點(diǎn),之所以能夠進(jìn)行這樣完全的解耦,主要功勞在于標(biāo)準(zhǔn)化的數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)言——SQL的存在。試想如果每種數(shù)據(jù)庫(kù)都有自己的一套完全不兼容的API會(huì)怎樣?那樣任何一個(gè)程序都會(huì)綁死在特定的數(shù)據(jù)庫(kù)上,根本談不上什么分層。
現(xiàn)在再來(lái)看一看三層的情況,同樣有如下問(wèn)題:
如果把業(yè)務(wù)邏輯層從C#切換到Java,表現(xiàn)層需要修改嗎?
問(wèn)題來(lái)了。這種情況下何止是需要修改,所有的ASP.NET Server Control全部廢掉了,除了用JSP重寫(xiě)一遍以外,別無(wú)他法。這種問(wèn)題對(duì)于Java來(lái)說(shuō)更加嚴(yán)重,因?yàn)?a href=/itjie/Javajishu/ target=_blank class=infotextkey>Java表現(xiàn)層框架可以說(shuō)是山頭林立,每個(gè)框架都有自己的一套語(yǔ)法機(jī)制,換個(gè)框架基本上就意味著推倒重來(lái)。這也是Java社區(qū)為什么從前幾年就開(kāi)始推崇“無(wú)侵入”設(shè)計(jì)理念的重要原因——切換的代價(jià)太大了。
基于此種現(xiàn)狀可以得出結(jié)論:相對(duì)于第一次大分工來(lái)說(shuō),三層應(yīng)用這一次分工是不完全、不徹底的。像ASP.NET或JSF,甚至包括ROR的RHTML,這些使用服務(wù)器生成技術(shù)的框架只能叫做偽三層應(yīng)用,因?yàn)楸憩F(xiàn)層被綁死在了特定的后端技術(shù)上,根本沒(méi)有脫離后端平臺(tái)獲得重用的機(jī)會(huì)。在這些框架里,表現(xiàn)層只能算是應(yīng)用邏輯層的附庸,還談不上是獨(dú)立的一個(gè)層。
第二次大分工還沒(méi)有完成,三層應(yīng)用還不算完整,那么誰(shuí)來(lái)發(fā)起二次革命,完成未竟的事業(yè)呢?這就引出了我在標(biāo)題提出的觀點(diǎn):RIA將完成三層體系的二次革命。
我不想再重復(fù)RIA有哪些好處、帶來(lái)什么體驗(yàn)之類(lèi)老生常談,只想說(shuō)從歷史發(fā)展來(lái)看,RIA的出現(xiàn)是時(shí)代使然,它的出現(xiàn)將補(bǔ)上三層結(jié)構(gòu)最后那缺失的一部分。從RIA技術(shù)發(fā)展的現(xiàn)狀也可以清楚的看到這種趨勢(shì):所有現(xiàn)代RIA技術(shù),包括Flash/Flex、Silverlight、Ajax、Curl等等,它們的一個(gè)基本的共同點(diǎn)就是不依賴(lài)于特定的后臺(tái)技術(shù),可以和任何服務(wù)端搭配使用。甚至可以說(shuō),不具備此特點(diǎn)的技術(shù)不應(yīng)當(dāng)稱(chēng)之為RIA。(當(dāng)然,各種RIA技術(shù)或多或少還是有一定平臺(tái)傾向,但做到平臺(tái)無(wú)關(guān)性不再是一個(gè)困難的目標(biāo))此外我在前面也說(shuō)過(guò),多層技術(shù)的發(fā)展有賴(lài)于層與層之間的標(biāo)準(zhǔn)接口,這種趨勢(shì)現(xiàn)在也已經(jīng)非常明顯。XML-RPC、SOAP、JSON、REST各種技術(shù)的不斷涌現(xiàn),無(wú)不是順應(yīng)歷史的要求,力圖解決接口標(biāo)準(zhǔn)的問(wèn)題,為三層結(jié)構(gòu)的最終實(shí)現(xiàn)奠定必要的物質(zhì)基礎(chǔ)。
Ajax是略微特殊的一個(gè)案例。盡管也稱(chēng)之為RIA,但相較Flex和Silverlight這樣完整的解決方案,許多Ajax框架還是不太容易脫離服務(wù)端生成技術(shù)。OPOA(One Page, One Application)的概念多年前就已經(jīng)出現(xiàn),其核心思想就是不要再讓服務(wù)器參與頁(yè)面生成,在瀏覽器中利用Javascript來(lái)構(gòu)造一個(gè)完整的應(yīng)用。但現(xiàn)狀來(lái)看,用Ajax實(shí)現(xiàn)OPOA在許多實(shí)例中仍然有很大難度,Ajax在所有RIA方案中對(duì)后臺(tái)的依賴(lài)性是最大的一個(gè)。不過(guò)HTML/CSS/Javascript仍然在不斷進(jìn)步,利用一些尚未標(biāo)準(zhǔn)化的技術(shù)(如Google Gears)也能解決大多數(shù)問(wèn)題,Ajax的前景應(yīng)當(dāng)還是值得期待的。
歷史大勢(shì),浩浩蕩蕩,順之者昌,逆之者亡。表現(xiàn)層脫離后臺(tái)技術(shù)的桎梏,自由獨(dú)立地發(fā)展,這已經(jīng)是確定不移的趨勢(shì)。試圖將表現(xiàn)層綁定在后臺(tái)實(shí)現(xiàn)上的技術(shù)(典型代表ASP.NET和JSF),盡管在設(shè)計(jì)上極盡精妙,終究是背離歷史發(fā)展方向的,有如再賢明的君主也無(wú)法掩蓋集權(quán)專(zhuān)制的弊端。唯有RIA,相信將會(huì)“道路越走越寬闊”。
it知識(shí)庫(kù):[觀點(diǎn)] RIA是三層應(yīng)用體系的二次革命,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。