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