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,相信將會“道路越走越寬闊”。