領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):業(yè)務(wù)建模與架構(gòu)實(shí)踐
定 價(jià):109 元
- 作者:王紅亮
- 出版時(shí)間:2023/11/1
- ISBN:9787111737544
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.1
- 頁(yè)碼:
- 紙張:膠版紙
- 版次:
- 開(kāi)本:16開(kāi)
內(nèi)容簡(jiǎn)介這是一本從業(yè)務(wù)和架構(gòu)視角講解DDD的基本原則、底層邏輯、落地難點(diǎn)、落地方法和進(jìn)階技巧的實(shí)戰(zhàn)性著作。DDD的理論體系復(fù)雜,學(xué)習(xí)和實(shí)踐門檻較高,已有的關(guān)于DDD的著作或多或少存在理論描述難理解、案例示范難落地等問(wèn)題,阻礙了DDD在實(shí)踐中的應(yīng)用。本書作者有20余年的軟件研發(fā)經(jīng)驗(yàn),對(duì)DDD有深刻的理解,深諳DDD實(shí)踐過(guò)程中的痛點(diǎn),他在這本書中高屋建瓴、化繁為簡(jiǎn),讓讀者有撥云見(jiàn)霧之感。理論部分(第1~3章)從軟件工程的基本思想出發(fā),首先分析了DDD產(chǎn)生的原因,并由此推論出DDD的基本原則,這些內(nèi)容是學(xué)習(xí)本書的基礎(chǔ);緊接著分析了DDD落地的難點(diǎn),幫助讀者掃清障礙;然后提煉出了DDD的成熟度模型,包括DDD的戰(zhàn)略、戰(zhàn)術(shù)和衡量指標(biāo)。這些內(nèi)容極具針對(duì)性和獨(dú)創(chuàng)性,是研發(fā)團(tuán)隊(duì)必須掌握的,也是目前同類書中很少講的。實(shí)戰(zhàn)部分(第4~10章)從業(yè)務(wù)建模和架構(gòu)的角度切入,首先用搭積木的方式講解和演示了DDD項(xiàng)目由簡(jiǎn)易到復(fù)雜的落地過(guò)程,包含大量的業(yè)務(wù)建模場(chǎng)景和案例,涉及如何應(yīng)用通用語(yǔ)言、如何建模領(lǐng)域邏輯、如何應(yīng)用上下文和子域切分系統(tǒng)以及如何保持語(yǔ)言、模型、代碼的一致性等重要內(nèi)容;然后講解了如何將各種設(shè)計(jì)模式應(yīng)用到DDD中,以及如何設(shè)計(jì)出能讓DDD更好落地的系統(tǒng)架構(gòu)。這些內(nèi)容兼具實(shí)操性和思想性,充滿經(jīng)驗(yàn)和智慧,在同類書中同樣也不多見(jiàn)。
(1)作者背景:作者是亞信云研發(fā)總監(jiān),有超過(guò)20年的軟件研發(fā)經(jīng)驗(yàn),曾就職于微軟等企業(yè)。(2)作者經(jīng)驗(yàn)豐富:作者對(duì)DDD有深刻理解,成功主導(dǎo)多個(gè)互聯(lián)網(wǎng)商業(yè)項(xiàng)目。(3)克服同類弊。鹤髡哂秘S富的經(jīng)驗(yàn)和深入的思考,將DDD化繁為簡(jiǎn),克服了同類書難理解和不落地的問(wèn)題,讓讀者撥云見(jiàn)霧。(4)針對(duì)性、獨(dú)創(chuàng)性:DDD原則、DDD底層邏輯、DDD成熟度模型、DDD落地難點(diǎn)等多個(gè)知識(shí)點(diǎn)都是讀者獨(dú)創(chuàng),極具針對(duì)性,同類書不具備。(5)實(shí)操性、思想性:用搭積木方式演示DDD項(xiàng)目搭建過(guò)程,將DDD與設(shè)計(jì)模式和系統(tǒng)架構(gòu)深度融合,在同類書中同樣也不多見(jiàn)。(6)企業(yè)界、學(xué)術(shù)界力薦:來(lái)自騰訊、華為、北交大等知名企業(yè)和學(xué)府的近10位專家高度評(píng)價(jià)并鼎力推薦。
Preface 前 言
為什么要寫這本書
本書創(chuàng)作的初心有兩個(gè)。
第一,服務(wù)于廣大開(kāi)發(fā)人員的職業(yè)進(jìn)階和轉(zhuǎn)型。
本書講授的是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design,DDD)的相關(guān)知識(shí)。DDD是一種業(yè)務(wù)建模和架構(gòu)設(shè)計(jì)方法,而業(yè)務(wù)建模和架構(gòu)設(shè)計(jì)是開(kāi)發(fā)人員職業(yè)進(jìn)階和轉(zhuǎn)型的技能。
在當(dāng)今AI技術(shù)大流行的背景下,快速掌握這兩項(xiàng)技能對(duì)開(kāi)發(fā)人員來(lái)說(shuō)很重要,因?yàn)閷懗淌交澳z水代碼”的工作很快就會(huì)被AI所取代。AI加速了開(kāi)發(fā)這個(gè)崗位的進(jìn)化和發(fā)展,這并不是件壞事。試想一下未來(lái)開(kāi)發(fā)團(tuán)隊(duì)的工作場(chǎng)景:建模師們和行業(yè)的領(lǐng)域?qū)<夜餐瓿赡P偷拇罱,AI就幫助我們生成了相應(yīng)的代碼,包括測(cè)試和必要的界面,之后只要把這些代碼和工作成果稍加優(yōu)化,整個(gè)開(kāi)發(fā)就結(jié)束了。功能實(shí)現(xiàn)以后,架構(gòu)師登場(chǎng),根據(jù)業(yè)務(wù)需要設(shè)定除功能之外的其他質(zhì)量屬性的要求,如安全、性能、可用性、可維護(hù)性和兼容性,并在AI的輔助下給出各個(gè)質(zhì)量屬性的解決方案,配合云原生或PaaS平臺(tái)的部署環(huán)境,系統(tǒng)很快搭建完畢,上線運(yùn)行。
在這個(gè)場(chǎng)景中,你所要做的就是把職業(yè)技能樹(shù)上的建模或架構(gòu)這兩部分點(diǎn)亮。所以,如果未來(lái)本書注定會(huì)出現(xiàn)在你的辦公桌上,不如現(xiàn)在就把它買回家—可以先人一步,及早開(kāi)始。
有人會(huì)說(shuō),憑什么未來(lái)和你描述一樣呢?是不是有蹭AI熱度之嫌?好吧,撇開(kāi)AI不談(其實(shí)它并不是一個(gè)體現(xiàn)本書價(jià)值的關(guān)鍵因素),想象一下五年后的自己,任何技術(shù)人員的職業(yè)發(fā)展都是從低級(jí)到高級(jí)、技術(shù)到業(yè)務(wù)、具體到抽象的過(guò)程。即便沒(méi)有AI,我們是要立志成為精通多個(gè)領(lǐng)域知識(shí)的建模師、架構(gòu)師,還是一個(gè)只會(huì)寫代碼,知曉許多類庫(kù)用法的技術(shù)人員?答案在你心中。更何況,上面描述的工作場(chǎng)景已經(jīng)不是未來(lái)時(shí)態(tài)了,在很多團(tuán)隊(duì)中已經(jīng)真真切切地開(kāi)始發(fā)生。
幾年之內(nèi),開(kāi)發(fā)人員都會(huì)逐步轉(zhuǎn)到新的工作中,開(kāi)發(fā)崗位的工作內(nèi)容會(huì)發(fā)生巨大變化。如前所言,這絕不是壞事,它讓我們的職業(yè)邁上了新的臺(tái)階,而我們唯一要做的就是開(kāi)始學(xué)習(xí),點(diǎn)亮建模和架構(gòu)的技能樹(shù)。
本書可以成為一個(gè)不錯(cuò)的起點(diǎn),不管你是否曾經(jīng)了解過(guò)DDD、參與過(guò)模型構(gòu)建,它都可以讓你輕松地開(kāi)始。隨著閱讀的深入,你會(huì)發(fā)現(xiàn)自己已經(jīng)完全被代入了建模師和架構(gòu)師的角色。
第二,推動(dòng)DDD方法落地的同時(shí)促進(jìn)國(guó)內(nèi)軟件工程思想的發(fā)展。
從20年前上學(xué)時(shí)閱讀的《人月神話》《人件》,到如今敏捷、DevOps、TDD、DDD等各種方法滿天飛,所有主流的軟件工程思想都來(lái)源于國(guó)外。當(dāng)然,由于技術(shù)發(fā)展的歷史原因,這并不奇怪。我們也早已不缺少世界級(jí)的互聯(lián)網(wǎng)公司和有實(shí)力的科技企業(yè),但在“如何開(kāi)發(fā)好軟件”這個(gè)問(wèn)題上,還很難看到國(guó)人的創(chuàng)新思維和貢獻(xiàn),更關(guān)鍵的是,我們甚至都沒(méi)意識(shí)到這是個(gè)問(wèn)題。
更嚴(yán)重的影響還在于,由于缺乏對(duì)這個(gè)問(wèn)題的主動(dòng)探索和深入思考,我們對(duì)外來(lái)方法論的應(yīng)用大多停留在“術(shù)”的層面,缺乏對(duì)“道”的探究。有術(shù)無(wú)道止于術(shù),有太多生搬硬套、南轅北轍的例子了,團(tuán)隊(duì)和企業(yè)管理者根本感受不到這些方法論帶來(lái)的價(jià)值,甚至對(duì)它們產(chǎn)生了誤解和反感。
本書與其他講授DDD的書籍的主要區(qū)別在于,它絕不僅僅講授方法和技巧(當(dāng)然,本書在這方面也有非常豐富且創(chuàng)新的內(nèi)容),還深入發(fā)掘了其背后的思想和原理。使用的軟件工程和架構(gòu)原則的分析方法也不局限于應(yīng)用在DDD上,而是可以用來(lái)衡量任何方法的效能和技術(shù)決策的優(yōu)劣。
本書的目的之一是在指導(dǎo)團(tuán)隊(duì)成功落地DDD的同時(shí),激發(fā)讀者對(duì)書中思維角度和分析方法的思考。因此這些思想和方法都不是完美無(wú)瑕的,而恰恰相反,筆者希望讀者能在思考后給出批判性的意見(jiàn)。激發(fā)讀者思考,終究會(huì)點(diǎn)燃有才華的讀者的靈感之火。
讀者對(duì)象
AI時(shí)代需要職業(yè)轉(zhuǎn)型的開(kāi)發(fā)人員、架構(gòu)師及其他IT從業(yè)者。
工業(yè)制造、新興互聯(lián)網(wǎng)等復(fù)雜領(lǐng)域的軟件開(kāi)發(fā)團(tuán)隊(duì)。
計(jì)劃或已經(jīng)落地DDD、TDD、微服務(wù)和DevOps的軟件開(kāi)發(fā)團(tuán)隊(duì)。
技術(shù)管理者、研發(fā)效能專家和咨詢顧問(wèn)。
即將步入社會(huì)的計(jì)算機(jī)系大學(xué)生。
本書主要內(nèi)容
第1~3章為理論部分,主要講授DDD的底層邏輯、基本原則、價(jià)值、落地難點(diǎn)和成熟度模型。其中,第1章是全書的基石,特別是DDD的兩個(gè)基本原則,是我們討論后面內(nèi)容的基礎(chǔ),讀者務(wù)必仔細(xì)閱讀、領(lǐng)悟和掌握。第2章分析了DDD落地的難點(diǎn),幫助團(tuán)隊(duì)掃清障礙。第3章首次提出DDD成熟度模型,不僅列出了整個(gè)DDD戰(zhàn)略和戰(zhàn)術(shù)模式,還提出了企業(yè)收益這個(gè)對(duì)企業(yè)意義重大的衡量指標(biāo),3個(gè)成熟度階段的劃分對(duì)團(tuán)隊(duì)也具有重要的指導(dǎo)意義。
第4~10章為實(shí)操部分,主要講授DDD的戰(zhàn)略和戰(zhàn)術(shù),分別對(duì)應(yīng)于業(yè)務(wù)建模和架構(gòu)技術(shù)。其中,第4~6章側(cè)重于業(yè)務(wù)建模,主要介紹如何構(gòu)建領(lǐng)域模型和打造通用語(yǔ)言。第7章側(cè)重于架構(gòu)技術(shù),主要講授如何分割系統(tǒng)、構(gòu)建模塊。第8章主要解決DDD在編碼環(huán)節(jié)可能遇到的問(wèn)題。第9章則是設(shè)計(jì)模式的運(yùn)用,這些模式將幫助我們得到更加智慧、更加優(yōu)雅健壯的領(lǐng)域模型。第10章闡述DDD和系統(tǒng)架構(gòu)之間的關(guān)系。
勘誤和支持
作者在博客園(Cnblogs.com)開(kāi)設(shè)了專欄講解書中的內(nèi)容并回答讀者提問(wèn),讀者在該網(wǎng)站搜索書名即可找到相關(guān)專欄并參與討論。
目 錄 Contents
前言
第1章 DDD的基本原則與價(jià)值分析1
1.1 DDD的初心1
1.1.1 軟件項(xiàng)目成敗的關(guān)鍵1
1.1.2 兩個(gè)亟須驗(yàn)證的事實(shí)3
1.2 DDD的基本原則6
1.2.1 DDD的兩個(gè)基本原則7
1.2.2 原則的底層邏輯10
1.3 DDD的價(jià)值分析12
1.3.1 復(fù)雜度控制12
1.3.2 架構(gòu)原則16
1.3.3 團(tuán)隊(duì)協(xié)作20
1.4 關(guān)于DDD原則的案例23
第2章 DDD落地難點(diǎn)分析35
2.1 DDD的適用范圍35
2.1.1 領(lǐng)域特性36
2.1.2 團(tuán)隊(duì)成熟度38
2.1.3 適用性評(píng)分表39
2.2 5個(gè)常見(jiàn)誤區(qū)39
2.3 文化的變革44
2.3.1 領(lǐng)域?qū)<业倪吔?4
2.3.2 設(shè)計(jì)師的錘子46
2.3.3 開(kāi)發(fā)人員的輪子47
2.4 團(tuán)隊(duì)的挑戰(zhàn)48
2.4.1 管理者的責(zé)任48
2.4.2 開(kāi)發(fā)團(tuán)隊(duì)的意識(shí)和技能50
2.4.3 角色重新定位51
2.5 測(cè)試、過(guò)程和架構(gòu)的佳搭檔52
2.5.1 測(cè)試的佳搭檔:TDD和
單元測(cè)試52
2.5.2 過(guò)程的佳搭檔:敏捷過(guò)程
和DevOps54
2.5.3 架構(gòu)的佳搭檔:六邊形、
洋蔥和分層架構(gòu)56
第3章 DDD成熟度模型59
3.1 成熟度模型的目的及特殊性59
3.2 5個(gè)度量維度60
3.3 3級(jí)成熟度模型63
第4章 模型的要素—用例、
視圖和構(gòu)造塊68
4.1 模型的構(gòu)建步驟68
4.2 模型的場(chǎng)景:用例69
4.2.1 用例的定義69
4.2.2 用例的目的70
4.2.3 發(fā)現(xiàn)用例72
4.2.4 用例的編寫73
4.3 模型的數(shù)據(jù):類圖76
4.3.1 屬性77
4.3.2 方法78
4.3.3 注釋、約束和關(guān)鍵字79
4.3.4 依賴和限定關(guān)聯(lián)80
4.3.5 聚合與組合82
4.4 模型的行為:交互圖83
4.4.1 時(shí)序圖84
4.4.2 協(xié)作圖89
4.4.3 交互圖與類圖的關(guān)系91
4.5 模型的變化:操作契約92
4.5.1 作用93
4.5.2 后置條件94
4.5.3 準(zhǔn)則94
4.6 模型的構(gòu)造塊:實(shí)體、值對(duì)象、
領(lǐng)域服務(wù)95
4.6.1 實(shí)體95
4.6.2 值對(duì)象99
4.6.3 實(shí)體與值對(duì)象的比較103
4.6.4 領(lǐng)域服務(wù)105
第5章 從語(yǔ)言到模型—基礎(chǔ)
模型構(gòu)建108
5.1 設(shè)計(jì)目標(biāo)108
5.2 設(shè)計(jì)之前的準(zhǔn)備工作110
5.2.1 語(yǔ)言110
5.2.2 角色111
5.2.3 溝通111
5.2.4 方法113
5.2.5 工具113
5.2.6 時(shí)間115
5.3 領(lǐng)域模型的構(gòu)建115
5.3.1 發(fā)掘領(lǐng)域概念116
5.3.2 創(chuàng)建關(guān)聯(lián)118
5.3.3 定義屬性123
5.3.4 分配職責(zé)125
5.3.5 觸發(fā)事件128
5.3.6 處理異常134
5.4 典型的領(lǐng)域邏輯建模137
5.4.1 規(guī)則與約束137
5.4.2 流程與分支140
5.4.3 驗(yàn)證與篩選142
5.4.4 算法與計(jì)算144
5.4.5 時(shí)間與空間146
5.4.6 有狀態(tài)與無(wú)狀態(tài)149
5.4.7 同步與異步150
5.5 典型案例151
5.5.1 案例1:在線購(gòu)物網(wǎng)站152
5.5.2 案例2:汽車租賃系統(tǒng)153
5.5.3 案例3:銀行系統(tǒng)154
第6章 精煉模型—深入模型設(shè)計(jì)156
6.1 模型引力場(chǎng):聚合156
6.1.1 聚合的定義及作用157
6.1.2 聚合規(guī)則158
6.1.3 聚合設(shè)計(jì)法則158
6.1.4 實(shí)現(xiàn)方法161
6.2 模型裝配線:工廠163
6.2.1 為什么需要工廠163
6.2.2 廠址選擇169
6.3 模型貨架:存儲(chǔ)庫(kù)171
6.3.1 為什么需要存儲(chǔ)庫(kù)171
6.3.2 存儲(chǔ)庫(kù)接口175
6.3.3 存儲(chǔ)庫(kù)與工廠的區(qū)別176
6.3.4 存儲(chǔ)庫(kù)與數(shù)據(jù)訪問(wèn)對(duì)象的區(qū)別177
6.3.5 存儲(chǔ)庫(kù)實(shí)現(xiàn)的注意事項(xiàng)177
6.4 富二代的煩惱:基類與繼承178
6.4.1 抽象、泛化與DDD178
6.4.2 通用語(yǔ)言與基類179
6.4.3 為多態(tài)去繼承181
6.4.4 合格的子類、自然的繼承關(guān)系:
Liskov原則182
6.4.5 抽象類與接口的選擇183
6.5 模型質(zhì)量:優(yōu)秀的開(kāi)發(fā)組件 184
6.5.1 精心設(shè)計(jì)領(lǐng)域模型的特征184
6.5.2 模型設(shè)計(jì)的基本原則186
6.5.3 為擴(kuò)展性而設(shè)計(jì)188
第7章 分而治之—上下文、
模塊和子域191
7.1 分離用例、模型和團(tuán)隊(duì):上下文191
7.1.1 什么是上下文191
7.1.2 為什么需要上下文193
7.1.3 上下文的識(shí)別方法195
7.1.4 識(shí)別上下文的步驟199
7.1.5 同一上下文工作法200
7.1.6 跨上下文團(tuán)隊(duì)工作法202
7.2 重用性和穩(wěn)定性:模塊207
7.2.1 包的內(nèi)聚性原則207
7.2.2 包的耦合性原則209
7.3 區(qū)別特殊性與一般性:子域211
7.3.1 核心競(jìng)爭(zhēng)力:核心域211
7.3.2 周邊業(yè)務(wù):支撐域215
7.3.3 通用能力:通用域215
7.4 上下文、模塊和子域之間的關(guān)系216
7.4.1 上下文和子域的關(guān)系216
7.4.2 上下文和模塊的關(guān)系216
7.4.3 子域和模塊的關(guān)系217
第8章 關(guān)鍵細(xì)節(jié)—從模型到代碼218
8.1 DDD 中的代碼要求