從零開始學領域驅動設計 二

2022-06-28 00:00:19 字數 2914 閱讀 6110

我覺得這個需要從業務的角度深入分析哪些物件它們的關係是內聚的,即我們會把他們看成是乙個整體來考慮的;然後這些物件我們就可以把它們放在乙個聚合內。所謂關係是內聚的,是指這些物件之間必須保持乙個固定規則,固定規則是指在資料變化時必須保持不變的一致性規則。當我們在修改乙個聚合時,我們必須在事務級別確保整個聚合內的所有物件滿足這個固定規則。作為一條建議,聚合盡量不要太大,否則即便能夠做到在事務級別保持聚合的業務規則完整性,也可能會帶來一定的效能問題。有分析報告顯示,通常在大部分領域模型中,有70%的聚合通常只有乙個實體,即聚合根,該實體內部沒有包含其他實體,只包含一些值物件;另外30%的聚合中,基本上也只包含兩到三個實體。這意味著大部分的聚合都只是乙個實體,該實體同時也是聚合根。

如果乙個聚合只有乙個實體,那麼這個實體就是聚合根;如果有多個實體,那麼我們可以思考聚合內哪個物件有獨立存在的意義並且可以和外部直接進行互動

核心思想是將應用程式的查詢部分和命令部分完全分離,這兩部分可以用完全不同的模型和技術去實現。比如命令部分可以通過領域驅動設計來實現;查詢部分可以直接用最快的非物件導向的方式去實現,比如用sql。這樣的思想有很多好處:

實現命令部分的領域模型不用經常為了領域物件可能會被如何查詢而做一些折中處理;

由於命令和查詢是完全分離的,所以這兩部分可以用不同的技術架構實現,包括資料庫設計都可以分開設計,每一部分可以充分發揮其長處;

高效能,命令端因為沒有返回值,可以像訊息佇列一樣接受命令,放在佇列中,慢慢處理;處理完後,可以通過非同步的方式通知查詢端,這樣查詢端可以做資料同步的處理;

對於ddd中的聚合,不儲存聚合的當前狀態,而是儲存物件上所發生的每個事件。當要重建乙個聚合物件時,可以通過回溯這些事件(即讓這些事件重新發生)來讓物件恢復到某個特定的狀態;因為有時乙個聚合可能會發生很多事件,所以如果每次要在重建物件時都從頭回溯事件,會導致效能低下,所以我們會在一定時候為聚合建立乙個快照。這樣,我們就可以基於某個快照開始建立聚合物件了。

dci架構強調,軟體應該真實的模擬現實生活中物件的互動方式,**應該準確樸實的反映使用者的心智模型。在dci中有:資料模型、角色模型、以及上下文這三個概念。資料模型表示程式的結構,目前我們所理解的ddd中的領域模型可以很好的表示資料模型;角色模型表示資料如何互動,乙個角色定義了某個「身份」所具有的互動行為;上下文對應業務場景,用於實現業務用例,注意是業務用例而不是系統用例,業務用例只與業務相關;軟體執行時,根據使用者的操作,系統建立相應的場景,並把相關的資料物件作為場景參與者傳遞給場景,然後場景知道該為每個物件賦予什麼角色,當物件被賦予某個角色後就真正成為有互動能力的物件,然後與其他物件進行互動;這個過程與現實生活中我們所理解的物件是一致的;

dci的這種思想與ddd中的領域服務所做的事情是一樣的,但實現的角度有些不同。ddd中的領域服務被建立的出發點是當一些職責不太適合放在任何乙個領域物件上時,這個職責往往對應領域中的某個活動或轉換過程,此時我們應該考慮將其放在乙個服務中。比如資金轉帳的例子,我們應該提供乙個資金轉帳的服務,用來對應領域中的資金轉帳這個領域概念。但是領域服務內部做的事情是協調多個領域物件完成一件事情。因此,在ddd中的領域服務在協調領域物件做事情時,領域物件往往是處於乙個被動的地位,領域服務通知每個物件要求其做自己能做的事情,這樣就行了。這個過程中我們似乎看不到物件之間互動的意思,因為整個過程都是由領域服務以面向過程的思維去實現了。而dci則通用引入角色,賦予角色以互動能力,然後讓角色之間進行互動,從而可以讓我們看到物件與物件之間互動的過程。但前提是,物件之間確實是在互動。因為現實生活中並不是所有的物件在做互動,比如有a、b、c三個物件,a通知b做事情,a通知c做事情,此時可以認為a和b,a和c之間是在互動,但是b和c之間沒有互動。所以我們需要分清這種情況。資金轉帳的例子,a相當於轉帳服務,b相當於帳號1,c相當於帳號2。因此,資金轉帳這個業務場景,用領域服務比較自然。有人認為dci可以替換ddd中的領域服務,我持懷疑態度。

