陳 寶
提要軟件開發(fā)過程中的分層模式是最常見的一種架構(gòu)模式,甚至說分層模式是很多架構(gòu)模式的基礎(chǔ)。軟件開發(fā)采用分層模式能夠?qū)⒏鱾€功能分開,實現(xiàn)相對獨立的開發(fā)模式。分層模式的關(guān)鍵點在于確定依賴,即通過分層,可以限制子系統(tǒng)間的依賴關(guān)系,使系統(tǒng)以更松散的方式耦合,從而更易于維護。
關(guān)鍵詞:分層模式;架構(gòu);三層
中圖分類號:F49 文獻標識碼:A
一、分層設(shè)計的概念
分層描述是這樣一種架構(gòu)設(shè)計過程:從最低級別的抽象開始,稱為第1層,這是系統(tǒng)的基礎(chǔ)。通過將第J層放置在第J-1層的上面逐步向上完成抽象階梯,直到到達功能的最高級別,稱為第N層。因而分層模式可以定義為:將解決方案的組件分割到不同的層中。每一層中的組件應保持內(nèi)聚性,并且應大致在同一抽象級別,每一層都與它下面的各層保持松散耦合。
架構(gòu)這個詞從它出現(xiàn)后,就有許許多多的程序員、架構(gòu)師們激烈地討論著它的發(fā)展,但是架構(gòu)一詞的出現(xiàn),卻是隨著三層架構(gòu)的出現(xiàn)才出現(xiàn)的。當然,目前應用三層架構(gòu)開發(fā)也正是業(yè)界最關(guān)注的主題。那么,這里我們來看看單層、雙層、三層甚至多層架構(gòu)到底是怎么一回事。單層結(jié)構(gòu)是20世紀八十年代以來小型應用的結(jié)構(gòu),在那個結(jié)構(gòu)化編程充斥的時代,還沒有出現(xiàn)架構(gòu)的概念,典型的是基于Dbase、Foxbase等小型數(shù)據(jù)庫的應用。雙層結(jié)構(gòu)的同義詞可以理解為傳統(tǒng)的客戶/服務器結(jié)構(gòu),盡管是目前占統(tǒng)治地位的結(jié)構(gòu),但其封裝移植等方面的缺陷,已使它步入暮年,典型是基于Oracle、Infomix等大型數(shù)據(jù)庫的C/S應用。三層結(jié)構(gòu)是傳統(tǒng)的客戶/服務器結(jié)構(gòu)的發(fā)展,代表了企業(yè)級應用的未來,典型的有Web下的應用。多層結(jié)構(gòu)和三層結(jié)構(gòu)的含義是一樣的,只是細節(jié)有所不同。之所以會有雙層、三層這些提法,是因為應用程序要解決三個層面的問題。
二、三層架構(gòu)的劃分
三層架構(gòu)是一種“客戶端-服務器”架構(gòu),在此架構(gòu)中,用戶接口、商業(yè)邏輯、數(shù)據(jù)保存以及數(shù)據(jù)訪問被設(shè)計為獨立的模塊。主要有三個層面:第一層,表現(xiàn)層,GUI層;第二層,商業(yè)對象,商業(yè)邏輯層;第三層,數(shù)據(jù)訪問層。這些層可以單獨開發(fā),單獨測試。
為什么要把程序代碼分為三層?把用戶接口層、商業(yè)邏輯層、數(shù)據(jù)訪問層分離有許多的優(yōu)點:
1、系統(tǒng)比較容易遷移。商業(yè)邏輯層與數(shù)據(jù)訪問層是分離的,修改數(shù)據(jù)訪問層不會影響到商業(yè)邏輯層。系統(tǒng)如果從用SQL Server存儲數(shù)據(jù)遷移到用Oracle存儲數(shù)據(jù),并不需要修改商業(yè)邏輯層組件和GUI組件。
2、系統(tǒng)容易修改。假如在商業(yè)層有一個小小的修改,我們不需要在用戶的機器上重裝整個系統(tǒng),只需要更新商業(yè)邏輯組件就可以了。
3、應用程序開發(fā)人員可以并行,獨立的開發(fā)單獨的層。
在一個典型的三層架構(gòu)應用程序中,應用程序的用戶工作站包括提供圖形用戶界面(GUI)的程序設(shè)計和具體的應用程序入口表格或交互式窗口。
事務邏輯處在局域網(wǎng)(LAN)服務器或其他共享主機上,它作為響應工作站所發(fā)出客戶請求的服務器,而相對于處于大型機的第三層它是作為客戶端,并且決定需要什么數(shù)據(jù)以及數(shù)據(jù)存儲在哪里。第三層包括數(shù)據(jù)庫以及處理讀寫以及訪問數(shù)據(jù)庫的程序,然而應用程序的設(shè)計可能比這個架構(gòu)要復雜,對于大型程序來說,這個三層模式是一種比較簡便的考慮方法。
這種應用程序的設(shè)計使用客戶/服務器模式,各層可以同時開發(fā),并且可以由不同的程序員組用不同的語言來開發(fā)。因為各個層次的開發(fā)不會影響其他層次,所以這種模型對于進一步開發(fā)軟件是很方便的。
有時候 “三層”編起來比較麻煩,在ASP.NET 2.0里,訪問數(shù)據(jù)和顯示出來只要拖兩個控件就可以了(AccessDataSource/SQLDatasource和GridView),幾分鐘一個頁面就出來了,而且還具備了修改中、刪除、分頁、排序等功能,而用三層架構(gòu)就麻煩多了,先要寫數(shù)據(jù)訪問層的代碼,接著寫業(yè)務邏輯層的代碼(要調(diào)用數(shù)據(jù)層的方法),最后才是表示層,也就是頁面的設(shè)計,還要調(diào)用業(yè)務邏輯層的代碼讀取數(shù)據(jù)。(注意:表示層是絕對不會訪問數(shù)據(jù)層的內(nèi)容,只能通過業(yè)務層。業(yè)務層在這里是連接它們的橋梁,所以說業(yè)務層是最重要的一層)既然這樣,為什么還要用三層呢?前面提到的一層架構(gòu)的一個很大的問題就是前臺和后臺代碼沒有很好地分開,不利于分工,并且不利于日后的維護和升級。如果是個人主頁或者是一些一個人完成的小系統(tǒng),用一層還是挺方便的。如果是一些比較大的系統(tǒng),特別是企業(yè)級的應用,就非用三層甚至n層不可了。一般三層就夠了,再劃分更多只會增加設(shè)計和編碼的難度。
三、如何分層
怎么樣分層符合三層架構(gòu)原則呢?主要有以下三種分層方式:
1、數(shù)據(jù)層不包含任何代碼,只有數(shù)據(jù)庫,還有相關(guān)的存儲過程。這種模式下,數(shù)據(jù)層看起來就變得很簡單了。只包含所建立的數(shù)據(jù)庫和一些存儲過程(注意是存儲過程)。其實這些存儲過程的建立也是相當復雜的,因為它們可以完成除數(shù)據(jù)訪問外的其他一些很強大的功能,如分頁、實現(xiàn)搜索算法等。數(shù)據(jù)訪問的邏輯就都放在業(yè)務層,當然業(yè)務層還包含其他一些邏輯代碼。我們來看一個示例,假設(shè)數(shù)據(jù)庫里有一個表BOOKS(書),建立一個存儲過程GetAllBooks,用來讀取書的信息,這樣在業(yè)務層里編一個方法GetBookS()和一個公用數(shù)據(jù)庫訪問類,GetBooks()就通過數(shù)據(jù)庫訪問類打開連接,執(zhí)行在存儲過程,返回數(shù)據(jù)(返回類型可以是DataTable,DataSet,DataReader或者實體類)。業(yè)務層單獨編譯成一個或者幾個DLL文件。接著就是表示層了,表示層通過調(diào)用GetBookS()返回數(shù)據(jù)綁定在相關(guān)的控件里。業(yè)務層的方法都是在表示層調(diào)用。一般來說book.aspx和book.aspx.cs都是表示層的內(nèi)容,所有前臺的設(shè)計、相關(guān)控件、數(shù)據(jù)緩存都是屬于表示層。
2、數(shù)據(jù)層還包含所有公共數(shù)據(jù)訪問代碼。這種模式和前一種差別不大,主要是把數(shù)據(jù)訪問代碼留到數(shù)據(jù)層。這樣可以很方便地實現(xiàn)對多數(shù)據(jù)庫的支持。業(yè)務邏輯層直接調(diào)用數(shù)據(jù)層的相關(guān)訪問數(shù)據(jù)的代碼,完全不必了解底層是什么數(shù)據(jù)庫。其他和前一種沒什么分別。
3、所有數(shù)據(jù)讀取都放在數(shù)據(jù)層。這種模式下像前面所述的GetBooks()方法都是放在數(shù)據(jù)層,在業(yè)務層再定義一個GetBookS()方法以供表示層調(diào)用。這種模式下業(yè)務層不但不必了解底層是什么數(shù)據(jù)庫,而且連數(shù)據(jù)庫的結(jié)構(gòu)都不必了解了,這是最標準的三層架構(gòu)了,在Microsoft的PetShop 4.0里就是這種模式。
四、結(jié)束語
本文三層架構(gòu)主要向大家展示的實際上就是一種程序設(shè)計的思想,不管是三層架構(gòu)還是設(shè)計模式,它們都是軟件工程面向?qū)ο笏枷氲耐耆w現(xiàn)。目前,我國家軟件業(yè)相對來說是很落后的,關(guān)鍵問題是軟件企業(yè)的急功近利和程序員還停留在結(jié)構(gòu)化思想上,不能說你在程序中用的是類就說你的思想是面向?qū)ο?,也不是說你會使用java編寫程序,就說自己懂得面向?qū)ο?,希望大家能一起進步,直正理解面向?qū)ο蟆?/p>
(作者單位:唐山學院)
參考文獻:
[1]伽瑪?shù)戎?,李英軍等譯,設(shè)計模式——可復用面向?qū)ο筌浖幕A(chǔ),第1版,機械工業(yè)出版社,2005.
[2](美)梅茨克爾(Metsker,S.J.),(美)韋克(Wake,W.C.)著,軟件工程設(shè)計導論:過程、原理與模式(UML2.0版),人民郵電出版社,2007.
[3](美)沙洛韋(Shalloway,A.)等著,設(shè)計模式精解(英文版·第二版),機械工業(yè)出版社,2006.