好的軟體架構設計

來源:互聯網
上載者:User
什麼是架構

前言:軟體設計師中有一些技術水平較高、經驗較為豐富的人,他們需要承擔軟體系統的架構設計,也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用,以及系統中邏輯的、物理的、系統的重要決定的作出。在很多公司中,架構師不是一個專門的和正式的職務。通常在一個開發小組中,最有經驗的程式員會負責一些架構方面的工作。在一個部門中,最有經驗的專案經理會負責一些架構方面的工作。但是,越來越多的公司體認到架構工作的重要性。

  什麼是軟體系統的架構(Architecture)?一般而言,架構有兩個要素:

  ·它是一個軟體系統從整體到部分的最高層次的劃分。

  一個系統通常是由元件組成的,而這些元件如何形成、相互之間如何發生作用,則是關於這個系統本身結構的重要訊息。

  詳細地說,就是要包括架構元件(Architecture Component)、連接器(Connector)、任務流(Task-flow)。所謂架構元素,也就是組成系統的核心"磚瓦",而連接器則描述這些元件之間通訊的路徑、通訊的機制、通訊的預期結果,任務流則描述系統如何使用這些元件和連接器完成某一項需求。

  ·建造一個系統所作出的最高層次的、以後難以更改的,商業的和技術的決定。

  在建造一個系統之前會有很多的重要決定需要事先作出,而一旦系統開始進行詳細設計甚至建造,這些決定就很難更改甚至無法更改。顯然,這樣的決定必定是有關係統設計成敗的最重要決定,必須經過非常謹慎的研究和考察。

  電腦軟體的曆史開始於五十年代,曆史非常短暫,而相比之下建築工程則從石器時代就開始了,人類在幾千年的建築設計實踐中積累了大量的經驗和教訓。建築設計基本上包含兩點,一是建築風格,二是建築模式。獨特的建築風格和恰當選擇的建築模式,可以使一個獨一無二。

  下面的照片顯示了中美洲古代瑪雅建築,Chichen-Itza大金字塔,九個巨大的石級堆壘而上,九十一級台階(象徵著四季的天數)奪路而出,塔頂的神殿聳入雲天。所有的數字都如日曆般嚴謹,風格雄渾。難以想象這是石器時代的建築物。


圖1、位於墨西哥Chichen-Itza(在瑪雅語中chi意為嘴chen意為井)的古瑪雅建築。(攝影:作者)

  軟體與人類的關係是架構師必須面對的核心問題,也是自從軟體進入曆史舞台之後就出現的問題。與此類似地,自從有了建築以來,建築與人類的關係就一直是建築設計師必須面對的核心問題。英國首相丘吉爾說,我們構造建築物,然後建築物構造我們(We shape our buildings, and afterwards our buildings shape us)。英國下議院的會議廳較狹窄,無法使所有的下議院議員面向同一個方向入座,而必須分成兩側入座。丘吉爾認為,議員們入座的時候自然會選擇與自己政見相同的人同時入座,而這就是英國政黨制的起源。Party這個詞的原意就是"方"、"面"。政黨起源的關鍵就是建築物對人的影響。

  在軟體設計界曾經有很多人認為功能是最為重要的,形式必須服從功能。與此類似地,在建築學界,現代主義建築流派的開創人之一Louis Sullivan也認為形式應當服從於功能(Forms follows function)。

  幾乎所有的軟體設計理念都可以在浩如煙海的建築學曆史中找到更為遙遠的曆史迴響。最為著名的,當然就是模式理論和XP理論。

  架構的目標是什麼

  正如同軟體本身有其要達到的目標一樣,架構設計要達到的目標是什麼呢?一般而言,軟體架構設計要達到如下的目標:

  ·可靠性(Reliable)。軟體系統對於使用者的商業經營和管理來說極為重要,因此軟體系統必須非常可靠。

  ·安全行(Secure)。軟體系統所承擔的交易的商業價值極高,系統的安全性非常重要。

  ·可擴充性(Scalable)。軟體必須能夠在使用者的使用率、使用者的數目增加很快的情況下,保持合理的效能。只有這樣,才能適應使用者的市場擴充得可能性。

  ·可定製化(Customizable)。同樣的一套軟體,可以根據客戶群的不同和市場需求的變化進行調整。

  ·可擴充性(Extensible)。在新技術出現的時候,一個軟體系統應當允許匯入新技術,從而對現有系統進行功能和效能的擴充

  ·可維護性(Maintainable)。軟體系統的維護包括兩方面,一是排除現有的錯誤,二是將新的軟體需求反映到現有系統中去。一個易於維護的系統可以有效地降低支援人員的花費

  ·客戶體驗(Customer Experience)。軟體系統必須便於使用。

  ·市場時機(Time to Market)。軟體使用者要面臨同業競爭,軟體供應商也要面臨同業競爭。以最快的速度爭奪市場先機非常重要。

  架構的種類

  根據我們關注的角度不同,可以將架構分成三種:

  ·邏輯架構、軟體系統中元件之間的關係,比如使用者介面,資料庫,外部系統介面,商業邏輯元件,等等。

  比如下面就是筆者親身經曆過的一個軟體系統的邏輯架構圖

 

