領(lǐng)域驅(qū)動設(shè)計簡介
領(lǐng)域驅(qū)動設(shè)計(Domain-Driven Design)簡稱DDD。
目錄
- DDD是什么?
- DDD和已有方法的區(qū)別是什么?
- DDD有什么特點?
- DDD應(yīng)該怎么做?
- DDD如何開始?
DDD是什么?
DDD是由 Eric Evans 提出的,綜合軟件系統(tǒng)分析和設(shè)計的面向?qū)ο蠼7椒āH缃褚呀?jīng)發(fā)展成為了一種針對大型復(fù)雜系統(tǒng)的領(lǐng)域建模與析方法。
DDD是針對軟件開發(fā)領(lǐng)域的一種系統(tǒng)與理論分析方法,是一種方法論。
DDD和已有方法的區(qū)別是什么?
傳統(tǒng)方法:
- 是針對數(shù)據(jù)庫建模,是關(guān)系型數(shù)據(jù)庫理論的延續(xù),關(guān)注數(shù)據(jù)表和數(shù)據(jù)表之間的關(guān)系,是面向技術(shù)建模。
DDD:
- 將業(yè)務(wù)概念和規(guī)則轉(zhuǎn)變?yōu)檐浖到y(tǒng)中的類型及其屬性和行為
- 合理利用面向?qū)ο蟮姆庋b、繼承、多態(tài)等設(shè)計要素
- 降低或隱藏系統(tǒng)的業(yè)務(wù)復(fù)雜度
- 提升系統(tǒng)擴(kuò)展性
DDD有什么特點
- 建立了==以領(lǐng)域為核心驅(qū)動力==的設(shè)計體系
- 不是架構(gòu)方法,不是設(shè)計模式
- 是一種思維方式。是一種優(yōu)先任務(wù),加速復(fù)雜領(lǐng)域的軟件開發(fā)
DDD怎么做
- 強(qiáng)調(diào)領(lǐng)域模型的重要性
通過模型驅(qū)動設(shè)計來保證領(lǐng)域模型和程序設(shè)計一致 - 從業(yè)務(wù)需求提煉統(tǒng)一語言
基于統(tǒng)一語言建立領(lǐng)域模型
領(lǐng)域模型指導(dǎo)程序設(shè)計及編碼 - 通過重構(gòu)發(fā)現(xiàn)隱式概念
用設(shè)計模式改進(jìn)設(shè)計與開放質(zhì)量
DDD戰(zhàn)略設(shè)計
- 問題域
- 分解問題域。包括限界上下文和上下文映射。
- 識別核心領(lǐng)域和子領(lǐng)域
- 架構(gòu)
- 分層架構(gòu)
- 六邊形架構(gòu)
- CQRS模式
DDD相關(guān)概念
領(lǐng)域(Domain):
現(xiàn)實世界中,領(lǐng)域包含了問題域和解系統(tǒng)。一般認(rèn)為軟件是對現(xiàn)實世界的部分模擬。在DDD中,解系統(tǒng)可以映射為一個個限界上下文,限界上下文就是軟件對于問題域的一個特定的、有限的解決方案。
界限上下文(Bounded Context):
一個由顯示邊界限定的特定職責(zé)。領(lǐng)域模型便存在于這個邊界之內(nèi)。在邊界內(nèi),每一個模型概念,包括它的屬性和操作,都具有特殊的含義。
限界上下文之間的映射關(guān)系
- 合作關(guān)系(Partnership):兩個上下文緊密合作的關(guān)系,一榮俱榮,一損俱損。
- 共享內(nèi)核(Shared Kernel):兩個上下文依賴部分共享的模型。
- 客戶方-供應(yīng)方開發(fā)(Customer-Supplier Development):上下文之間有組織的上下游依賴。
- 遵奉者(Conformist):下游上下文只能盲目依賴上游上下文。
- 防腐層(Anticorruption Layer):一個上下文通過一些適配和轉(zhuǎn)換與另一個上下文交互。亦稱適配層。在一個上下文中,有時需要對外部上下文進(jìn)行訪問,通常會引入防腐層的概念來對外部上下文的訪問進(jìn)行一次轉(zhuǎn)義。
- 開放主機(jī)服務(wù)(Open Host Service):定義一種協(xié)議來讓其他上下文來對本上下文進(jìn)行訪問。
- 發(fā)布語言(Published Language):通常與OHS一起使用,用于定義開放主機(jī)的協(xié)議。
- 大泥球(Big Ball of Mud):混雜在一起的上下文關(guān)系,邊界不清晰。
- 另謀他路(SeparateWay):兩個完全沒有任何聯(lián)系的上下文。
領(lǐng)域模型(Domain Model):
領(lǐng)域通用語言(UBIQUITOUS LANGUAGE):
DDD戰(zhàn)術(shù)設(shè)計
- 表示模型的元素
- 值對象(Value Object):當(dāng)一個對象用于對事務(wù)進(jìn)行描述而沒有唯一標(biāo)識時,它被稱作值對象(Value Object)。它具有不變性、相等性和可替換性。
- 實體(Entity):當(dāng)一個對象由其標(biāo)識(而不是屬性)區(qū)分時,這種對象稱為實體(Entity)。
- 領(lǐng)域服務(wù)(Domain Service):一些重要的領(lǐng)域行為或操作,可以歸類為領(lǐng)域服務(wù)。它既不是實體,也不是值對象的范疇。領(lǐng)域服務(wù)本身所承載的職責(zé)是通過串聯(lián)領(lǐng)域?qū)ο蟆①Y源庫和防腐層等一系列領(lǐng)域內(nèi)的對象的行為,對其他上下文提供交互的接口。
- 領(lǐng)域事件:領(lǐng)域事件是對領(lǐng)域內(nèi)發(fā)生的活動進(jìn)行的建模。
- 資源庫:領(lǐng)域?qū)ο笮枰Y源存儲,存儲的手段可以是多樣化的,常見的無非是數(shù)據(jù)庫,分布式緩存,本地緩存等。資源庫(Repository)的作用,就是對領(lǐng)域的存儲和訪問進(jìn)行統(tǒng)一管理的對象。
- 工廠
- 聚合(Aggregate):聚合是一組相關(guān)對象的集合,作為一個整體被外界訪問,聚合根(Aggregate Root)是這個聚合的根節(jié)點。聚合由根實體,值對象和實體組成。核心領(lǐng)域往往都需要用聚合來表達(dá)。
- 應(yīng)用服務(wù)
- 元素之間的關(guān)系