表示在某個時刻或某一段時間內發生的某個活動。使用粉紅色表示,簡寫為mi。

表示參與某個活動的人或物,地點則是活動的發生地。使用綠色表示。簡寫為ppt。

表示對ppt的本質描述。它不是ppt的分類!description是從ppt抽象出來的不變的共性的屬性的集合。使用藍色表示,簡寫為desc。

舉個例子,有乙個人叫張三,如果某個外星人問你張三是什麼?你會怎麼說?可能會說,張三是個人,但是外星人不知道「人」是什麼。然後你會怎麼辦?你就會說:張三是個由乙個頭、兩隻手、兩隻腳,以及乙個身體組成的客觀存在。雖然這時外星人仍然不知道人是什麼,但我已經可以借用這個例子向大家說明什麼是「description」了。在這個例子中,張三就是乙個ppt,而「由乙個頭、兩隻手、兩隻腳,以及乙個身體組成的客觀存在」就是對張三的description,頭、手、腳、身體則是人的本質的不變的共性的屬性的集合。但我們人模擬較聰明,很會抽象總結和命名,已經把這個description用乙個字來代替了,那就是「人」。所以就有所謂的張三是人的說法。

角色就是我們平時所理解的「身份」。使用黃色表示,簡寫為role。為什麼會有角色這個概念?因為有些活動,只允許具有特定角色(身份)的ppt(參與者)才能參與該活動。比如乙個人只有具有教師的角色才能上課(一種活動);乙個人只有是乙個合法公民才能參與選舉和被選舉;但是有些活動也是不需要角色的,比如乙個人不需要具備任何角色就可以睡覺(一種活動)。當然,其實說人不需要角色就能睡覺也是錯誤的,錯在**?因為我們可以這樣理解:乙個客觀存在只要具有「人」的角色就能睡覺,其實這時候,我們已經把desc當作角色來看待了。所以,其實角色這個概念是非常廣的,不能用我們平時所理解的狹義的「身份」來理解,因為「教師」、「合法公民」、「人」都可以被作為角色來看待。因此,應該這樣說:任何乙個活動,都需要具有一定角色的參與者才能參與。

用一句話來概括四色原型就是:乙個什麼什麼樣的人或組織或物品以某種角色在某個時刻或某段時間內參與某個活動。 其中「什麼什麼樣的」就是desc,「人或組織或物品」就是ppt,「角色」就是role,而」某個時刻或某段時間內的某個活動"就是mi。

以上這些東西如果在學習了ddd之後再去學習會對ddd有更深入的了解,但我覺得ddd相對比較基礎,如果我們在已經了解了ddd的基礎之上再去學習這些東西會更加有效和容易掌握。

零開始學python 從零開始學Python

第1章 python入門 1 1 1 什麼是python 1 1 2 python語言有什麼特點 2 1 3 python可以幹什麼 4 練一練 5 第2章 準備開發環境 6 2 1 在windows上安裝python開發環境 6 2 2 選擇和安裝開發工具 11 練一練 17 第3章 基本概念 1...

從零開始學android

相對布局管理器指的是參考某一其他控制項進行擺放,可以通過控制,將元件擺放在乙個指定參考元件的上 下 左 右等位置,這些可以直接通過各個元件提供的屬性完成。下面介紹一下各個方法的基本使用 no.屬性名稱 對應的規則常量 描述1 android layout below relativelayout.b...

從零開始學 樹

在之前做二級的題的時候,偶爾會碰見二叉樹,很自然的就想起了樹,那麼什麼是樹呢?這裡說的可不是外面的參天大樹,而是有實際概念的樹,下面就來介紹一下樹。樹是由n n 0 個結點組成的有限集合。若n 0,稱為空樹 若n 0,則 1 有乙個特定的稱為根 root 的結點。它只有直接後繼,但沒有直接前驅 2 ...