圖2、一個邏輯架構的例子

  從上面這張圖中可以看出,此系統被劃分成三個邏輯層次,即表象層次,商業層次和資料持久層次。每一個層次都含有多個邏輯元件。比如WEB伺服器層次中有HTML服務元件、Session服務元件、安全服務元件、系統管理元件等。

  ·物理架構、軟體元件是怎樣放到硬體上的。

  比如下面這張物理架構圖描述了一個分佈於北京和上海的分布式系統的物理架構,圖中所有的元件都是物理裝置,包括網路分流器、Proxy 伺服器、WEB伺服器、應用伺服器、報表伺服器、整合伺服器、儲存伺服器、主機等等。

 

圖3、一個物理架構的例子

  ·系統架構、系統的非功能性特徵,如可擴充性、可靠性、強壯性、靈活性、效能等。

  系統架構的設計要求架構師具備軟體和硬體的功能和效能的過硬知識,這一工作無疑是架構設計工作中最為困難的工作。

  此外,從每一個角度上看,都可以看到架構的兩要素:元件劃分和設計決定。

  首先,一個軟體系統中的元件首先是邏輯元件。這些邏輯元件如何放到硬體上,以及這些元件如何為整個系統的可擴充性、可靠性、強壯性、靈活性、效能等做出貢獻,是非常重要的資訊。

  其次,進行軟體設計需要做出的決定中,必然會包括邏輯結構、物理結構,以及它們如何影響到系統的所有非功能性特徵。這些決定中會有很多是一旦作出,就很難更改的。

  根據作者的經驗,一個基於資料庫的系統架構,有多少個資料表,就會有多少頁的架構設計文檔。比如一個中等的資料庫應用系統通常含有一百個左右的資料表,這樣的一個系統設計通常需要有一百頁左右的架構設計文檔。

  架構師

  軟體設計師中有一些技術水平較高、經驗較為豐富的人,他們需要承擔軟體系統的架構設計,也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用,以及系統中邏輯的、物理的、系統的重要決定的作出。

  這樣的人就是所謂的架構師(Architect)。在很多公司中,架構師不是一個專門的和正式的職務。通常在一個開發小組中,最有經驗的程式員會負責一些架構方面的工作。在一個部門中,最有經驗的專案經理會負責一些架構方面的工作。

  但是,越來越多的公司體認到架構工作的重要性,並且在不同的組織層次上設定專門的架構師位置,由他們負責不同層次上的邏輯架構、物理架構、系統架構的設計、配置、維護等工作。

軟體的架構設計

好的開始相當於成功一半

開始之初的架構設計決定著軟體產品的生死存亡。“好的開始相當於成功一半”。

開始的架構設計也是最難的,需要調研同類產品的情況以及技術特徵,瞭解當前世界上對這種產品所能提供的理論支援和技術平台支援。再結合自己項目的特點(需要透徹的系統分析),才能逐步形成自己項目的架構藍圖。

比如要開發網站引擎系統,就從Yahoo的個人首頁產生工具到虛擬機器主機商提供的網站自動產生系統,以及IBM Webphere Portal的特點和局限 從而從架構設計角度定立自己產品的位置。

