[觀點] RIA是三層應用體系的二次革命

作者: Shuhari  來源: 博客園  發布時間: 2009-09-02 09:58  閱讀: 2405 次  推薦: 1   原文鏈接   [收藏]  

  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各種技術的不斷涌現,無不是順應歷史的要求,力圖解決接口標準的問題,為三層結構的最終實現奠定必要的物質基礎。

  Ajax是略微特殊的一個案例。盡管也稱之為RIA,但相較Flex和Silverlight這樣完整的解決方案,許多Ajax框架還是不太容易脫離服務端生成技術。OPOA(One Page, One Application)的概念多年前就已經出現,其核心思想就是不要再讓服務器參與頁面生成,在瀏覽器中利用Javascript來構造一個完整的應用。但現狀來看,用Ajax實現OPOA在許多實例中仍然有很大難度,Ajax在所有RIA方案中對后臺的依賴性是最大的一個。不過HTML/CSS/Javascript仍然在不斷進步,利用一些尚未標準化的技術(如Google Gears)也能解決大多數問題,Ajax的前景應當還是值得期待的。

  歷史大勢,浩浩蕩蕩,順之者昌,逆之者亡。表現層脫離后臺技術的桎梏,自由獨立地發展,這已經是確定不移的趨勢。試圖將表現層綁定在后臺實現上的技術(典型代表ASP.NET和JSF),盡管在設計上極盡精妙,終究是背離歷史發展方向的,有如再賢明的君主也無法掩蓋集權專制的弊端。唯有RIA,相信將會“道路越走越寬闊”。

1
0
 
標簽:RIA
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()