首頁 後端開發 C#.Net教程 三層架構與養豬

三層架構與養豬

Apr 30, 2017 am 10:26 AM

  為了更好地讓初學者輕鬆入門,這裡仍然採用趣味性的方式聊一些常用技術點,致力於.NET新手們的快速提高!知識都是普通的,關鍵是學習的想法。科技源自於生活,科技原來可以這樣學。拋磚引玉而已。

  層次結構在現實社會中隨處可見。我記得有個笑話講有個村長得意地向他老婆吹牛:「全中國只有四個人比我官大,鄉長、縣長、省長和國務院總理」。這個笑話也反映了真實社會中分層的現象。社會人群會分層,公司人員結構也會分層,樓房是分層的,甚至做包子的籠子都是分層的。雖然分層的目的各有不同,但都是為解決某一問題而產生的。所以,分層架構其實是為了解決某一問題而產生的解決方案。

  常用的三層架構設計

軟體系統最常用的一般會講到三層架構,其實就是將整個業務應用劃分為表示層、業務邏輯層、資料存取層等,有的還要細一些,透過分解業務細節,將不同的功能代碼分散開來,更利於系統的設計和開發,同時為可能的變更提供了更小的單元,十分有利於系統的維護和擴展。

  常見的三層架構基本上包括如下幾個部分,如圖1所示。


圖1 常見的三層架構

  • 資料訪問層DAL:用於實現與資料庫的交互和訪問,從資料庫獲取資料或保存資料到資料庫的部分。


  • 業務邏輯層BLL:業務邏輯層承上啟下,用於對上下互動的資料進行邏輯處理,實現業務目標。


  • 表示層Web:主要實現和用戶的交互,接收用戶請求或返回用戶請求的數據結果的展現,而具體的數據處理則交給業務邏輯層和數據訪問層去處理。

  日常開發的很多情況下為了復用一些共同的東西,會把一些各層都用的東西抽像出來。如我們將資料物件實體和方法分離,以便在多個層中傳遞,例如稱為Model。一些共通性的通用輔助類別和工具方法,如資料校驗、快取處理、加解密處理等,為了讓各層之間重複使用,也單獨分離出來,作為獨立的模組使用,例如稱為Common。

  此時,三層架構會演變為如圖2所示的情況。


圖2 三層架構演變結果

  • 業務實體Model:用於封裝實體類別資料結構,一般用於映射資料庫的資料表或視圖,用以描述業務中客觀存在的物件。 Model分離出來是為了更好地解耦,為了更好地發揮分層的作用,更好地進行復用和擴展,增強靈活性。


  • 通用類別庫Common:通用的輔助工具類別。

  我們可以將對資料庫的共通性操作抽象化封裝成資料操作類別(例如DbHelperSQL),以便更好地重複使用和使程式碼簡潔。資料層底層使用通用資料庫操作類別來存取資料庫,最後完整的三層架構如圖3 所示。


圖3 最後完整的三層架構

  資料庫存取類別是對ADO.NET的封裝,封裝了一些常用的重複的資料庫操作。如微軟的企業庫SQLHelper.cs,動軟的DBUtility/DbHelperSQL等,為DAL提供存取資料庫的輔助工具類別。

  透過上述分析,我們知道如今常用的三層架構是個什麼樣子,同時,我們也知道了三層架構在使用過程中的一些演化過程。那麼,為什麼要這樣分層,每層結構到底又扮演什麼角色呢?我們繼續往下看。

  趣味理解:三層架構與養豬

豬肉價格一路高漲,據說有人養豬都發財致富奔小康了,程式設計師都說寫程式碼沒前途了,還不如去養豬,不過,可別認為養豬沒有技術含量,比寫程式碼容易,其實養豬也大有學問。為了更能理解三層架構,就拿養豬來做個例子吧。俗話說:「沒吃過豬肉,還沒見過豬跑啊!」。

  圖4 是三層架構化的養豬產業流水線趣味對此圖。


