三層架構:表示層——業(yè)務邏輯層——數(shù)據(jù)訪問層

1. 什么是三層架構

所謂的三層開發(fā)就是將系統(tǒng)的整個業(yè)務應用劃分為 表示層,業(yè)務邏輯層,數(shù)據(jù)訪問層,這樣有利于系統(tǒng)的開發(fā)、維護、部署和擴展。分層是為了實現(xiàn) “高內聚,低耦合”,采用 “分而治之” 的思想,把問題劃分開來各個解決,易于控制、易于延展、易于分配資源。進行軟件開發(fā)設計,一定要懂得

分而治之

分而治之

分而治之

  • 表示層:負責直接跟用戶進行交互,一般也就是指系統(tǒng)的界面,用于數(shù)據(jù)錄入,數(shù)據(jù)顯示等。意味著只做與外觀顯示相關的工作,不屬于他的工作不用做。
  • 業(yè)務邏輯層:用于做一些有效的驗證工作,以更好地保證程序運行的健壯性。如完成數(shù)據(jù)添加、修改和查詢等;不允許指定的文本框中輸入空字符串,數(shù)據(jù)格式是否正確及數(shù)據(jù)類型驗證;用戶的權限合法性判斷等。通過以上諸多判斷以決定是否將操作繼續(xù)向后傳遞,盡量保證程序的正常運行。
  • 數(shù)據(jù)訪問層:顧名思義,就是專門跟數(shù)據(jù)庫進行交互,執(zhí)行數(shù)據(jù)的添加、刪除、修改和顯示等。需要強調的是,所有的數(shù)據(jù)對象只在這一層被引用,除數(shù)據(jù)層之外的任何地方都不應該出現(xiàn)這樣的引用。

ASP.NET可以使用.NET平臺快速方便地部署三層架構。ASP.NET革命性的變化是在網(wǎng)頁中也使用基于事件的處理,可以指定處理的后臺代碼文件,可以使用C#、VB、C++和J#作為后臺代碼的語言。.NET中可以方便的實現(xiàn)組件的裝配,后臺代碼通過命名空間可以方便的使用自己定義的組件。顯示層放在ASPX頁面中,數(shù)據(jù)庫操作和邏輯層用組件或封裝類來實現(xiàn),這樣就很方便的實現(xiàn)了三層架構。

2. 為什么使用三層架構

對于一個簡單的應用程序來說,代碼量不是很多的情況下,一層結構或二層結構開發(fā)完全夠用,沒有必要將其復雜化,如果對一個復雜的大型系統(tǒng),設計為一層結構或二層結構開發(fā),那么這樣的設計存在很嚴重缺陷。下面會具體介紹,分層開發(fā)其實是為大型系統(tǒng)服務的。

在開發(fā)過程中,初級程序人員出現(xiàn)相似的功能經(jīng)常復制代碼,那么同樣的代碼為什么要寫那么多次?不但使程序變得冗長,更不利于維護,一個小小的修改或許會涉及很多頁面,經(jīng)常導致異常的產(chǎn)生使程序不能正常運行。最主要的面向對象的思想沒有得到絲毫的體現(xiàn),打著面向對象的幌子卻依然走著面向過程的道路。

意識到這樣的問題,初級程序人員開始將程序中一些公用的處理程序寫成公共方法,封裝在類中,供其他程序調用。例如寫一個數(shù)據(jù)操作類,對數(shù)據(jù)操作進行合理封裝,在數(shù)據(jù)庫操作過程中,只要類中的相應方法(數(shù)據(jù)添加、修改、查詢等)可以完成特定的數(shù)據(jù)操作,這就是數(shù)據(jù)訪問層,不用每次操作數(shù)據(jù)庫時都寫那些重復性的數(shù)據(jù)庫操作代碼。在新的應用開發(fā)中,數(shù)據(jù)訪問層可以直接拿來用。面向對象的三大特性之一的封裝性在這里得到了很好的體現(xiàn)。讀者現(xiàn)在似乎找到了面向對象的感覺,代碼量較以前有了很大的減少,而且修改的時候也比較方便,也實現(xiàn)了代碼的重用性。

下面舉兩個案例,解釋一下為什么要使用三層架構。

案例一:

數(shù)據(jù)庫系統(tǒng)軟件由于數(shù)據(jù)量的不斷增加,數(shù)據(jù)庫由Access變成了SQLServer數(shù)據(jù)庫,這樣原來的數(shù)據(jù)訪問層失效了,數(shù)據(jù)操作對象發(fā)生了變化,并且頁面中涉及數(shù)據(jù)對象的地方也要進行修改,因為原來可能會使用OleDbDataReader對象將數(shù)據(jù)傳遞給顯示頁面,現(xiàn)在都得換成SqlDataReader對象,SQLServer和Access支持的數(shù)據(jù)類型也不一致,在顯示數(shù)據(jù)時進行的數(shù)據(jù)轉換也要進行修改,這是其中一種情況。

案例二:

由于特殊情況需要,把Web形式的項目改造成Windows應用,此時需要做多少修改呢?如果在Aspx.cs中占據(jù)了大量代碼,或者還有部分代碼存在于Aspx中,那么整個系統(tǒng)是否需要重新來開發(fā)呢?

在上面的案例中是否體會到了沒有分層開發(fā)模式的缺陷呢?是否碰到過這樣的情況呢?這都是由設計不合理造成的,多層開發(fā)架構的出現(xiàn)可以很好地解決該問題,通過程序架構進行合理的分層,將極大地提高程序的通用性。

3. 使用三層架構開發(fā)的優(yōu)點

使用三層架構開發(fā)有以下優(yōu)點:

  • 從開發(fā)角度和應用角度來看,三層架構比二層架構或單層架構都有更大的優(yōu)勢。三層架構適合團隊開發(fā),每人可以有不同的分工,協(xié)同工作使效率倍增。開發(fā)二層或單層應用程序時,每個開發(fā)人員都應對系統(tǒng)有較深的理解,能力要求很高,開發(fā)三層應用程序時,則可以結合多方面的人才,只需少數(shù)人對系統(tǒng)全面了解即可,從一定程度降低了開發(fā)的難度。

  • 三層架構可以更好的支持分布式計算環(huán)境。邏輯層的應用程序可以在多個計算機上運行,充分利用網(wǎng)絡的計算功能。分布式計算的潛力巨大,遠比升級CPU有效。美國人曾利用分式計算解密,幾個月就破解了據(jù)稱永遠都破解不了的密碼。

  • 三層架構的最大優(yōu)點是它的安全性。用戶只能通過邏輯層來訪問數(shù)據(jù)層,減少了入口點,把很多危險的系統(tǒng)功能都屏蔽了。

4. 三層架構的種類

目前,團隊開發(fā)人員在開發(fā)項目時,大多都使用分層開發(fā)架構設計,最常見的就是三層架構,目的在于使各個層之間只能夠被它相鄰的層產(chǎn)生影響,但是這個限制常常在使用多層開發(fā)的時候被違反,這對系統(tǒng)的開發(fā)是有害的。三層架構按驅動模式可劃分三種:數(shù)據(jù)層驅動模式、陳述層驅動模式和隔離驅動模式,其中隔離驅動模式開發(fā)最為重要。下面通過三種模式的對比,介紹隔離驅動模式的重要性。

  • 數(shù)據(jù)層驅動模式

所謂的數(shù)據(jù)層驅動模式,就是先設計數(shù)據(jù)層,陳述層圍繞數(shù)據(jù)層展開,一旦完成了數(shù)據(jù)層和陳述層,業(yè)務層就圍繞數(shù)據(jù)層展開。因為陳述層是圍繞數(shù)據(jù)層展開的,這將會使陳述層中的約束不準確,并且限制了業(yè)務層的變更。由于業(yè)務層受到限制,一些簡單變化可以通過SQL查詢和存儲過程來實現(xiàn)。

這種模式非常的普遍,它和傳統(tǒng)的客戶服務端開發(fā)相似,并且是圍繞已經(jīng)存在的數(shù)據(jù)庫設計的。由于陳述層是圍繞數(shù)據(jù)層設計的,它常常是憑直覺模仿數(shù)據(jù)層的實際結構。

