最近在換工作,利用間隙看了兩本領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的經(jīng)典書(shū)籍:《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道》,《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》。
領(lǐng)域設(shè)計(jì)中的元素
限界上下文
- 限界上下文是一個(gè)顯式的邊界,領(lǐng)域模型便存在于這個(gè)邊界之內(nèi)。
- 通俗來(lái)講上下文可以認(rèn)為是一個(gè)能夠獨(dú)立運(yùn)轉(zhuǎn)的模塊。同一種概念在不同上下文中可能具有不同的意義。
- 不同上下文之間可以用RPC/REST接口訪問(wèn)(使用防腐層確保上下文數(shù)據(jù)安全),或
領(lǐng)域事件
進(jìn)行通信(可以實(shí)現(xiàn)上下文更高的自治性)。` - 例:采購(gòu)上下文,庫(kù)存上下文。
實(shí)體
- 實(shí)體是一個(gè)唯一的東西,并且可以在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)持續(xù)地變化,擁有唯一的身份標(biāo)識(shí)。
- 實(shí)體不應(yīng)該是貧血的,實(shí)體擁有業(yè)務(wù)邏輯。
- Hibernate框架可以實(shí)現(xiàn)實(shí)體-數(shù)據(jù)映射。
值對(duì)象
- 值對(duì)象是一個(gè)不變的數(shù)字,字符串或一種用來(lái)描述的對(duì)象。
- 值對(duì)象類(lèi)似DTO的概念。
領(lǐng)域服務(wù)
- 領(lǐng)域中的服務(wù)表示一個(gè)無(wú)狀態(tài)的操作,它用于實(shí)現(xiàn)特定于某個(gè)領(lǐng)域的任務(wù)。
- 當(dāng)某個(gè)操作不適合放在聚合和值對(duì)象上時(shí),最好的方式便是使用領(lǐng)域服務(wù)了。
- 過(guò)度使用領(lǐng)域服務(wù)可能會(huì)造成貧血模型。
領(lǐng)域事件
- 用來(lái)捕獲發(fā)生在領(lǐng)域中的一些事情。
- 可以用于向遠(yuǎn)程限界上下文發(fā)布領(lǐng)域事件。
- 消息的一致性實(shí)現(xiàn),消息時(shí)延問(wèn)題。
- 消息中間件(RabbitMQ)
聚合
- 將實(shí)體和值對(duì)象在一致性邊界之內(nèi)組成聚合。
- 設(shè)計(jì)小聚合。通過(guò)唯一標(biāo)識(shí)引用其他聚合,避免大對(duì)象給JVM造成負(fù)擔(dān)。
- 原則上一次事務(wù)只操作一個(gè)聚合,這樣服務(wù)會(huì)有更好的伸縮性和分布式特性。
- 在一個(gè)事務(wù)中操作大聚合對(duì)象,高并發(fā)時(shí)容易造成失敗。
工廠
- 用來(lái)創(chuàng)建模型對(duì)象,對(duì)客戶端隱藏創(chuàng)建的細(xì)節(jié)。
資源庫(kù)
- 資源庫(kù)表示一個(gè)安全的存儲(chǔ)區(qū)域,并且對(duì)其中所存放的物品起保護(hù)作用。
- 存在一些額外的行為,如統(tǒng)計(jì)數(shù)量。
應(yīng)用服務(wù)
- 用戶界面使用應(yīng)用服務(wù)來(lái)協(xié)調(diào)用例任務(wù),管理事務(wù),并執(zhí)行一些必要的安全授權(quán)。
心得體會(huì)
- 當(dāng)應(yīng)用程序業(yè)務(wù)邏輯越來(lái)越復(fù)雜的時(shí)候,使用面向數(shù)據(jù)開(kāi)發(fā)方式會(huì)越來(lái)越吃力。無(wú)限多的條件判斷來(lái)控制不同的業(yè)務(wù)邏輯,修改一個(gè)功能也不知道會(huì)引起其他業(yè)務(wù)邏輯上的問(wèn)題。
- 我在項(xiàng)目的中期嘗試引入DDD,靠自己對(duì)面向?qū)ο蟮睦斫夂鸵恍┚W(wǎng)上文章的經(jīng)驗(yàn),還是收到了一些不錯(cuò)的效果:使得業(yè)務(wù)設(shè)計(jì)層面與實(shí)現(xiàn)層面能夠分離,讓?xiě)?yīng)用程序有更好的可擴(kuò)展性,避免業(yè)務(wù)邏輯之間有過(guò)多的牽扯。
- 如今微服務(wù)概念流行,按DDD的方式劃分出
限界上下文
與領(lǐng)域事件
,正好可以讓業(yè)務(wù)設(shè)計(jì)上天生支持微服務(wù)架構(gòu)。必要時(shí)再引入CQRS方案解決跨上下文查詢的問(wèn)題。 - DDD雖好也不是銀彈。軟件設(shè)計(jì)是一種玄學(xué),無(wú)法簡(jiǎn)單的判斷對(duì)錯(cuò),很多時(shí)候需要具體場(chǎng)景具體分析,達(dá)到業(yè)務(wù)抽象與性能的平衡。