好的設計肯定需要經過反覆修改,從簡單到複雜的迴圈測試是保證設計正確的一個好辦法

由於在開始選擇了正確的方向,後來項目的實現過程也驗證了這種選擇,但在一些架構設計的細部方面,還需要對方案進行修改,屬於那種螺旋上升的方式,顯然這是通過測試第一的思想和XP工程方法來實現的。

如果我們開始的架構設計在技術平台定位具有一定的世界先進水平,那麼,項目開發實際有一半相當於做實驗,是研發,存在相當的技術風險。

因此,一開始我們不可能將每個需求都實現,而是採取一種簡單完成架構流程的辦法,使用最簡單的需求將整個架構都簡單的完成一遍(加入人工幹預),以檢驗各個技術環節是否能協調配合工作(非常優秀先進的兩種技術有時無法在一起工作),同時也可以探知技術的深淺,掌握項目中的技術難易點。這個過程完成後,我們就對設計方案做出上面的重大修改,豐富完善了設計方案。

設計模式是支撐架構的重要組件

架構設計也類似一種工作流程,它是動態,這點不象建築設計那樣,一開始就能完全確定,架構設計伴隨著整個項目的進行過程之中,有兩種具體操作保證架構設計的正確完成,那就是設計模式(靜態)和工程項目方法(RUP或XP 動態)。

設計模式是支撐架構的一種重要組件,這與建築有很相象的地方,一個建築物建立設計需要建築架構設計,在具體施工中,有很多建築方面的規則和模式。

我們從J2EE藍圖模式分類http://java.sun.com/blueprints/patterns/catalog.html中就可以很清楚的看到J2EE這樣一個架構軟體的架構與設計模式的關係。

架構設計是骨架,設計模式就是肉

這樣,一個比較豐富的設計方案可以交由程式員進一步完成了,載輔助以適當的工程方法,這樣就可保證項目的架構設計能正確快速的完成。

時刻牢記架構設計的目標

由於架構設計是在動態中完成的,因此在把握架構設計的目標上就很重要,因此在整個項目過程中,甚至每一步我們都必須牢記我們架構設計的總體目標,可以概括下面幾點:

1. 最大化的重用:這個重用包括組件重用 和設計模式使用等多個方面。

比如,我們項目中有使用者註冊和使用者權限系統驗證,這其實是個通用課題,每個項目只是有其內容和一些細微的差別,如果我們之前有這方面成功研發經驗,可以直接重用,如果沒有,那麼我們就要進行這個子項目的研發,在研發過程中,不能僅僅看到這個項目的需求,也要以架構的概念去完成這個可以稱為組件的子項目。

2. 儘可能的簡單明了:我們解決問題的總方向是將複雜問題簡單化,其實這也是中介軟體或多層體系技術的根本目標。但是在具體實施設計過程中,我們可能會將簡單問題複雜化,特別是設計模式的運用上很容易範這個錯誤,因此如何儘可能的做到設計的簡單明了是不容易的。

我認為落實到每個類的具體實現上要真正能體現系統事物的本質特徵,因為事物的本質特徵只有一個,你的代碼越接近它,表示你的設計就是簡單明了,越簡單明了,你的系統就越可靠。更多情況是,一個類並不能反應事物本質,需要多個類的組合協調,那麼能夠正確使用合適的設計模式就稱為重中之重。

我們看一個具備好的架構設計的系統代碼時,基本看到的都是設計模式,寵物店(pet store)就是這樣的例子。或者可以這樣說,一個好的架構設計基本是由簡單明了的多個設計模式完成的。

3. 最靈活的拓展性:架構設計要具備靈活性 拓展性,這樣,使用者可以在你的架構上進行二次開發或更加具體的開發。

要具備靈活的拓展性,就要站在理論的高度去進行架構設計,比如現在工作流程概念逐步流行,因為我們具體很多實踐項目中都有工作流程的影子,工作流程中有一個樹形結構許可權設定的概念就對很多領域比較通用。

樹形結構是組織資訊的基本形式,我們現在看到的網站或者ERP前台都是以樹形菜單來組織功能的,那麼我們在進行架構設計時,就可以將樹形結構和功能分開設計,他們之間聯絡可以通過樹形結構的節點link在一起,就象我們可以在聖誕樹的樹枝上掛各種小禮品一樣,這些小禮品就是我們要實現的各種功能。