常常存在一種額外的反饋循環(huán)在陳述層到數(shù)據(jù)之間,當在設計陳述層不容易實現(xiàn)的時候常常會去修改數(shù)據(jù)層,也就形成了這種反饋循環(huán)。開發(fā)者請求修改數(shù)據(jù)庫方便陳述層的開發(fā),但是對數(shù)據(jù)層的設計卻是有害的。這種改變是人為的而沒考慮到其他需求的限制。這種修改經(jīng)常會違反至少損害數(shù)據(jù)的特有規(guī)則,導致不必要的數(shù)據(jù)冗余和數(shù)據(jù)的非標準化。

  • 陳述層驅動模式

陳述層驅動模式是數(shù)據(jù)層圍繞陳述層展開的。業(yè)務層的完成一般是通過簡單的SQL查詢和很少的變化或者隔離。由于數(shù)據(jù)庫的設計是為了陳述層的方便,并非從數(shù)據(jù)層設計方面考慮,所以數(shù)據(jù)庫的設計在性能上通常很低。

  • 隔離驅動模式

用隔離驅動模式設計,陳述層和數(shù)據(jù)層被獨立的開發(fā),常常是平行開發(fā)。這兩層在設計時沒有任何的相互干擾,所以不會存在人為的約束和有害的設計元素。當兩層都設計完成后,再設計業(yè)務層。業(yè)務層的責任就是在沒有對數(shù)據(jù)層和陳述層的需求變化的基礎上完成所有的轉換。

因為現(xiàn)在陳述層和數(shù)據(jù)層是完全獨立的,當業(yè)務層需求改變的時候,陳述層和數(shù)據(jù)層都可以做相應的修改而不影響對方。改變兩個在物理上不相鄰的層不會直接對其他層產(chǎn)生影響或發(fā)生沖突。這就允許數(shù)據(jù)層結構的調整或者陳述層根據(jù)用戶的需求做相應的變化,而不需要系統(tǒng)做大的調整或者修改。下表將對這3種驅動模式進行對比。

數(shù)據(jù)層驅動模式 陳述層驅動模式 隔離驅動模式
數(shù)據(jù)庫 1. 很容易設計
2.產(chǎn)生負面影響
3.很難改變數(shù)據(jù)層,因為它和陳述層緊密綁定
1.數(shù)據(jù)庫設計很糟
2.嚴重的不規(guī)范化設計
3.其他系統(tǒng)不易使用
4.很難改變數(shù)據(jù)層,由于它跟陳述層緊密綁定
1.優(yōu)化設計
2.集中設計數(shù)據(jù)庫,陳述層對它影響很小
業(yè)務需求 常常不能適應業(yè)務需求變化 常常適應業(yè)務需求變化 適應需求變化
用戶界面 是圍繞數(shù)據(jù)層而不是圍繞用戶,不易修改 適合用戶擴展界面 適合用戶擴展界面
擴展性 通??蓴U張,但是常常在用戶界面需要比較多的重寫以滿足數(shù)據(jù)庫的結構,同時數(shù)據(jù)庫可能需要存儲一些冗余的字段 完整性的擴張很難,常常只有通過“剪切,粘貼”函數(shù)來實現(xiàn) 很容易擴展

綜上所述,很容易看出隔離驅動模式的優(yōu)點,隔離驅動模式設計可以極大地提高程序的擴展性。


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 最近再看阮一峰的一篇博客提到了一本書《Software Architecture Patterns》(PDF),寫...
    卓_然閱讀 8,313評論 0 22
  • 1.從傳統(tǒng)三層架構與DDD分層架構的編程演變其實是思想的演變。 傳統(tǒng)三層架構,即用戶界面層UI、業(yè)務邏輯層BAL、...
    咖啡電視閱讀 8,639評論 0 6
  • 又看到有人在問三層架構和MVC的關系,感覺這種問題有點教條化了。因為它們都在邏輯上將應用程序劃為三塊,湊了一個數(shù)字...
    Ludiwgbet閱讀 2,051評論 1 12
  • 愛是一個永恒的話題。無論什么影視作品都是基于愛來展現(xiàn)的。最直接展現(xiàn)的就是以愛情為基調的電影或電視劇。最具代表性的就...
    涂樂閱讀 630評論 2 0
  • 2019年12月11日 星期三 晴 11月11日開始寫親子日記,今天是整30天,比起群里的寫了成千篇親子...
    香兒_c7ad閱讀 165評論 0 1

友情鏈接更多精彩內容