領域驅動系列一基本概念介紹

2021-09-07 20:54:32 字數 2793 閱讀 2184

一、簡介

領域驅動相信都不陌生,個人覺得是乙個非常好的軟體開發思想,幫助我們充分發揮物件導向和設計模式的魔力,同時讓我們的**不再侷限於過程式的指令碼.所以,打算寫乙個系列的關於領域驅動設計的隨筆,來提公升自己的架構能力.本系列的隨筆參考於領域驅動設計:軟體核心複雜性應對之道這本書,我會對上面的內容做乙個整理歸納,從c#程式設計師的角度,去總結一些觀點。廢話不多說,here wo go!

二、基本知識點

1、什麼是領域

2、領域的應用範圍

領域的範圍應用很廣,歸納之,主要包含物質世界和虛擬世界,如乙個點餐程式,他的領域包含餐廳和收銀員等,這一類的都涉及物質世界。再如乙個**管理工具,他的領域則是**,這一類涉及虛擬的世界.

3、傳統開發模式的問題,以及領域模型的誕生

為了構建乙個某個領域**值的軟體,開發團隊不得不去研究該領域下的所有知識,所需的知識是非常龐大的.而且複雜程度也非常的高,所以這個時候引入領域模型是非常必要的,因為領域模型對所有的知識進行有選擇的簡化和結構化,幫助我們識別出領域種的核心關鍵點.通過領域模型能幫助我們有效的消化知識,讓知識看起來很流暢,而不是像傳統文件那樣,一團亂麻!

4、領域模型的概念和作用

領域模型不單單是乙個模型圖,而是一種思想,是一種經過嚴格組織並精心選擇的抽象知識,直擊領域的核心.忽略掉領域的部分細節.模型圖可以表達一種模型,作為程式設計師,一段好的**也可以,好的文件也可以.所以知識選擇得當領域模型可以是任何知識的載體,單前提是該載體必須是經過嚴格組織並精心選擇的抽象知識.

重點:建立領域模型並非原封不動建立乙個符合"現實"的模型,這是不可能的,如果讓你開發乙個關於生活的軟體,你可能將生活種的每個細節都通過**展現出來,即使強如bat,也做不到.所以建立領域模型更像是拍一部紀錄片,將生活中最美好的部分展現給觀眾,軟體也是如此,通過建模將軟體和核心點抽象出來(形成領域模型),然後將所有的模型通過演算法連線起來,寫成軟體給使用者使用.

5、領域模型在領域驅動設計中的作用

(1)、模型和設計的相互影響

我們通過對領域知識的抽象形成乙個個領域模型,此時的模型和實現是緊密結合的,如果通過**將模型轉換成乙個有用的產品,那麼此時後續的開發人員就能通過模型很好的理解**為什麼要這樣實現.而不用通過溝通或者檢視複雜的文件去理解.而且後續的修改擴充套件也很方便,只需圍繞這個模型即可.通過對模型的把控,就能驗證後續的需求實現的可能性,以及當前的模型存在的一些問題等等.

(2)、模型的重要性

一旦業務形成可用的領域模型,那麼他就會變成團隊的交流的中樞,後續的修改,團隊都會圍繞該模型展開.這時候模型就變成了一種交流的語言.所以,後續我們就可以通過語言來對他進一步的擴充套件.這是我們天生就具有的本領.

三、消化知識

1、如何構建最初的模型

關於消化知識,其實就是抽象領域知識的過程,這裡舉個列子,假設需要設計乙個.net使用者登陸系統,這裡假設我之前沒有做過相關的功能,這個時候恰好有乙個領域專家配合我.那麼下面我們就開始進行頭腦風暴.開始我想讓專家告訴我想通過c#**達成什麼。但是他完全沒有c#編碼經驗.剛開始很艱難,但是我們得到了最基本的兩個元素如下:

接著我們繼續討論,他告訴我,使用者必須輸入使用者名稱和密碼才能登陸系統!而且使用者必須註冊到伺服器,然後登陸的時候驗證使用者名稱和密碼伺服器中時候存在,存在則登陸成功,才能訪問伺服器上的資源.所以我修改了模型如下:

接著我們繼續討論,他告訴要加乙個驗證碼和限制登陸次數為5次的功能,防止機器程式強行登陸.所以我繼續修改模型,這裡就不加圖了.

就這樣,我們繼續討論,隨著我對領域知識加深,不斷的修改模型,最終形成了初期的領域模型,如下:

這個時候,如果專家提出了新的需求,我就判斷當前模型是否能滿足他提出的需求,如果不滿足,就修改模型。在精華模型的同時,**也隨之演進.最終形成了乙個高擴充套件高可用的使用者登陸模組.

2、有效建模的要素

(1)、模型和實現的繫結

上面的模型圖和實現深度繫結雖然很簡陋,但他在模型和實現之間建立了早期的鏈結,而且在後續的迭代中我們將一直維護該原型.

(2)、獲得了一種基於模型的語言

最初,專家不得不向我解釋使用者登陸領域的問題,而我也必須向他解釋c#類的概念,隨著模組的擴充套件,我們都能使用模型中的術語,並將他們組織為符合模型的語句.那麼後續的開發中我們就不需要解釋各自領域的專業術語.

(3)、提煉模型

在模型日趨完善的過程中,重要的概念不斷地被加到模型中,不重要地概念則被剔除.當乙個不需要的概念和乙個需要的概念產生關聯式,則將需要的概念提取到乙個新的模型中,不需要的刪除掉.

(4)、頭腦風暴的重要性

語言和操作,加上頭腦風暴,使我們的模型茁壯的生長,當團隊走查場景時,口頭表達就可以測試模型的有效性,在這個過程中,基於模型的語言提供了很大的幫助,能幫助我們不斷地訓練模型,檢測模型地可用性,以及一段地擴充套件模型,最後我們將得到乙個很有價值的模型.

3、傳統瀑布方法的缺點

傳統瀑布方法,業務專家和分析員對業務進行分析,並形成抽象並傳遞給程式設計師,這個過程分析員全權負責建立模型,這個模型只是參考業務專家的意見,並沒有讓程式設計師參與,這樣久而久之,只有業務專家和分析員精通業務知識,知識只是朝乙個方向流動,沒有形成積累.如果這個過程讓程式設計師參與,那麼好的程式設計師,自然而然會開發出乙個可以完成更多工作的模型.

但是如果這個過程只讓程式設計師參與,那麼得出得模型是非常幼稚得.所以如果這個過程如果讓兩者都參與到其中,那麼得出得模型是非常優質得.所以這就是領域驅動得優勢.

CUDA系列一 基本概念

太久沒有寫部落格了,最近一直在整cuda c這塊的東西,學了一陣子了但是水平還是一般般。作為乙個半入門的人,寫點記錄一來是可以幫助自己記憶,更多的是希望可以幫助他人,做技術這塊寫點東西能夠幫助到他人,我想這大概是自己最開心的事情,以後盡量多寫些有用的東西吧。1.基本概念 常用的操作主要包括函式宣告,...

rabbitmq系列 一 基本概念理解

rabbitmq是乙個由erlang開發的amqp advanced message queue protocol 的開源實現。amqp高階訊息佇列,說白了就是乙個開源的訊息中介軟體。它能解決不同元件 模組 系統間訊息通訊。rabbitmq server 也叫broker server,儲存訊息的地...

nginx基本概念介紹

1 nginx主要為優化效能,是一種反向 服 負載均衡務器。有報告表明能支援高達 50,000 個併發連線數。反向 伺服器 nginx 最常的用途是提供反向 服務,那麼什麼反向 呢?正向 相信很多大陸同胞都在這片神奇的土地上用過了,原理大致如下圖 伺服器作為客戶端這邊的中介接受請求,隱藏掉真實的客戶...