領域驅動設計(DDD:Domain-Driven Design)

  Eric Evans的“Domain-Driven Design領域驅動設計”簡稱DDD,Evans DDD是一套綜合軟件系統分析和設計的面向對象建模方法,本站Jdon.com是國內公開最早討論DDD網站之一,可訂閱DDD專題。初學者學習DDD可從研究本站Jdon框架的DDD應用源碼開始,戳這里開始

  過去系統分析和系統設計都是分離的,正如我們國家“系統分析師” 和“系統設計師” 兩種職稱考試一樣,這樣割裂的結果導致,需求分析的結果無法直接進行設計編程,而能夠進行編程運行的代碼卻扭曲需求,導致客戶運行軟件后才發現很多功能不是自己想要的,而且軟件不能快速跟隨需求變化。

  DDD則打破了這種隔閡,提出了領域模型概念,統一了分析和設計編程,使得軟件能夠更靈活快速跟隨需求變化。見下面DDD與傳統CRUD或過程腳本或者面向數據表等在開發效率上比較:

ddd

  服務器后端發展三個階段:

  1. UI+DataBase的兩層架構,這種面向數據庫的架構(上圖table module )沒有靈活性。
  2. UI+Service+DataBase的多層SOA架構,這種服務+表模型的架構易使服務變得囊腫,難于維護拓展,伸縮性能差,見這里討論Spring Web 應用的最大敗筆.
  3. DDD+SOA微服務的事件驅動的CQRS讀寫分離架構,應付復雜業務邏輯,以聚合模型替代數據表模型,以并發的事件驅動替代串聯的消息驅動。真正實現以業務實體為核心的靈活拓展。

  DDD革命性在于:領域模型準確反映了業務語言,而傳統J2EE或Spring+Hibernate等事務性編程模型只關心數據,這些數據對象除了簡單setter/getter方法外,沒有任何業務方法,被比喻成失血模型,那么領域模型這種帶有業務方法的充血模型到底好在哪里?

  以比賽Match為案例,比賽有“開始”和“結束”等業務行為,但是傳統經典的方式是將“開始”和“結束”行為放在比賽的服務Service中,而不是放在比賽對象本身之中。我們不能因為用了計算機,用了數據庫,用了框架,業務模型反而被技術框架給綁架,就像人雖然是由母親生的,但是人的吃喝拉撒母親不能替代,更不能以母愛名義肢解人的正常職責行為,如果是這樣,這個人就是被母愛綁架了。

  提倡充血模型,實際就是讓過去被肢解被黑crack的業務模型回歸正常,當然這也會被一些先入為主或被洗過腦的程序員看成反而不正常,這更是極大可悲之處。看到領域模型代碼,就看到業務需求,沒有翻譯沒有轉換,保證軟件真正實現“拷貝不走樣”。

  DDD最大的好處是:接觸到需求第一步就是考慮領域模型,而不是將其切割成數據和行為,然后數據用數據庫實現,行為使用服務實現,最后造成需求的首肢分離。DDD讓你首先考慮的是業務語言,而不是數據。重點不同導致編程世界觀不同。

  DDD是解決復雜中大型軟件的一套行之有效方式,在國外已經成為主流。DDD認為很多原因造成軟件的復雜性,我們不可能避免這些復雜性,能做的是對復雜的問題進行控制。而一個好的領域模型是控制復雜問題的關鍵。領域模型的價值在于提供一種通用的語言,使得領域專家和軟件技術人員聯系在一起,溝通無歧義。

  DDD在軟件生產流程中定位如下圖,DDD落地實現離不開in-memory緩存CQRS、 DCIEDAEvent Source幾大大相關領域。

cache

 

重點資訊

  2012年Eric Evans關于技術如何影響DDD的會話

  領域驅動設計參考

  領域驅動設計簡介 PDF

  聚合與一致性和有界上下文

  采訪DDD事件風暴發明者Alberto Brandolini

  DDD培訓與咨詢

 

教程與文章

板橋大話DDD
用大白話簡單談談DDD的一些基礎特點,只是掃盲!數據庫SQL強人慎入

鮑勃大叔實錘:類與數據結構的比較!每個優秀的軟件設計師和架構師都需要牢記的問題

切實有效的三個步驟:如何通過劃分有界上下文設計微服務? - Robert Reppel

面向對象建模與數據庫建模兩種分析設計方法的比較
數據庫驅動設計與對象建模是決定軟件不同命運的兩大派別,誰可以讓軟件更具有生命,維護拓展更方便?伸縮性更強?

