软件的三层架构
全然看不懂
基于軟件三層架構(gòu)的研究報(bào)告
引言
三層結(jié)構(gòu)是傳統(tǒng)的客戶/server結(jié)構(gòu)的發(fā)展,代表了企業(yè)級(jí)應(yīng)用的未來(lái),典型的有Web下的應(yīng)用。多層結(jié)構(gòu)和三層結(jié)構(gòu)的含義是一樣的,僅僅是細(xì)節(jié)有所不同。之所以會(huì)有雙層、三層這些提法,是由于應(yīng)用程序要解決三個(gè)層面的問(wèn)題。
一、軟件架構(gòu)和分層
(一)軟件架構(gòu)(software architecture)
是一系列相關(guān)的抽象模式,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì)。軟件架構(gòu)是一個(gè)系統(tǒng)的草圖。軟件架構(gòu)描寫(xiě)敘述的對(duì)象是直接構(gòu)成系統(tǒng)的抽象組件。各個(gè)組件之間的連接則明白和相對(duì)仔細(xì)地描寫(xiě)敘述組件之間的通訊。在實(shí)現(xiàn)階段,這些抽象組件被細(xì)化為實(shí)際的組件,比方詳細(xì)某個(gè)類(lèi)或者對(duì)象。在面向?qū)ο箢I(lǐng)域中,組件之間的連接通經(jīng)常使用接口(計(jì)算機(jī)科學(xué))來(lái)實(shí)現(xiàn)。軟件體系結(jié)構(gòu)是構(gòu)建計(jì)算機(jī)軟件實(shí)踐的基礎(chǔ)。與建筑師設(shè)定建筑項(xiàng)目的設(shè)計(jì)原則和目標(biāo),作為繪圖員繪圖的基礎(chǔ)一樣,一個(gè)軟件架構(gòu)師或者系統(tǒng)架構(gòu)師陳述軟件構(gòu)架以作為滿足不同客戶需求的實(shí)際系統(tǒng)設(shè)計(jì)方案的基礎(chǔ)。
(二)分層
分層是表示將功能進(jìn)行有序的分組:應(yīng)用程序?qū)S霉δ芪挥谏蠈樱缭綉?yīng)用程序領(lǐng)域的功能位于中層,而配置環(huán)境專用功能位于低層。分層從邏輯上將子系統(tǒng)劃分成很多集合,而層間關(guān)系的形成要遵循一定的規(guī)則。通過(guò)分層,能夠限制子系統(tǒng)間的依賴關(guān)系,使系統(tǒng)以更松散的方式耦合,從而更易于維護(hù)。子系統(tǒng)的分組標(biāo)準(zhǔn)包括下面幾條規(guī)則可見(jiàn)度。各子系統(tǒng)僅僅能與同一層及其下一層的子系統(tǒng)存在依賴關(guān)系。
(三)使用分層架構(gòu)開(kāi)發(fā)的必要性
1、分層設(shè)計(jì)同意你切割功能進(jìn)入不同區(qū)域。換句話說(shuō)層在設(shè)計(jì)是就是邏輯組件的分組。比如,A層能夠訪問(wèn)B層,但B層不能訪問(wèn)A 層。
2、用分層的方法,以提高應(yīng)用程序的可維護(hù)性,并使其更easy擴(kuò)展,以提高性能。
(四)設(shè)計(jì)分層的原則
1、層意味著組建的邏輯分組。比如,對(duì)用戶界面,業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn)組建應(yīng)該使用不同的不同的層。
2、在一個(gè)層內(nèi)組建應(yīng)該聚合的。如業(yè)務(wù)層組建僅應(yīng)提供與業(yè)務(wù)邏輯相關(guān)的操作,而不是提供其它操作。
3、在設(shè)計(jì)的每個(gè)層接口時(shí)要考慮好物理邊界。假設(shè)通信擴(kuò)月了物理邊界,使用基于消息操作;否則使用基于對(duì)象操作。
4、考慮使用接口類(lèi)型(interface)來(lái)定義每層的接口。這將同意你創(chuàng)建該接口的不同實(shí)現(xiàn),提高可測(cè)性。
5、對(duì)于Web應(yīng)用程序,在表示層和業(yè)務(wù)邏輯層之間實(shí)現(xiàn)基于消息的接口是一個(gè)好主意,即使這兩層沒(méi)有跨越物理邊界。基于消息的接口更適合于無(wú)狀態(tài)的Web操作。
二、軟件的三層架構(gòu)
(一)概述
在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或稱為領(lǐng)域?qū)樱⒈硎緦印?strong>
1、表示層(UI):通俗講就是展現(xiàn)給用戶的界面,即用戶在使用一個(gè)系統(tǒng)的時(shí)候他的所見(jiàn)所得。
2、業(yè)務(wù)邏輯層(BLL):針對(duì)詳細(xì)問(wèn)題的操作,也能夠說(shuō)是對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理。
3、數(shù)據(jù)訪問(wèn)層(DAL):該層所做事務(wù)直接操作數(shù)據(jù)庫(kù),針對(duì)數(shù)據(jù)的增添、刪除、改動(dòng)、查找等。
(二)三層結(jié)構(gòu)原理:
3個(gè)層次中,系統(tǒng)主要功能和業(yè)務(wù)邏輯都在業(yè)務(wù)邏輯層進(jìn)行處理。
所謂三層體系結(jié)構(gòu),是在client與數(shù)據(jù)庫(kù)之間增加了一個(gè)“中間層”,也叫組件層。這里所說(shuō)的三層體系,不是指物理上的三層,不是簡(jiǎn)單地放置三臺(tái)機(jī)器就是三層體系結(jié)構(gòu),也不唯獨(dú)B/S應(yīng)用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即使這三個(gè)層放置到一臺(tái)機(jī)器上。三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問(wèn)、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,client不直接與數(shù)據(jù)庫(kù)進(jìn)行交互,而是通過(guò)COM/DCOM通訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫(kù)進(jìn)行交互。
(三)各層的作用
數(shù)據(jù)訪問(wèn)層:
有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn),能夠訪問(wèn)數(shù)據(jù)庫(kù)系統(tǒng)、二進(jìn)制文件、文本文檔或是XML文檔。簡(jiǎn)單的說(shuō)法就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的Select,Insert,Update,Delete的操作。假設(shè)要增加ORM的元素,那么就會(huì)包含對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化。主要是對(duì)原始數(shù)據(jù)(數(shù)據(jù)庫(kù)或者文本文件等存放數(shù)據(jù)的形式)的操作層,而不是指原始數(shù)據(jù),也就是說(shuō),是對(duì)數(shù)據(jù)的操作,而不是數(shù)據(jù)庫(kù),詳細(xì)為業(yè)務(wù)邏輯層或表示層提供數(shù)據(jù)服務(wù)。
業(yè)務(wù)邏輯層:
主要是針對(duì)詳細(xì)的問(wèn)題的操作,也能夠理解成對(duì)數(shù)據(jù)層的操作,對(duì)數(shù)據(jù)業(yè)務(wù)邏輯處理,假設(shè)說(shuō)數(shù)據(jù)層是積木,那邏輯層就是對(duì)這些積木的搭建。業(yè)務(wù)邏輯層(Business Logic Layer)無(wú)疑是系統(tǒng)架構(gòu)中體現(xiàn)核心價(jià)值的部分。它的關(guān)注點(diǎn)主要集中在業(yè)務(wù)規(guī)則的制定、業(yè)務(wù)流程的實(shí)現(xiàn)等與業(yè)務(wù)需求有關(guān)的系統(tǒng)設(shè)計(jì),也即是說(shuō)它是與系統(tǒng)所應(yīng)對(duì)的領(lǐng)域(Domain)邏輯有關(guān),非常多時(shí)候,也將業(yè)務(wù)邏輯層稱為領(lǐng)域?qū)印1热鏜artin Fowler在《Patternsof Enterprise Application Architecture》一書(shū)中,將整個(gè)架構(gòu)分為三個(gè)基本的層:表示層、領(lǐng)域?qū)雍蛿?shù)據(jù)源層。作為領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的先驅(qū)Eric
Evans,對(duì)業(yè)務(wù)邏輯層作了更仔細(xì)地劃分,細(xì)分為應(yīng)用層與領(lǐng)域?qū)樱ㄟ^(guò)分層進(jìn)一步將領(lǐng)域邏輯與領(lǐng)域邏輯的解決方式分離。 業(yè)務(wù)邏輯層在體系架構(gòu)中的位置非常關(guān)鍵,它處于數(shù)據(jù)訪問(wèn)層與表示層中間,起到了數(shù)據(jù)交換中承上啟下的作用。由于層是一種弱耦合結(jié)構(gòu),層與層之間的依賴是向下的,底層對(duì)于上層而言是“無(wú)知”的,改變上層的設(shè)計(jì)對(duì)于其調(diào)用的底層而言沒(méi)有不論什么影響。假設(shè)在分層設(shè)計(jì)時(shí),遵循了面向接口設(shè)計(jì)的思想,那么這樣的向下的依賴也應(yīng)該是一種弱依賴關(guān)系。因而在不改變接口定義的前提下,理想的分層式架構(gòu),應(yīng)該是一個(gè)支持可抽取、可替換的“抽屜”式架構(gòu)。正由于如此,業(yè)務(wù)邏輯層的設(shè)計(jì)對(duì)于一個(gè)支持可擴(kuò)展的架構(gòu)尤為關(guān)鍵,由于它扮演了兩個(gè)不同的角色。對(duì)于數(shù)據(jù)訪問(wèn)層而言,它是調(diào)用者;對(duì)于表示層而言,它卻是被調(diào)用者。依賴與被依賴的關(guān)系都糾結(jié)在業(yè)務(wù)邏輯層上,怎樣實(shí)現(xiàn)依賴關(guān)系的解耦,則是除了實(shí)現(xiàn)業(yè)務(wù)邏輯之外留給設(shè)計(jì)師的任務(wù)。
表示層:
位于最外層(最上層),離用戶近期。用于顯示數(shù)據(jù)和接收用戶輸入的數(shù)據(jù),為用戶提供一種交互式操作的界面。主要表示W(wǎng)EB方式,也能夠表示成WINFORM方式,WEB方式也能夠表現(xiàn)成:aspx, 假設(shè)邏輯層相當(dāng)強(qiáng)大和完好,不管表現(xiàn)層怎樣定義和更改,邏輯層都能完好地提供服務(wù)。
(四)詳細(xì)調(diào)用
微軟的DNA架構(gòu)定義了三個(gè)層:表示層(presentation),業(yè)務(wù)邏輯層(business),和數(shù)據(jù)訪問(wèn)層(data access)。詳細(xì)又分為:界面外觀層、界面規(guī)則層、業(yè)務(wù)接口層、業(yè)務(wù)邏輯層、實(shí)體層、數(shù)據(jù)訪問(wèn)層、數(shù)據(jù)存儲(chǔ)層共七層,其詳細(xì)的調(diào)用如圖1所看到的:
(五)規(guī)則
1.系統(tǒng)各層次及層內(nèi)部子層次之間都不得跨層調(diào)用。
2.Entityobject 在各個(gè)層之間傳遞數(shù)據(jù)。
3.須要在UI層綁定到列表的數(shù)據(jù)採(cǎi)用基于關(guān)系的DataSet傳遞,除此之外,應(yīng)該使用Entityobject傳遞數(shù)據(jù)。
4.對(duì)于每個(gè)數(shù)據(jù)庫(kù)表(Table)都有一個(gè)DB Entity class與之相應(yīng),針對(duì)每個(gè)Entityclass都會(huì)有一個(gè)BEM Class與之相應(yīng)。
5.有些跨數(shù)據(jù)庫(kù)或跨表的操作(如復(fù)雜的聯(lián)合查詢)也須要由對(duì)應(yīng)的BEM Class來(lái)提供支持。
6.對(duì)于相對(duì)簡(jiǎn)單的系統(tǒng),能夠考慮將Business Function子層和Business Flow 子層合并為一個(gè)。
7.UI層和BL層禁止出現(xiàn)不論什么SQL語(yǔ)句。
三、優(yōu)缺點(diǎn)
(一)長(zhǎng)處
1、開(kāi)發(fā)者能夠僅僅關(guān)注整個(gè)結(jié)構(gòu)中的當(dāng)中某一層;
2、能夠非常easy的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);
3、能夠減少層與層之間的依賴;
4、有利于標(biāo)準(zhǔn)化;
5、利于各層邏輯的復(fù)用。
(二)缺點(diǎn)
1、減少了系統(tǒng)的性能。這是不言而喻的。假設(shè)不採(cǎi)用分層式結(jié)構(gòu),非常多業(yè)務(wù)能夠直接造訪數(shù)據(jù)庫(kù),以此獲取對(duì)應(yīng)的數(shù)據(jù),現(xiàn)在卻必須通過(guò)中間層來(lái)完畢。
2、有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的改動(dòng)。這樣的改動(dòng)尤其體如今自上而下的方向。假設(shè)在表示層中須要添加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能須要在對(duì)應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都添加對(duì)應(yīng)的代碼。
3、添加了開(kāi)發(fā)成本。
(三)為什么要使用三層架構(gòu)
對(duì)于一個(gè)簡(jiǎn)單的應(yīng)用程序來(lái)說(shuō),代碼量不是非常多的情況下,一層結(jié)構(gòu)或二層結(jié)構(gòu)開(kāi)發(fā)全然夠用,沒(méi)有必要將其復(fù)雜化,假設(shè)對(duì)一個(gè)復(fù)雜的大型系統(tǒng),設(shè)計(jì)為一層結(jié)構(gòu)或二層結(jié)構(gòu)開(kāi)發(fā),那么這種設(shè)計(jì)存在非常嚴(yán)重缺陷。以下會(huì)詳細(xì)介紹,分層開(kāi)發(fā)事實(shí)上是為大型系統(tǒng)服務(wù)的。在開(kāi)發(fā)過(guò)程中,0基礎(chǔ)程序人員出現(xiàn)相似的功能常常復(fù)制代碼,那么相同的代碼寫(xiě)那么多次,不但使程序變得冗長(zhǎng),更不利于維護(hù),一個(gè)小小的改動(dòng)也許會(huì)涉及非常多頁(yè)面,常常導(dǎo)致異常的產(chǎn)生使程序不能正常執(zhí)行。最基本的面向?qū)ο蟮乃枷霙](méi)有得到絲毫的體現(xiàn),打著面向?qū)ο蟮幕献訁s依舊走著面向過(guò)程的道路。意識(shí)到這種問(wèn)題,0基礎(chǔ)程序人員開(kāi)始將程序中一些公用的處理程序?qū)懗晒卜椒ǎ庋b在類(lèi)中,供其他程序調(diào)用。比如寫(xiě)一個(gè)數(shù)據(jù)操作類(lèi),對(duì)數(shù)據(jù)操作進(jìn)行合理封裝,在數(shù)據(jù)庫(kù)操作過(guò)程中,僅僅要類(lèi)中的對(duì)應(yīng)方法(數(shù)據(jù)加入、改動(dòng)、查詢等)能夠完畢特定的數(shù)據(jù)操作,這就是數(shù)據(jù)訪問(wèn)層,不用每次操作數(shù)據(jù)庫(kù)時(shí)都寫(xiě)那些反復(fù)性
的數(shù)據(jù)庫(kù)操作代碼。在新的應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)訪問(wèn)層能夠直接拿來(lái)用。面向?qū)ο蟮娜筇匦灾械囊粋€(gè)的封裝性在這里得到了非常好的體現(xiàn)。如今找到了面向?qū)ο蟮母杏X(jué),代碼量較曾經(jīng)有了非常大的降低,并且改動(dòng)的時(shí)候也比較方便,也實(shí)現(xiàn)了代碼的重用性。
四、與MVC的差別
MVC是三個(gè)單詞的縮寫(xiě),分別為:模型(Model),視圖(View)和控制Controller)。
MVC模式的目的就是實(shí)現(xiàn)Web系統(tǒng)的職能分工。 Model層實(shí)現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常能夠用JavaBean或EJB來(lái)實(shí)現(xiàn)。
View層用于與用戶的交互,通經(jīng)常使用JSP來(lái)實(shí)現(xiàn)。 Controller層是Model與View之間溝通的橋梁,它能夠分派用戶的請(qǐng)求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同一時(shí)候它也能夠解釋用戶的輸入并將它們映射為模型層可運(yùn)行的操作。
相同是架構(gòu)級(jí)別的,相同的地方在于他們都有一個(gè)表現(xiàn)層,可是他們不同的地方在于其它的兩個(gè)層。
在三層架構(gòu)中未定義Controller的概念。而MVC也沒(méi)有把業(yè)務(wù)的邏輯訪問(wèn)看成兩個(gè)層,這是採(cǎi)用三層架構(gòu)或MVC搭建程序最基本的差別。當(dāng)然,在三層中也提到了Model,可是三層架構(gòu)中Model的概念與MVC中Model的概念是不一樣的,“三層”中典型的Model層是以實(shí)體類(lèi)構(gòu)成的,而MVC里,則是由業(yè)務(wù)邏輯與訪問(wèn)數(shù)據(jù)組成的。
五、小結(jié)
在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)。 所以,分層式設(shè)計(jì)能夠達(dá)至例如以下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。一個(gè)好的分層式結(jié)構(gòu),能夠使得開(kāi)發(fā)者的分工更加明白。一旦定義好各層次之間的接口,負(fù)責(zé)不同邏輯設(shè)計(jì)的開(kāi)發(fā)者就能夠分散關(guān)注,齊頭并進(jìn)。盡管三層架構(gòu)仍有不可避免的缺陷,可是軟件分層結(jié)構(gòu)使得代碼維護(hù)很方便,設(shè)計(jì)明白,各層獨(dú)立,專注自己擅長(zhǎng)的領(lǐng)域。通過(guò)這次報(bào)告,對(duì)軟件體系結(jié)構(gòu)又有了更深入的了解。
總結(jié)
- 上一篇: FATAL ERROR: CALL_AN
- 下一篇: 点差法