有了這個概念,通常比較難實現的使用者層級許可權控制也有了思路,將具體使用者或組也是和樹形結構的節點link在一起,這樣就間接實現了使用者對相應功能的許可權控制,有了這樣的基本設計方案的架構無疑具備很靈活的拓展性。 

如何設計架構? 2007-07-19 11:11 來源: 作者: 網友評論 0 條 瀏覽次數 26

Part 1 層

    層(layer)這個概念在電腦領域是非常了不得的一個概念。電腦本身就體現了一種層的概念:系統調用層、裝置驅動層、作業系統層、CPU指令集。每個層都負責自己的職責。網路同樣也是層的概念,最著名的TCP/IP的七層協議。

    層到了軟體領域也一樣好用。為什麼呢?我們看看使用層技術有什麼好處:

    ● 你使用層,但是不需要去瞭解層的實現細節。
    ● 可以使用另一種技術來改變基礎的層,而不會影響上面的層的應用。
    ● 可以減少不同層之間的依賴。
    ● 容易制定出層標準。
    ● 底下的層可以用來建立頂上的層的多項服務。

    當然,層也有弱點:

    ● 層不可能封裝所有的功能,一旦有功能變動,勢必要波及所有的層。
    ● 效率降低。

當然,層最難的一個問題還是各個層都有些什麼,以及要承擔何種責任。

典型的三層結構

    三層結構估計大家都很熟悉了。就是表示(presentation)層, 領域(domain)層, 以及基礎架構(infrastructure)層。

    展示層邏輯主要處理使用者和軟體的互動。現在最流行的莫過於視窗圖形介面(wimp)和基於html的介面了。展示層的主要職責就是為使用者提供資訊,以及把使用者的指令翻譯。傳送給業務層和基礎架構層。

    基礎架構層邏輯包括處理和其他系統的通訊,代表系統執行任務。例如資料庫系統互動,和其他應用系統的互動等。大多數的資訊系統,這個層的最大的邏輯就是儲存持久資料。

    還有一個就是領域層邏輯,有時也被叫做商務邏輯。它包括輸入和儲存資料的計算。驗證展示層來的資料,根據展示層的指令指派一個基礎架構層邏輯。

    領域邏輯中,人們總是搞不清楚什麼事領域邏輯,什麼是其它邏輯。例如,一個銷售系統中有這樣一個邏輯:如果本月銷售量比上個月增長10%,就要用紅色標記。要實現這個功能,你可能會把邏輯放在展示層中,比較兩個月的數字,如果超出10%,就標記為紅色。

    這樣做,你就把領域邏輯放到了展示層中了。要分離這兩個層,你應該現在領域層中提供一個方法,用來比較銷售數位增長。這個方法比較兩個月的數字,並返回boolean類型。展示層則簡單的調用該方法,如果返回true,則標記為紅色。

例子

    層技術不存在說永恒的技巧。如何使用都要看具體的情況才能夠決定,下面我就列出了三個例子:

    例子1:一個電子商務系統。要求能夠同時處理大量使用者的請求,使用者的範圍遍及全球,而且數字還在不斷增長。但是領域邏輯很簡單,無非是訂單的處理,以及和庫存系統的串連部分。這就要求我們1、展示層要友好,能夠適應最廣泛的使用者,因此採用html技術;2、支援分布式的處理,以勝任同時幾千的訪問;3、考慮未來的升級。

    例子2:一個租借系統。系統的使用者少的多,但是領域邏輯很複雜。這就要求我們製作一個領域邏輯非常複雜的系統,另外,還要給他們的使用者提供一個方便的輸入介面。這樣,wimp是一個不錯的選擇。

    例子3:簡單的系統。非常簡單,使用者少、邏輯少。但是也不是沒有問題,簡單意味著要快速交付,並且還要充分考慮日後的升級。因為需求在不斷的增加之中。

