DDD的基本概念澄清
什么是DDD
?Domain Driven Design
?領(lǐng)域是軟件要解決的問題區(qū)域
?通過對領(lǐng)域知識建立模型,形成團(tuán)隊(duì)內(nèi)各成員的通用語言,指導(dǎo)設(shè)計(jì)和實(shí)現(xiàn),從而達(dá)到為客戶解決問題的目的
?當(dāng)領(lǐng)域模型發(fā)生改變時(shí),開發(fā)人員需要重構(gòu),以便反映模型的變化,這樣新知識就合并到軟件中
Ubiquitous language (通用語言)
?將領(lǐng)域模型作為語言的支柱
?領(lǐng)域模型包括類和主要操作的名稱
?領(lǐng)域模型盡量以文本為主,穿插簡化圖為說明
?不管是畫圖、寫文檔、寫代碼還是講話,都用的同一種術(shù)語
?語言是演進(jìn)的
Layered architecture(分層架構(gòu))
* 用分層來隔離領(lǐng)域
* 層中的任何元素都僅依賴于本層其他元素,或其下層元素。
* 高內(nèi)聚,低耦合
* 領(lǐng)域?qū)討?yīng)重點(diǎn)放在如何表達(dá)領(lǐng)域模型上,而不需要考慮自己的顯示和存儲問題
?用戶界面層
?? ??向用戶顯示信息,解釋用戶命令
?應(yīng)用層
?? ??盡量簡單,不包含業(yè)務(wù)規(guī)則或知識
?? ??只為下層的領(lǐng)域?qū)ο蠓峙淙蝿?wù),使他們協(xié)作
?領(lǐng)域?qū)?/p>
?? ??負(fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息和業(yè)務(wù)規(guī)則
?基礎(chǔ)設(shè)施層
?? ??上面各層提供通用的技術(shù)。比如持久化
Entity(實(shí)體)
?由標(biāo)識定義的對象,而不是屬性
?整個(gè)生命周期都有聯(lián)系性
?模型必須定義出“符合什么條件才算是相同的事物”
Value Ojbect(值對象)
?描述領(lǐng)域的某個(gè)方面,但本身沒有概念標(biāo)識的對象
?關(guān)心它們是什么,而不關(guān)心它們是誰
?值對象是不可變的,具體實(shí)現(xiàn)分為共享和復(fù)制
Service(服務(wù))
?領(lǐng)域操作(活動或者對象)
?定義能夠?yàn)榭蛻糇鍪裁矗莿釉~而不是名詞
?操作是無狀態(tài)的
?結(jié)果和參數(shù)應(yīng)該是領(lǐng)域?qū)ο?/p>
?是否包含業(yè)務(wù)規(guī)則來確定是應(yīng)用還是領(lǐng)域Service
Module(模塊)
?可以查看細(xì)節(jié),而不會被整個(gè)模型淹沒
?可以觀察Module相互之間的關(guān)系,而不考慮細(xì)節(jié)
?將相同職責(zé)的對象放在一起
Aggregate(聚合)
?作為數(shù)據(jù)修改的單元,一組相關(guān)對象的集合
?包括一個(gè)根(root)和一個(gè)邊界(boundary)
?根是Aggregate內(nèi)一個(gè)特定的Entity
?Boundary定義了Aggregate內(nèi)有哪些
?外部引用時(shí),只可引用根;而邊界內(nèi)部的對象之間可以相互引用
Factory(工廠)
?對象本身承擔(dān)大量的職責(zé),讓復(fù)雜對象創(chuàng)建自身,會職責(zé)過載導(dǎo)致問題
?將職責(zé)交給客戶對象創(chuàng)建,會導(dǎo)致客戶必須了解對象內(nèi)部規(guī)則,導(dǎo)致和領(lǐng)域類產(chǎn)生耦合
?Factory隱藏創(chuàng)建細(xì)節(jié),通常和Aggregate有關(guān)
?當(dāng)創(chuàng)建新對象未滿足固定規(guī)則時(shí),F(xiàn)actory應(yīng)拒絕創(chuàng)建對象
Repository(倉庫)
?同一類型的對象的集合
?具有復(fù)雜的查詢、添加和刪除對象功能
?只為那些確實(shí)需要直接訪問的Aggreagte提供Repository,而不是所有對象都提供
Specfication(規(guī)格)
?計(jì)算結(jié)果是真或者假的函數(shù),一般用動詞或形容詞
?用于驗(yàn)證對象是否滿足特定的業(yè)務(wù)規(guī)則
?用于Repository查詢對象是否滿足要求
?用于創(chuàng)建對象時(shí)是否滿足需求
Bounded context(界限上下文)
?大型項(xiàng)目都會存在多個(gè)模型
?權(quán)利上的劃分和管理級別的不同也可能要求模型分開
?標(biāo)記不同模型之間的邊界和關(guān)系
?邊界內(nèi)部嚴(yán)格保持模型的一致性
?防止重復(fù)的概念和假同源
實(shí)現(xiàn)步驟:
?根據(jù)需求建立一個(gè)初步的領(lǐng)域模型,識別出一些明顯的領(lǐng)域概念以及它們的關(guān)聯(lián)
?分析程序功能,識別出應(yīng)用層和領(lǐng)域?qū)拥穆氊?zé)
?識別Entity,Value Object,Service等
?找出Aggregate Root
?為Aggregate寫Repository
?走查場景,分析領(lǐng)域模型是否解決業(yè)務(wù)需求
?考慮創(chuàng)建Entity,Value Object,Aggregate等是用Factory還是構(gòu)造,又或者是IOC
?重構(gòu)模型
————————————————
版權(quán)聲明:本文為CSDN博主「muzizongheng」的原創(chuàng)文章
原文鏈接:https://blog.csdn.net/muzizongheng/article/details/103924816