領(lǐng)域驅(qū)動設(shè)計DDD入門(一)

領(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怎么做

  1. 強(qiáng)調(diào)領(lǐng)域模型的重要性
    通過模型驅(qū)動設(shè)計來保證領(lǐng)域模型和程序設(shè)計一致
  2. 從業(yè)務(wù)需求提煉統(tǒng)一語言
    基于統(tǒng)一語言建立領(lǐng)域模型
    領(lǐng)域模型指導(dǎo)程序設(shè)計及編碼
  3. 通過重構(gòu)發(fā)現(xiàn)隱式概念
    用設(shè)計模式改進(jìn)設(shè)計與開放質(zhì)量

DDD戰(zhàn)略設(shè)計

  1. 問題域
    • 分解問題域。包括限界上下文和上下文映射。
    • 識別核心領(lǐng)域和子領(lǐng)域
  2. 架構(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è)計

  1. 表示模型的元素
    • 值對象(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ù)
  2. 元素之間的關(guān)系

未完待續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容