何時分層

    這樣的三個例子,就要求我們不能夠一概而論的解決問題,而是應該針對問題的具體情況制定具體的解決方案。這三個例子比較典型。

    第二個例子中,可能需要嚴格的分成三個層次,而且可能還要加上另外的中介(mediating)層。例3則不需要,如果你要做的僅是查看資料,那僅需要幾個server頁面來放置所有的邏輯就可以了。

    我一般會把展示層和領域層/基礎架構層分開。除非領域層/基礎架構層非常的簡單,而我又可以使用工具來輕易的綁定這些層。這種兩層架構的最好的例子就是在VB、PB的環境中,很容易就可以構建出一個基於SQL資料庫的windows介面的系統。這樣的展示層和基礎架構層非常的一致,但是一旦驗證和計算變得複雜起來,這種方式就存在先天缺陷了。

    很多時候,領域層和基礎架構層看起來非常類似,這時候,其實是可以把它們放在一起的。可是,當領域層的商務邏輯和基礎架構層的組織方式開始不同的時候,你就需要分開二者。

更多的層模式

    三層的架構是最為通用的,尤其是對IS系統。其它的架構也有,但是並不適用於任何情況。

    第一種是Brown model [Brown et al]。它有五個層:展示層(Presentation),控制/中介層(Controller/Mediator),領域層(Domain), 資料對應層(Data Mapping), 和資料來源層(Data Source)。它其實就是在三層架構種增加了兩個中介層。控制/中介層位於展示層和領域層之間,資料對應層位於領域層和基礎架構層之間。

    展示層和領域層的中介層,我們通常稱之為表示-領域中介層,是一個常用的分層方法,通常針對一些非可視的控制項。例如為特定的展示層組織資訊格式,在不同的視窗間導航,處理交易邊界,提供Server的facade介面(具體實現原理見設計模式)。最大的危險就是,一些領域邏輯被放到這個層裡,影響到其它的展示層。

    我常常發現把行為分配給展示層是有好處的。這可以簡化問題。但展示層模型會比較複雜,所以,把這些行為放到非可視化的對象中,並提取出一個表示-領域中介層還是值得的。

    Brown ISA
    展示層 展示層
   控制/中介層 表示-領域中介層
    領域層 領域層
    資料對應層 資料庫互動模式中的Database Mapper
    資料來源層 基礎架構層

    領域層和基礎架構層之間的中介層屬於本書中提到的Database Mapper模式,是三種領域層到資料連線的辦法之一。和表示-領域中介層一眼,有時候有用,但不是所有時候都有用。

    還有一個好的分層架構是J2EE的架構,這方面的討論可以見『J2EE核心模式』一書。他的分層是客戶層(Client),展示層(Presentation),業務層(Business ),整合層(Integration),資源層(Resource)。差別如:

    J2EE核心 ISA
    客戶層 運行在客戶機上的展示層
   展示層 運行在伺服器上的展示層
    業務層 領域層
    整合層 基礎架構層
    資源層 基礎架構層通訊的外部資料

    微軟的DNA架構定義了三個層:展示層(presentation),業務層(business),和資料存放區層(data access),這和我的架構相似,但是在資料的傳遞方式上還有很大的不同。在微軟的DNA中,各層的操作都基於資料存放區層傳出的SQL查詢結果集。這樣的話,實際上是增加了展示層和業務層同資料存放區層之間的耦合度。

    DNA的記錄集在層之間的動作類似於Data Transfer Object。
    

