早些時候,我講到了 DD 的通用語言(Ubiquitous Language,1)。通用語言
作用於某個限界上下文(Bounded Context,2),它對於領域建模是非常重要的,你應該好好地熟悉一下。請記住,不管你是在戰術上還是戰略上設計軟件模型,你都應該保證:在一個特定的限界上下文中只使用一套通用語言,並且保證它的清晰性和簡潔性。
戰略建模
限界上下文是一種概念上的邊界,領域模型便工作於其中。同時,限界上下文爲通用語言提供了一套環境,項目成員便通過通用語言來表達軟件模型,如圖 G.1
總覽:
什麼是領域:
從廣義上講,領域(Domain)即是一個組織所做的事情以及其中所包含的切。商業機構通常會確定一個市場,然後在這個市場中銷售產品和服務。每個組織都有它自己的業務範圍和做事方式。這個業務範圍以及在其中所進行的活動便是領域。當你爲某個組織開發軟件時,你面對的便是這個組織的領域。這個領域對於你來說應該是明晰的,因爲你在這個領域中工作。
領域 1對多個 子域
子域 1對多個界定上下文
界定上下文=模型名+上下文
和你的業務領域模型相關,應該足夠大到可以很準確的表達其所對應的整套通用語言!
所以,通用語言是限界上下文的重要輸入和邊界限定的主要依據。
具體落地,體現在頂層模塊的名字。
com.xx.data.app.np.domain.*;
其中np就可以對應到一個限界上下文上。
上下文映射圖續
系統間的集成常常依賴於RPC,網絡和遠程系統的加載過程都是RPC產生延遲的原因。當RPC的目標系統不可用時,系統也就不可能用了。一種方式是選擇異步請求或者事件處理的方式。DDD主張在本地緩存由外部模型翻譯而來的領域對象,這些對象保留這本地模型所需的最小狀態集;然而,要與遠程模型保持同步,最好的方式是在遠程系統中採用面向消息的通知機制。
是一種依賴倒置的場景實現,服務提供方爲依賴它的consumer提供對應的實現(適配器)
資源是關鍵的概念
EDA:是一種處理事件生成、發現和處理等任務的軟件架構。
類似於管道和過濾器:
cat phone_number.txt | grep 130 | wc -l
長時處理過程Saga
事件驅動的、分佈式的並行處理模式—長時處理過程(long Running proces)
CQRS(Command & Query Responsibility Segregation)命令查詢職責分離,和 REST 同屬於架構風格,如果單純理解
實現領域驅動設計CQRS,是比較容易的,另一種方式解釋就是,一個方法要麼是執行某種動作的命令,要麼是返回數據的查詢,命令的體現是對系統狀態的修改,而查詢則不會,職責的分離更加有利於領域模型的提煉,系統的靈活性和可擴展性也得到進一步加強。
總結:六邊形架構是DDD的首選架構方式,因爲領域內聚,不需要關心外部的依賴。通過適配器去解決外部依賴。
當你決定一個領域概念是否是一個值對象時,你需要考慮它是否擁有以下特徵
它度量或者描述了領域中的一件東西。
它可以作爲不變量
它將不同的相關的屬性組合成一個概念整體(Conceptual Whole)。
當度量和描述改變時,可以用另一個值對象予以替換。
它可以和其他值對象進行相等性比較。
它不會對協作對象造成副作用【Evans】。
java值對象:https://www.jdon.com/53373
一個實際case: 員工與地址,地址及可被設計成值對象,https://www.cnblogs.com/leo_wl/p/4122147.html