圖4 三層結構與養豬

  對比圖3與圖4,我們可以看出:

  • 資料庫好比豬圈,所有的豬有序地按區域或編號,存放在不同的豬欄裡。


  • DAL好比是屠宰場,把豬從豬圈取出來進行(處理)屠殺,按要求取出相應的部位(字段),或者進行歸類整理(統計),形成整箱的豬肉(數據集),傳送給食品加工廠(BLL)。本來這裡都是同一夥人既管抓豬,又管殺豬的,後來覺得效率太低了,就讓一部分人出來專管抓豬了(DBUtility),根據要求來抓取指定的豬。


  • BLL好比食品加工廠,將豬肉深加工成各種可以食用的食品(業務處理)。


  • Web好比商場,將食品包裝成漂亮的可以銷售的產品,展現給顧客(UI表現層)。


  • 豬肉好比Model,無論是哪個廠(層),各個環節傳遞的本質都是豬肉,豬肉貫穿整個過程。


  • 通用類庫Common相當於工人使用的各種工具,為各廠(層)提供諸如殺豬刀、繩子、剪刀、包裝箱、工具車等共用的常用工具(類)。其實,每個部門本來是可以自己製作自己的工具的,但是那樣會使效率比較低,而且也不專業,並且很多工作都會是重複的。因此,就專門有人開了這樣的工廠來製作這些工具,提供給各個工廠,有了這樣的分工,工廠就可以專心做自己的事情了。

  當然,這裡只是形象的比喻,目的是為了讓大家更好地理解,實際的情況在細節上會有所不同。這個例子也只是說明了從豬圈到商場的單向過程,而實際三層開發中的資料互動是雙向的,可取可存。不過,據說有一種機器,把豬從這頭趕進去,另一頭就噗噗嚕嚕地出火腿腸了。如果火腿腸賣不了了,從那頭再放進去,這頭豬又原原本本出來了,科幻的機器吧,沒想到也可以和三層結構聯繫上。以上只是笑談,不過也讓三層架構的基本概念更容易理解了。

  上面談了那麼多,有人會問,我直接從資料庫取出內容直接操作不可以嗎?為什麼要這麼麻煩地用三層架構呢?三層架構到底有什麼好處呢?

  不分層,當然可以,就好比整個過程不分屠宰場、加工場之類的,都在同一個場所(工廠)完成所有的活(屠殺、加工、銷售)。但為什麼要加工廠和商場呢?因為當規模比較大的時候,管理起來就會變得非常複雜,這樣的養殖方式已經無法滿足規模化的需要了。並且,從社會的發展來看,社會分工是人類進步的表現。社會分工的優勢就是讓適合的人做自己擅長的事情,使平均社會勞動時間大大縮短,生產效率顯著提高。能夠提供優質高效勞動產品的人才能在市場競爭中獲得高利潤和高價值。人盡其才,物盡其用最深刻的意義就是由社會分工得出的。軟體開發也是一樣,做小專案的時候,分不分層確實看不出什麼差別,而且顯得更麻煩囉嗦了。但當專案變大和變得複雜時,分層就顯示出它的優勢來了。所以分不分層要根據項目的實際情況而定,不能一概而論。

相關文件:分層開發想法與小籠包

以上是三層架構與養豬的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

char在C語言字符串中的作用是什麼 char在C語言字符串中的作用是什麼 Apr 03, 2025 pm 03:15 PM

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

C語言各種符號的使用方法 C語言各種符號的使用方法 Apr 03, 2025 pm 04:48 PM

C 語言中符號的使用方法涵蓋算術、賦值、條件、邏輯、位運算符等。算術運算符用於基本數學運算,賦值運算符用於賦值和加減乘除賦值,條件運算符用於根據條件執行不同操作,邏輯運算符用於邏輯操作,位運算符用於位級操作,特殊常量用於表示空指針、文件結束標記和非數字值。

char在C語言中如何處理特殊字符 char在C語言中如何處理特殊字符 Apr 03, 2025 pm 03:18 PM

C語言中通過轉義序列處理特殊字符,如:\n表示換行符。 \t表示製表符。使用轉義序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要轉義兩次。不同平台和編譯器可能有不同的轉義序列,請查閱文檔。

c#多線程和異步的區別 c#多線程和異步的區別 Apr 03, 2025 pm 02:57 PM

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

char與wchar_t在C語言中的區別 char與wchar_t在C語言中的區別 Apr 03, 2025 pm 03:09 PM

在 C 語言中,char 和 wchar_t 的主要區別在於字符編碼:char 使用 ASCII 或擴展 ASCII,wchar_t 使用 Unicode;char 佔用 1-2 個字節,wchar_t 佔用 2-4 個字節;char 適用於英語文本,wchar_t 適用於多語言文本;char 廣泛支持,wchar_t 依賴於編譯器和操作系統是否支持 Unicode;char 的字符範圍受限,wchar_t 的字符範圍更大,並使用專門的函數進行算術運算。

char在C語言中如何進行類型轉換 char在C語言中如何進行類型轉換 Apr 03, 2025 pm 03:21 PM

在 C 語言中,char 類型轉換可以通過:強制類型轉換:使用強制類型轉換符將一種類型的數據直接轉換為另一種類型。自動類型轉換:當一種類型的數據可以容納另一種類型的值時,編譯器自動進行轉換。

char數組在C語言中如何使用 char數組在C語言中如何使用 Apr 03, 2025 pm 03:24 PM

char 數組在 C 語言中存儲字符序列,聲明為 char array_name[size]。訪問元素通過下標運算符,元素以空終止符 '\0' 結尾,用於表示字符串終點。 C 語言提供多種字符串操作函數,如 strlen()、strcpy()、strcat() 和 strcmp()。

C語言 sum 的作用是什麼? C語言 sum 的作用是什麼? Apr 03, 2025 pm 02:21 PM

C語言中沒有內置求和函數,需自行編寫。可通過遍歷數組並累加元素實現求和:循環版本:使用for循環和數組長度計算求和。指針版本:使用指針指向數組元素,通過自增指針遍歷高效求和。動態分配數組版本:動態分配數組並自行管理內存,確保釋放已分配內存以防止內存洩漏。

See all articles