Part 2 組織領域邏輯

    要組織基於層的系統,首要的是如何組織領域邏輯。領域邏輯的組織有好幾種模式。但其中最重要的莫過於兩種方法:Transation Script和Domain Model。選定了其中的一種,其它的都容易決定。不過,這兩者之間並沒有一條明顯的分界線。所以如何選取也是門大學問。一般來說,我們認為領域邏輯比較複雜的系統可以採用Domain Model。

    Transation Script就是對錶示層使用者輸入的處理常式。包括驗證和計算,儲存,調用其它系統的操作,把資料回傳給展示層。使用者的一個動作表示一個程式,這個程式可以是script,也可以是transation,也可以是幾個子程式。在例子1中,檢驗,在購物車中增加一本書,顯示遞送狀態,都可以是一個Transation Script。

    Domain Model是要建立對應領網域名稱詞的模型,例如例1中的書、購物車等。檢驗、計算等處理都放到領域模型中。

    Transation Script屬於結構性思維,Domain Model屬於OO思維。Domain Model比較難使用,一旦習慣,你能夠組織更複雜的邏輯,你的思想會更OO。到時候,即使是小的系統,你也會自然的使用Domain Model了。

    但如何抉擇呢?如果邏輯複雜,那肯定用Domain Model:如果只需要存取資料庫,那Transation Script會好一些。但是需求是在不斷進化的,你很難保證以後的需求還會如此簡單。如果你的團隊不善於使用Domain Model,那你需要權衡一下投入產出比。另外,即使是Transation Script,也可以做到把邏輯和基礎架構分開,你可以使用Gateway。

    對例2,毫無疑問要使用Domain Model。對例1就需要權衡了。而對於例3,你很難說它將來會不會像例2那樣,你現在可以使用Transation Script,但未來你可能要使用Domain Model。所以說,架構的決策是至關緊要的。

    除了這兩種模式,還有其它中庸的模式。Use Case Controller就是處於兩者之間。只有和單個的用例相關的商務邏輯才放到對象中。所以大致上他們還是在使用Transation Script,而Domain Model只是Database Gateway的一組集合而已。我不太用這種模式。

    Table Module是另一個中庸模式。很多的GUI環境依託於SQL查詢的返回結果。你可以建立記憶體中的對象,來把GUI和資料庫分開來。為每個表寫一個模組,因此每一行都需要關鍵字變數來識別每一個執行個體。

    Table Module適用於很多的組件構建於一個通用關係型資料庫之上,而且領域邏輯不太複雜的情況。Microsoft COM 環境,以及它的帶ADO.NET的.NET環境都適合使用這種模式。而對於Java,就不太適用了。

    領域邏輯的一個問題是領域對象非常的臃腫。因為對象的行為太多了,類也就太大了。它必須是一個超集。這就要考慮哪些行為是通用的,哪些不是,可以由其它的類來處理,可能是Use Case Controller,也可能是展示層。

    還有一個問題,複製。他會導致複雜和不一致。這比臃腫的危害更大。所以,寧可臃腫,也不要複製。等到臃腫為害時再處理它吧。

選擇一個地方運行領域邏輯

    我們的精力集中在邏輯層上。領域邏輯要麼運行在Client上,要麼運行在Server上。

    比較簡單的做法是全部集中在Server上。這樣你需要使用html的前端以及web server。這樣做的好處是升級和維護都非常的簡單,你也不用考慮案頭平台和Server的同步問題,也不用考慮案頭平台的其它軟體的相容問題。

    運行在Client適合於要求快速反應和沒有連網的情況。在Server端的邏輯,使用者的一個再小的請求,也需要資訊從Client到Server繞一圈。反應的速度必然慢。再說,網路的覆蓋程度也不是說達到了100%。

    對於各個層來說,又是怎麼樣的呢?

    基礎架構層:一般都是在Server啦,不過有時候也會把資料複製到合適的高效能案頭機,但這是就要考慮同步的問題了。

    展示層在何處運行取決於使用者介面的設計。一個Windows介面只能在Client運行。而一個Web介面就是在Server運行。也有特別的例子,在案頭機上運行web server的,例如X Server。但這種情況少的多。

    在例1中,沒有更多的選擇了,只能選在Server端。因此你的每一個bit都會繞一個大圈子。為了提高效率,盡量使用一些純html指令碼。

    人們選用Windows介面的原因主要就是需要執行一些非常複雜的任務,需要一個合適的應用程式,而web GUI則無法勝任。這就是例2的做法。不過,人們應該會漸漸適應web GUI,而web GUI的功能也會越來越強大。

    剩下的是領域邏輯。你可以全部放在Server,也可以全部放在Client,或是兩邊都放。

    如果是在Client端,你可以考慮全部邏輯都放在Client端,這樣至少保證所有的邏輯都在一個地方。而把web server移至Client,是可以解決沒有連網的問題,但對反應時間不會有多大的協助。你還是可以把邏輯和展示層分離開來。當然,你需要額外的升級和維護的工作。

    在Client和Server端都具有邏輯並不是一個好的處理辦法。但是對於那些僅有一些領域邏輯的情況是適用的。有一個小竅門,把那些和系統的其它部分沒有聯絡的邏輯封裝起來。

