課程背景
在探討領(lǐng)域驅(qū)動戰(zhàn)術(shù)設(shè)計(jì)的一些問題時(shí)抒抬,總會有人糾結(jié):這個領(lǐng)域?qū)ο髴?yīng)該定義成實(shí)體,還是值對象映之?領(lǐng)域服務(wù)和應(yīng)用服務(wù)的區(qū)別是什么?聚合的邊界該怎么劃分蜡坊?于是杠输,各種設(shè)計(jì)問題紛至沓來,問題越辯越糊涂秕衙,到了最后抬伺,已經(jīng)脫離了最初探討問題的場景,變成了“空對空導(dǎo)彈”一陣亂發(fā)射灾梦,最后驀然回首峡钓,才發(fā)現(xiàn)目標(biāo)已然消失了妓笙。
這是不合理的。在軟件開發(fā)領(lǐng)域能岩,沒有什么一勞永逸的實(shí)現(xiàn)寞宫,也沒有什么放之四海而皆準(zhǔn)的標(biāo)準(zhǔn),必須結(jié)合具體的業(yè)務(wù)場景做出合理的決策拉鹃,無論建模和設(shè)計(jì)再怎么完美辈赋,也需要通過落地的檢驗(yàn)才知道好還是壞。任何脫離具體業(yè)務(wù)場景的問題分析膏燕,都是空談钥屈;任何不落地的完美方案,都是浮夸坝辫。領(lǐng)域驅(qū)動設(shè)計(jì)沒有標(biāo)準(zhǔn)篷就,有的只是持續(xù)不斷的不確定性。
正所謂“以不變應(yīng)萬變”近忙,我們要從實(shí)證主義的角度看待領(lǐng)域驅(qū)動設(shè)計(jì)竭业,竊以為,只需守住三項(xiàng)基本原則即可:
- 必須通過領(lǐng)域建模來驅(qū)動設(shè)計(jì)
- 領(lǐng)域?qū)<一驑I(yè)務(wù)分析師必須參與到建募吧幔活動中
- 設(shè)計(jì)必須遵循面向?qū)ο蠓治龊驮O(shè)計(jì)的思想與原則
只要做到這三點(diǎn)未辆,領(lǐng)域驅(qū)動戰(zhàn)術(shù)設(shè)計(jì)就不會做得太差,剩下的不足锯玛,就需要靠經(jīng)驗(yàn)來填補(bǔ)了咐柜。
點(diǎn)擊了解《領(lǐng)域驅(qū)動設(shè)計(jì)實(shí)踐(戰(zhàn)術(shù)篇)》
課程框架
本課程是我計(jì)劃撰寫的領(lǐng)域驅(qū)動設(shè)計(jì)實(shí)踐系列的第二部分課程,要解決的正是前面所提及的戰(zhàn)術(shù)層面的設(shè)計(jì)問題攘残。單以戰(zhàn)術(shù)設(shè)計(jì)階段來看拙友,我個人認(rèn)為 Eric Evans 做出的貢獻(xiàn)并不多。在《領(lǐng)域驅(qū)動設(shè)計(jì)》一書中肯腕,他講到了模型驅(qū)動設(shè)計(jì)與領(lǐng)域建模献宫,卻沒有深入闡述該如何正確地進(jìn)行領(lǐng)域建模钥平;他引入的資源庫模式和工廠模式实撒,不過是面向?qū)ο笤O(shè)計(jì)原則的體現(xiàn);至于模型的演化與重構(gòu)帶來的突破涉瘾,其實(shí)更多是經(jīng)驗(yàn)之談知态,缺乏切實(shí)可行的方法。整體而言立叛,Eric Evans 在戰(zhàn)術(shù)設(shè)計(jì)要素方面负敏,最為重要的洞見在于:
- 強(qiáng)調(diào)了領(lǐng)域建模的重要性,并與面向?qū)ο蠓治龊驮O(shè)計(jì)的原則結(jié)合起來
- 實(shí)體與值對象的區(qū)分秘蛇,有利于我們明白模型對象的真相其做,并能夠更好地避免貧血模型
- 聚合提出了有別于模塊粒度的邊界顶考,有效地保證了業(yè)務(wù)規(guī)則的不變性和數(shù)據(jù)的一致性
不可否認(rèn),若要做到優(yōu)良的領(lǐng)域驅(qū)動設(shè)計(jì)妖泄,建模和設(shè)計(jì)的經(jīng)驗(yàn)是必不可少的驹沿,這需要多年的項(xiàng)目實(shí)戰(zhàn)打磨方可萃取而成,但如果在開始之初蹈胡,能有一些更為具體的方法作為指引渊季,或許可以讓掌握技能的周期大幅度縮短。此外罚渐,我還清楚地看到:許多領(lǐng)域驅(qū)動設(shè)計(jì)的門外漢却汉,之所以遲遲不得其門而入,是因?yàn)樗ㄋ﹤冞B最為基本的面向?qū)ο蠓治龊驮O(shè)計(jì)的能力都不具備荷并,因此合砂,無法理解領(lǐng)域驅(qū)動的戰(zhàn)術(shù)設(shè)計(jì)要素也就不足為奇了。關(guān)鍵在于璧坟,許多設(shè)計(jì)問題因?yàn)槠洳淮_定性既穆,根本沒有標(biāo)準(zhǔn)答案,沒有任何人能給你指出明確的設(shè)計(jì)方法和設(shè)計(jì)思路雀鹃。這時(shí)幻工,就必須要吃透面向?qū)ο蠓治龊驮O(shè)計(jì)的思想與原則,用它們來指導(dǎo)我們的設(shè)計(jì)黎茎,而不是死板的遵循領(lǐng)域驅(qū)動設(shè)計(jì)的模式囊颅。
針對一些設(shè)計(jì)能力不足的開發(fā)團(tuán)隊(duì),若希望采用領(lǐng)域驅(qū)動設(shè)計(jì)來改進(jìn)設(shè)計(jì)和編碼質(zhì)量傅瞻,往往會適得其反踢代,做出來的是一鍋“夾生飯”。從理想角度講嗅骄,決定是否采用領(lǐng)域驅(qū)動設(shè)計(jì)胳挎,不在于團(tuán)隊(duì)成員的能力高低,而在于業(yè)務(wù)的復(fù)雜度溺森。然而慕爬,我們又不得不面對現(xiàn)實(shí),如果團(tuán)隊(duì)成員的設(shè)計(jì)能力差了屏积,是做不好領(lǐng)域驅(qū)動設(shè)計(jì)的医窿。因此,我在本課程中炊林,一方面分享了我的設(shè)計(jì)體驗(yàn)和方法姥卢,以幫助團(tuán)隊(duì)成員的成長,另一方面也給出了一個操作性強(qiáng)的設(shè)計(jì)過程,可以讓基礎(chǔ)相對薄弱的開發(fā)人員能夠依樣畫葫蘆独榴,做出還算不錯的設(shè)計(jì)與實(shí)現(xiàn)僧叉。
這些考慮幫助我確定了本課程的基本思路,即以能學(xué)習(xí)和模仿的戰(zhàn)術(shù)設(shè)計(jì)方法來彌補(bǔ)經(jīng)驗(yàn)之不足棺榔,以設(shè)計(jì)思想和設(shè)計(jì)原則作為指導(dǎo)來解決爭議之問題彪标,以能夠落地的解決方案來體現(xiàn)領(lǐng)域驅(qū)動設(shè)計(jì)之價(jià)值。
本課程分為六部分掷豺,共 64 篇(含訪談錄捞烟、開篇詞)。
- 第一部分:軟件系統(tǒng)中的模型(第 1-1 課 ~ 第 1-15 課)
全面講解和對比軟件系統(tǒng)的數(shù)據(jù)模型当船、服務(wù)模型和領(lǐng)域模型题画,以這些模型作為不同的設(shè)計(jì)驅(qū)動力,講解不同的模型驅(qū)動設(shè)計(jì)之過程與利弊德频,從而得出領(lǐng)域模型驅(qū)動設(shè)計(jì)的優(yōu)勢以及它適用的業(yè)務(wù)場景苍息。
- 第二部分:領(lǐng)域分析模型(第 2-1 課 ~ 第 2-7 課)
建立領(lǐng)域分析模型是領(lǐng)域模型驅(qū)動設(shè)計(jì)的起點(diǎn)和基礎(chǔ)。領(lǐng)域分析過程是領(lǐng)域?qū)<遗c開發(fā)團(tuán)隊(duì)合作最為緊密壹置、溝通最為頻繁的階段竞思,是領(lǐng)域驅(qū)動設(shè)計(jì)成敗的關(guān)鍵。我將深入介紹名詞動詞法钞护、分析模式盖喷、四色建模和事件風(fēng)暴等重要的分析建模方法,在發(fā)現(xiàn)顯式和隱式領(lǐng)域概念的基礎(chǔ)上难咕,建立高質(zhì)量的領(lǐng)域分析模型课梳。
- 第三部分:領(lǐng)域設(shè)計(jì)模型(第 3-1 課 ~ 第 3-17 課)
實(shí)體、值對象余佃、領(lǐng)域服務(wù)暮刃、領(lǐng)域事件、資源庫爆土、工廠和聚合是組成領(lǐng)域驅(qū)動戰(zhàn)術(shù)設(shè)計(jì)的核心內(nèi)容椭懊,也是衡量領(lǐng)域驅(qū)動設(shè)計(jì)質(zhì)量的分水嶺。只有正確地理解了這些設(shè)計(jì)要素步势,才能正確地完成領(lǐng)域驅(qū)動戰(zhàn)術(shù)設(shè)計(jì)氧猬。這其中扮演關(guān)鍵角色的其實(shí)是面向?qū)ο蠓治雠c設(shè)計(jì)。我將圍繞著職責(zé)驅(qū)動設(shè)計(jì)講解角色立润、職責(zé)與協(xié)作三者之間的關(guān)系狂窑,通過分辨職責(zé)來尋找合理的對象媳板,并結(jié)合 DCI 模式與主流設(shè)計(jì)模式桑腮,以時(shí)序圖作為主要的設(shè)計(jì)驅(qū)動力獲得高質(zhì)量的設(shè)計(jì)方案。
- 第四部分:領(lǐng)域?qū)崿F(xiàn)模型(第 4-1 課 ~ 第 4-6 課)
領(lǐng)域?qū)崿F(xiàn)模型幫助我們將領(lǐng)域設(shè)計(jì)模型落地蛉幸,畢竟破讨,只有交付可工作的軟件才是軟件開發(fā)的終極目標(biāo)丛晦。除了要應(yīng)對紛繁復(fù)雜的業(yè)務(wù)邏輯,我們還需要考慮如何與外部資源集成提陶,實(shí)現(xiàn)數(shù)據(jù)持久化與消息通信等基礎(chǔ)設(shè)施內(nèi)容烫沙。在落地過程中,我們需要時(shí)刻維護(hù)業(yè)務(wù)復(fù)雜度與技術(shù)復(fù)雜度的邊界隙笆,降低彼此的影響锌蓄,同時(shí)還需要在編碼層次提高代碼的內(nèi)建質(zhì)量,包括代碼的可讀性撑柔、可重用性瘸爽、可擴(kuò)展性和可測試性。
- 第五部分:融合:戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)(第 5-1 課 ~ 第 5-9 課)
領(lǐng)域驅(qū)動設(shè)計(jì)雖然分為戰(zhàn)略設(shè)計(jì)階段和戰(zhàn)術(shù)設(shè)計(jì)階段铅忿,但這兩個階段并非完全割裂的井水不犯河水的獨(dú)立過程剪决。我在《領(lǐng)域驅(qū)動戰(zhàn)略設(shè)計(jì)實(shí)踐》課程中介紹領(lǐng)域驅(qū)動設(shè)計(jì)過程時(shí),就提到了這兩個階段的相輔相成與迭代的螺旋上升演進(jìn)過程檀训。我們必須將戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)融合起來柑潦,把分層架構(gòu)、限界上下文峻凫、上下文映射與戰(zhàn)術(shù)設(shè)計(jì)的諸要素融匯貫通渗鬼,才能獲得最佳的設(shè)計(jì)質(zhì)量,并成為指導(dǎo)我們進(jìn)行軟件架構(gòu)和設(shè)計(jì)的全過程荧琼。
- 第六部分:EAS 系統(tǒng)的戰(zhàn)術(shù)設(shè)計(jì)實(shí)踐(第 6-1 課 ~ 第 6-8 課)
繼續(xù)沿用戰(zhàn)略設(shè)計(jì)實(shí)踐中使用的全真案例——EAS 系統(tǒng)乍钻,采用領(lǐng)域模型驅(qū)動設(shè)計(jì)的過程對系統(tǒng)進(jìn)行分析建模、設(shè)計(jì)建模和實(shí)現(xiàn)建模铭腕,并最終結(jié)合戰(zhàn)略設(shè)計(jì)的方案银择,形成完整的解決方案和代碼實(shí)現(xiàn)。
綜上累舷,本課程的內(nèi)容并未完全遵照 Eric Evans 的《領(lǐng)域驅(qū)動設(shè)計(jì)》浩考,不同的部分固然是我的一孔之見,未必正確被盈,也未必遵守 Eric Evans 的設(shè)計(jì)思想析孽,但我仍然不揣冒昧地進(jìn)行了分享,不是因?yàn)槲业臒o知者無畏只怎,而是我認(rèn)為針對具有不確定性的領(lǐng)域驅(qū)動設(shè)計(jì)袜瞬,必須要容得下異見者,方能取得發(fā)展和突破身堡。
為什么要學(xué)習(xí)領(lǐng)域驅(qū)動設(shè)計(jì)
如果你已經(jīng)能設(shè)計(jì)出美麗優(yōu)良的軟件架構(gòu)邓尤,如果你只希望腳踏實(shí)地做一名高效編碼的程序員,如果你是一位注重用戶體驗(yàn)的前端設(shè)計(jì)人員,如果你負(fù)責(zé)的軟件系統(tǒng)并不復(fù)雜汞扎,那么季稳,你確實(shí)不需要學(xué)習(xí)領(lǐng)域驅(qū)動設(shè)計(jì)!
領(lǐng)域驅(qū)動設(shè)計(jì)當(dāng)然并非“銀彈”澈魄,自然也不是解決所有疑難雜癥的“靈丹妙藥”景鼠,請事先降低對領(lǐng)域驅(qū)動設(shè)計(jì)的不合現(xiàn)實(shí)的期望。我以中肯地態(tài)度總結(jié)了領(lǐng)域驅(qū)動設(shè)計(jì)可能會給你帶來的收獲:
- 領(lǐng)域驅(qū)動設(shè)計(jì)是一套完整而系統(tǒng)的設(shè)計(jì)方法痹扇,它能給你從戰(zhàn)略設(shè)計(jì)到戰(zhàn)術(shù)設(shè)計(jì)的規(guī)范過程铛漓,使得你的設(shè)計(jì)思路能夠更加清晰,設(shè)計(jì)過程更加規(guī)范鲫构;
- 領(lǐng)域驅(qū)動設(shè)計(jì)尤其善于處理與領(lǐng)域相關(guān)的高復(fù)雜度業(yè)務(wù)的產(chǎn)品研發(fā)票渠,通過它可以為你的產(chǎn)品建立一個核心而穩(wěn)定的領(lǐng)域模型內(nèi)核,有利于領(lǐng)域知識的傳遞與傳承芬迄;
- 領(lǐng)域驅(qū)動設(shè)計(jì)強(qiáng)調(diào)團(tuán)隊(duì)與領(lǐng)域?qū)<业暮献魑是辏軌驇椭鷪F(tuán)隊(duì)建立一個溝通良好的團(tuán)隊(duì)組織,構(gòu)建一致的架構(gòu)體系禀梳;
- 領(lǐng)域驅(qū)動設(shè)計(jì)強(qiáng)調(diào)對架構(gòu)與模型的精心打磨杜窄,尤其善于處理系統(tǒng)架構(gòu)的演進(jìn)設(shè)計(jì);
- 領(lǐng)域驅(qū)動設(shè)計(jì)的思想算途、原則與模式有助于提高團(tuán)隊(duì)成員的面向?qū)ο笤O(shè)計(jì)能力與架構(gòu)設(shè)計(jì)能力塞耕;
- 領(lǐng)域驅(qū)動設(shè)計(jì)與微服務(wù)架構(gòu)天生匹配,無論是在新項(xiàng)目中設(shè)計(jì)微服務(wù)架構(gòu)嘴瓤,還是將系統(tǒng)從單體架構(gòu)演進(jìn)到微服務(wù)設(shè)計(jì)扫外,都可以遵循領(lǐng)域驅(qū)動設(shè)計(jì)的架構(gòu)原則。
課程寄語
沒有誰能夠做到領(lǐng)域驅(qū)動設(shè)計(jì)的一蹴而就廓脆,一門課程也不可能窮盡領(lǐng)域驅(qū)動設(shè)計(jì)的方方面面筛谚。從知識的學(xué)習(xí)到知識的掌握,進(jìn)而達(dá)到能力的提升停忿,需要一個漫長的過程驾讲。所謂“理論聯(lián)系實(shí)際”雖然是一句大家耳熟能詳?shù)睦显挘渲刑N(yùn)含了顛撲不破的真理席赂。我在進(jìn)行領(lǐng)域驅(qū)動設(shè)計(jì)培訓(xùn)時(shí)吮铭,總會有學(xué)員希望我能給出數(shù)學(xué)公式般的設(shè)計(jì)準(zhǔn)則或規(guī)范,似乎軟件設(shè)計(jì)就像拼積木一般颅停,只要遵照圖示中給出的拼搭過程谓晌,不經(jīng)思考就能拼出期待的模型●啵——這是不切實(shí)際的幻想纸肉。
要掌握領(lǐng)域驅(qū)動設(shè)計(jì)溺欧,就不要被它給出的概念所迷惑,而要去思索這些概念背后蘊(yùn)含的原理毁靶,多問一些為什么。同時(shí)逊移,要學(xué)會運(yùn)用設(shè)計(jì)原則去解決問題预吆,而非所謂的“設(shè)計(jì)規(guī)范”。我強(qiáng)烈建議讀者諸君要學(xué)會對設(shè)計(jì)的本質(zhì)思考胳泉,不要只限于對設(shè)計(jì)概念的掌握拐叉,而要追求對設(shè)計(jì)原則與方法的融匯貫通。只有如此扇商,才能針對不同的業(yè)務(wù)場景靈活地運(yùn)用領(lǐng)域驅(qū)動設(shè)計(jì)凤瘦,而非像一個牽線木偶般遵照著僵硬的過程進(jìn)行死板地設(shè)計(jì)。
分享交流
我們?yōu)楸菊n程付費(fèi)讀者創(chuàng)建了微信交流群案铺,以方便更有針對性地討論課程相關(guān)問題蔬芥。入群方式請到跳轉(zhuǎn)底部鏈接獲取。
閱讀文章過程中有任何疑問隨時(shí)可以跟其他小伙伴討論控汉,或者直接向作者提問(作者看到后抽空回復(fù))笔诵。你的分享不僅幫助他人,更會提升自己姑子。
點(diǎn)擊了解《領(lǐng)域驅(qū)動設(shè)計(jì)實(shí)踐(戰(zhàn)術(shù)篇)》