對象和關系數據庫的天然阻抗
軟件是講究方法的,要談方法,這個世界只有兩種:一是將復雜問題簡單化的方法;另一是將簡單問題復雜化的方法。對于軟件這個領域,你只能選擇前者。

面向對象與領域建模
據調查,目前有70%左右程序員是在使用OO語言編寫傳統過程化軟件,缺乏完整的面向對象思維方法的教育和培訓是基本根源,本文對軟件開發中幾個常見問題提出了獨立的見解及尖銳的觀點

Evans DDD 領域建模
如何提煉模型,而不是數據表,進而精化模型對象,使其能夠反映領域概念基本本質是一個復雜過程,Evans DDD是2004年提出的具備革命性影響的軟件思想。

實戰DDD(Evans DDD:Domain-Driven Design領域驅動設計)
領域建模是一種藝術的技術,不是數學的技術,它是用來解決復雜軟件快速應付變化的解決之道。

領域模型驅動設計(Evans DDD)之模型提煉

軟件建模設計

如何從職 責和協作中發現豐富的充血對象?
失血模型貧血模型是DDD最大敵人,如何根據SOLID原則GRASP原則設計業務行為?本文給出了DDD具體實踐中一些具體細節,是和DDD配合一起進行面向對象分析設計的好方法。

業務模型統一描述
統一語言是DDD一個重要特征和重點。

DCI架構是什么?
DCI架構:DCI: 對象的Data數據, 對象使用的Context場景, 對象的Interaction交互行為

Domain Events異步應用
領域驅動設計和異步架構完美實戰解決之道。

DDD DCI和領域事件
將DDD DCI Event sourcing結合在一個案例中,展示OOA和OOD實現過程,直至可運行的源代碼。

業務建模:CQRS應用場景 
如何更好地在實踐中實現DDD,又防止技術架構對業務領域的侵害,本文討論引入CQRS使用場景。

DSM:Domain-Specific Modeling
DSM是超越UML/MDA一種新的建模方法,它成倍提高軟件開發效率。

四色原型
我們在一個軟件革命的開始,它象90年代我們看到的面向對象編程從傳統過程語言中抽象出來一樣。 如果說GOF設計模式開辟了OO對象設計新時代,那么原型模式和MDA將開辟后十年的軟件新時代。更多四色專題

Feature-Driven Development特征驅動開發
使用JdonFramework等現代Model/Service框架是在什么項目工程背景下進行的?不是以前的XP(Extreme Programming )或RUP,而是FDD。

UML和Java的阻抗
如果Java和UML這種發展概念不匹配下去,我們真的要問UML過時了嗎?

狀態對象:數據庫的替代者
這是一個實戰中非常重要但是容易被忽視的概念,說它重要,是因為它比數據庫重要;說它容易被忽視也是同樣的原因,它經常被數據庫概念替代。

不變性immutablity設計
不變性是統領業務分析和高性能架構重要法門,通過業務上不變性分析設計,可以實現代碼運行的并發高性能和高擴展性  

領域模型的隔離

行為驅動開發(BDD)如何與領域驅動設計(DDD)結合?
BDD認為是在不斷敏捷迭代開發中從用戶故事中挖掘領域模型,這種敏捷開發方式是否與DDD矛盾呢?

事件、契約設計與BDD
板橋banq提出中西結合的統一語言:場景 事件和狀態,該文進行了論證。

DDD CQRS和Event Sourcing的案例:足球比賽
DDD + CQRS + Event Sourcing實現案例,結合代碼與理論講解。

集裝箱車隊系統的DDD案例
為上海某大型港口公司的運輸系統實施的一個領域驅動設計DDD的實戰咨詢案例。

DDD倉儲實現:Spring Data JDBC教程

不使用DDD的后果:為什么我們停止了向微服務的遷移?

DDD案例完整實現:本站開源Jivejdon 文檔按這里

DDD培訓與咨詢

 

相關參考

領域驅動設計之我見

領域驅動設計之實踐與反思

#DDD有界上下文???#DDD聚合

#DDD實體 #DDD值對象 #DDD服務

#DDD倉儲Repository模式

#DDD Specification規格模式

#領域事件、事件風暴與事件溯源

#CQRS架構 #職責驅動設計 #業務分析設計

#DDD領域驅動設計 有關領域建模經驗探討...

一级黄色录像影片 夫妻性生活影片 免费在线观看 一级a做爰片