領域邏輯的介面

    你的Server上有一些領域邏輯,要和Client通訊,你應該有什麼樣的介面呢?要麼是一個http介面,要麼是一個OO介面。

    http介面適用於web browser,就是說你要選擇一個html的展示層。最近的新技術就是web service,通過基於http、特別是XML進行通訊。XML有幾個好處:通訊量大,結構好,僅需一次的迴路。這樣遠程調用的的開銷就小了。同時,XML還是一個標準,支援平台異構。XML又是基於文本的,能夠通過防火牆。

    雖然XML有那麼多的好處,不過一個OO的介面還是有它的價值的。hhtp的介面不明顯,不容易看清楚資料是如何處理的。而OO的介面的方法帶有變數和名字,容易看出處理的過程。當然,它無法通過防火牆,但可以提供安全和事務之類的控制。

    最好的還是取二者所長。OO介面在下,http介面在上。但這樣做就會使得實現機制非常的複雜。

 

Part 3 組織web Server

    很多使用html方式的人,並不能真正理解這種方式的優點。我們有各種各樣好用的工具,但是卻搞到讓程式難以維護。

    在web server上組織程式的方式大致可以分為兩種:指令碼和server page。

    指令碼方式就是一個程式,用函數和方法來處理http調用。例如CGI指令碼和java servlet。它和普通的程式並沒有什麼兩樣。它從web頁面上獲得html string形態的資料,有時候還要做一些運算式匹配,這正是perl能夠成為CGI指令碼的常用語言的原因。而java servelet則是把這種分析留給程式員,但它允許程式員通過關鍵字介面來訪問資訊,這樣就會少一些運算式的判斷。這種格式的web server輸出是另一種html string,稱為response,可以通過流資料來操作。

    糟糕的是流資料是非常麻煩的,因此就導致了server page的產生,例如PHP,ASP,JSP。

    server page的方式適合回應(response)的處理比較簡單的情況。例如“顯示歌曲的明細”,但是你的決策取決於輸入的時候,就會比較雜亂。例如“通俗和搖滾的顯示格式不同”。

    腳步擅長於處理使用者互動,server page擅長於處理格式化回應資訊。所以很自然的就會採用指令碼處理請求的互動,使用server page處理回應的格式化。這其實就是著名的MVC(Model View Controller)模式中的view/controller的處理。

web server端的MVC工作流程

    應用Model View Controller模式首要的一點就是模型要和web服務完全分離開來。使用Transaction Script或Domain Model模式來封裝處理流程。

    接下來,我們就把剩餘的模式歸入兩類模式中:屬於Controller的模式,以及屬於View的模式。

View模式

    View這邊有三種模式:Transform View,Template View和Two Step View。Transform View和Template View的處理只有一步,將領域資料轉換為html。Two Step View要經過兩步的處理,第一步把領域資料轉換為邏輯表示形式,第二步把邏輯表示轉換為html。

    兩步處理的好處是可以將邏輯集中於一處,如果只有一步,變化發生時,你就需要修改每一個螢幕。但這需要你有一個很好的邏輯螢幕結構。如果一個web應用有很多的前端使用者時,兩步處理就特別的好用。例如航空訂票系統。使用不同的第二步處理,就可以獲得不同的邏輯螢幕。

    使用單步方法有兩個可選的模式:Template View,Transform View。Template View其時就是把代碼嵌入到html頁面中,就像現在的server page技術,如ASP,PHP,JSP。這種模式靈活,強大,但顯得雜亂無章。如果你能夠把邏輯程式邏輯在頁面結構之外進行很好的組織,這種模式還是有它的優點的。

    Transform View使用翻譯方式。例如XSLT。如果你的領域資料是用XML處理的,那這種模式就特別的好用。

Controller模式

    Controller有兩種模式。一般我們會根據動作來決定一項控制。動作可能是一個按鈕或連結。所這種模式就是Action Controller模式。

    Front Controller更進一步,它把http請求的處理和處理邏輯分離開來。一般是只有一個web handle來處理所有的請求。你的所有的http請求的處理都由一個對象來負責。你改變動作結構的影響就會降到最小

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.