日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

领域驱动设计(DDD)的精髓

發(fā)布時間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 领域驱动设计(DDD)的精髓 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

邊界是核心

無論是從宏觀到微觀再到納米層次,還是從戰(zhàn)略設(shè)計推進到戰(zhàn)術(shù)設(shè)計,領(lǐng)域驅(qū)動設(shè)計一直強調(diào)的核心思想,就是對邊界的劃分與控制

從分析需求一開始,我們就需要通過確定項目的愿景與目標,劃定問題空間,由此確定核心子領(lǐng)域、通用子領(lǐng)域與支撐子領(lǐng)域。這是領(lǐng)域驅(qū)動設(shè)計的第一重邊界。它幫助團隊看清主次,理清了問題域中領(lǐng)域邏輯的優(yōu)先級,同時促使團隊在宏觀層次的全局分析階段能夠?qū)⒃O(shè)計的注意力放在領(lǐng)域和對領(lǐng)域模型的理解上,滿足領(lǐng)域驅(qū)動設(shè)計的要求。

進入解決方案空間,戰(zhàn)略設(shè)計獲得的限界上下文成為了領(lǐng)域驅(qū)動設(shè)計的第二重邊界。通過它可以有效地降低系統(tǒng)規(guī)模,無論是在業(yè)務(wù)領(lǐng)域,還是架構(gòu)設(shè)計,或者團隊協(xié)作方面,限界上下文建立的邊界都成為了重要的約束力,邊界內(nèi)外可以形成兩個不同的世界。暴露在限界上下文邊界外部的是遠程服務(wù)或應(yīng)用服務(wù),每個服務(wù)都提供了完整的業(yè)務(wù)價值,并通過相對穩(wěn)定的契約來展現(xiàn)服務(wù),由此確定限界上下文之間的協(xié)作方式。在限界上下文邊界之內(nèi),可以根據(jù)不同的需求場景,形成自己的一套設(shè)計與實現(xiàn)體系。外部世界的規(guī)則是契約、通信以及系統(tǒng)級別的架構(gòu)風格與模式,內(nèi)部世界的規(guī)則是分層、協(xié)作以及類級別的設(shè)計風格與模式。

在限界上下文內(nèi)部,基礎(chǔ)設(shè)施層、應(yīng)用層與領(lǐng)域?qū)又g的隔離成為了領(lǐng)域驅(qū)動設(shè)計的第三重邊界。如果以六邊形架構(gòu)來觀察這種層與層之間的隔離,體現(xiàn)的仍然是一種內(nèi)外隔離,應(yīng)用層形成了一種保護層,有效地隔離了業(yè)務(wù)復雜度與技術(shù)復雜度。將領(lǐng)域?qū)幼鳛檎麄€系統(tǒng)穩(wěn)定而內(nèi)聚的核心,是領(lǐng)域驅(qū)動設(shè)計的關(guān)鍵特征。唯有如此,才能逐漸將這個“領(lǐng)域內(nèi)核”演化為企業(yè)的重要資產(chǎn)。這也是軟件設(shè)計的核心思想,即分離變與不變。領(lǐng)域內(nèi)核中的領(lǐng)域模型具有一種本質(zhì)的不變性,只要我們將領(lǐng)域邏輯剖析清楚,該模型就能保證相對的穩(wěn)定性;若能再正確地識別可能的擴展與變化,加以抽象與封裝,就能維持領(lǐng)域模型絕對的穩(wěn)定性。內(nèi)核之外的外部資源具有一種偶然的不變性,一旦外部形勢發(fā)生變化,這種偶然的不變性就可能瞬間崩塌,需要重新建造方能煥然一新。

若要維持領(lǐng)域內(nèi)核的穩(wěn)定性,高內(nèi)聚與低耦合是其根本要則。雖然職責分配的不合理在應(yīng)用層邊界的隔離下可以將影響降到最低,但總是在調(diào)整與修改的領(lǐng)域模型無法維護領(lǐng)域概念的完整性和一致性;為此,領(lǐng)域模型引入了聚合這一最小的設(shè)計單元,它從完整性與一致性對領(lǐng)域模型進行了有效的隔離,成為了領(lǐng)域驅(qū)動設(shè)計的第四重邊界。領(lǐng)域驅(qū)動設(shè)計為聚合規(guī)定了嚴謹?shù)脑O(shè)計約束,使得整個領(lǐng)域模型的對象圖不再變得散漫,彼此之間的協(xié)作也有了嚴格的邊界控制。這一約束與控制或許加大了我們設(shè)計的難度,但它卻可以挽救因為限界上下文邊界劃分錯誤帶來的不利決策。聚合設(shè)計原則要求聚合之間通過ID進行關(guān)聯(lián),避免了聚合根實體之間的引用依賴,也不會受到限界上下文邊界變化的影響。

這四重邊界如下圖所示:

領(lǐng)域驅(qū)動設(shè)計在各個層次提出的核心模式具有不同的粒度和設(shè)計關(guān)注點,但本質(zhì)都在于確定邊界。畢竟,隨著規(guī)模的擴大,一個沒有邊界的系統(tǒng)終究會變得越來越混亂,架構(gòu)沒有清晰的層次,職責缺乏合理的分配,代碼變得不可閱讀和維護,最終形成一種無序設(shè)計。在 Pete Goodliffe 講述的《兩個系統(tǒng)的故事:現(xiàn)代軟件神話》中詳細地羅列了無序設(shè)計系統(tǒng)的幾種警告信號:

  • 代碼沒有顯而易見的進入系統(tǒng)中的路徑;
  • 不存在一致性、不存在風格、也沒有統(tǒng)一的概念能夠?qū)⒉煌牟糠纸M織在一起
  • 系統(tǒng)中的控制流讓人覺得不舒服,無法預測
  • 系統(tǒng)中有太多的“壞味道”,整個代碼庫散發(fā)著腐爛的氣味,是在大熱天里散發(fā)著刺激氣體的一個垃圾堆
  • 數(shù)據(jù)很少放在使用它的地方。經(jīng)常引入額外的巴羅克式緩存層,目的是試圖讓數(shù)據(jù)停留在更方便的地方。

我們看一個無序設(shè)計的軟件系統(tǒng),就好像隔著一層半透明的玻璃觀察事物一般,系統(tǒng)中的軟件元素都變得模糊不清,充斥著各種技術(shù)債。細節(jié)層面,代碼污濁不堪,違背了“高內(nèi)聚松耦合”的設(shè)計原則,導致許多代碼要么放錯了位置,要么出現(xiàn)重復的代碼塊;架構(gòu)層面,缺乏清晰的邊界,各種通信與調(diào)用依賴糾纏在一起,同一問題域的解決方案各式各樣,讓人眼花繚亂,仿佛進入了沒有規(guī)則的無序社會。領(lǐng)域驅(qū)動設(shè)計的這四重邊界可以保證系統(tǒng)的有序性。

紀律是關(guān)鍵

一套方法體系不管有多么的完美,如果團隊不能嚴格地執(zhí)行方法體系規(guī)定的紀律,都是空談。ThoughtWorks 的楊云就指出“領(lǐng)域驅(qū)動設(shè)計是一種紀律”,他進一步解釋道:

領(lǐng)域驅(qū)動設(shè)計本身沒有多難,知道了方法的話,認真建模一次還是好搞的,但是持續(xù)地保持這個領(lǐng)域模型的更新和有效,并且堅持在工作中用統(tǒng)一語言來討論問題是很難的。紀律才是關(guān)鍵。

領(lǐng)域驅(qū)動設(shè)計強調(diào)對邊界的劃分與控制,團隊在實施領(lǐng)域驅(qū)動設(shè)計時如果沒有理解邊界控制的意義,也不遵守邊界的約束紀律,邊界的控制力就會被削弱甚至丟失。例如,我們強調(diào)通過分層架構(gòu)來隔離業(yè)務(wù)復雜度與技術(shù)復雜度,而團隊成員在編寫代碼時卻圖一時的便捷,直接將基礎(chǔ)設(shè)施層的代碼放到領(lǐng)域模型對象中;又或者為了追趕進度,沒有認真進行領(lǐng)域建模就草率編寫代碼,卻無視聚合對概念完整性、數(shù)據(jù)一致性的保護,則領(lǐng)域驅(qū)動設(shè)計強調(diào)的四重邊界就形同虛設(shè)了。

紀律是關(guān)鍵,畢竟影響軟件開發(fā)質(zhì)量的關(guān)鍵因素是人,而不是設(shè)計方法。對于團隊成員而言,學習領(lǐng)域驅(qū)動設(shè)計是提高技能,是否遵守領(lǐng)域驅(qū)動設(shè)計的紀律則是一種態(tài)度。倘若二者皆有,就需要向團隊成員明確:領(lǐng)域驅(qū)動設(shè)計到底有哪些必須遵守的紀律。

結(jié)合領(lǐng)域驅(qū)動設(shè)計的完整體系,我總結(jié)了如下的“三大紀律八項注意”,可作為領(lǐng)域驅(qū)動設(shè)計團隊執(zhí)行“作戰(zhàn)任務(wù)”的紀律規(guī)范:

  • 三大紀律
    • 領(lǐng)域?qū)<遗c開發(fā)團隊工作在一起
    • 領(lǐng)域模型必須遵循統(tǒng)一語言
    • 時刻堅守四重設(shè)計邊界

  • 八項注意
    • 子領(lǐng)域與限界上下文不要混為一談
    • 一個限界上下文不能由多個團隊開發(fā)
    • 跨進程協(xié)作通過遠程服務(wù),進程內(nèi)協(xié)作通過應(yīng)用服務(wù)
    • 保證領(lǐng)域分析模型、領(lǐng)域設(shè)計模型與領(lǐng)域?qū)崿F(xiàn)模型的一致
    • 不要將領(lǐng)域模型暴露在應(yīng)用層之外
    • 不要讓數(shù)據(jù)模型干擾領(lǐng)域模型的設(shè)計
    • 聚合之間只能通過聚合根ID引用
    • 聚合不能依賴訪問外部資源的網(wǎng)關(guān)

三大紀律是實施領(lǐng)域驅(qū)動設(shè)計的最高準則,是否遵守這三大紀律,決定了實施領(lǐng)域驅(qū)動設(shè)計的成敗。八項注意則重申了設(shè)計要素與規(guī)則,并對一些規(guī)范進行了固化,避免因為團隊成員能力水平的參差不齊導致實施過程的偏差。當然,取決于不同的項目、不同的團隊,實施領(lǐng)域驅(qū)動設(shè)計的方式自然也可以有所不同,在不違背三大紀律的最高準則下,團隊也可以總結(jié)屬于自己的八項注意。

領(lǐng)域驅(qū)動設(shè)計能力評估模型

要實施領(lǐng)域驅(qū)動設(shè)計,必須提高團隊的整體能力。團隊的能力與遵循的紀律是一脈相承的:能力足但紀律渙散,不足以打勝仗;紀律嚴而能力缺乏,又心有余而力不足。培養(yǎng)團隊成員的能力并非一朝一夕之功,如果能夠有一套能力評估模型對團隊成員的能力進行評估,就能做到針對性的培養(yǎng)。借助領(lǐng)域驅(qū)動設(shè)計魔方與領(lǐng)域驅(qū)動設(shè)計參考過程模型引入的各種方法與模式,我建立了一套領(lǐng)域驅(qū)動設(shè)計能力評估模型。

領(lǐng)域驅(qū)動設(shè)計能力評估模型(Domain-driven design Capability Assesment Model,DCAM)是我個人對領(lǐng)域驅(qū)動設(shè)計經(jīng)驗的一個提煉,可以通過它指導團隊進行能力的培養(yǎng)和提升。DCAM 并非一個標準或一套認證體系,更非事先制定和強制執(zhí)行的評估框架。建立這套模型的目的僅僅是為了更好地實施領(lǐng)域驅(qū)動設(shè)計,我不希望它成為一種僵化的評分標準,而應(yīng)該是一個能夠不斷演化的評估框架。目前,DCAM 僅限于對象范式的領(lǐng)域驅(qū)動設(shè)計。

該能力評估模型針對的能力維度包括:

  • 敏捷迭代能力
  • 領(lǐng)域建模能力
  • 架構(gòu)設(shè)計能力
  • 整潔編碼能力

每個維度又分為了初始級、成長級與成熟級三個層次。各個層次的成熟度是圍繞著領(lǐng)域驅(qū)動設(shè)計能力開展評估的,層次越高,則團隊的成熟度就越高,推行領(lǐng)域驅(qū)動設(shè)計成功的可能性就越高。

敏捷迭代能力

我認為,領(lǐng)域驅(qū)動設(shè)計之所以在近十余年未能取得舉足輕重的成功,其中一個原因就是它沒有與敏捷軟件開發(fā)過程結(jié)合起來。敏捷開發(fā)的諸多實踐,包括精益需求管理、特性團隊、持續(xù)集成、用戶故事等都可以為領(lǐng)域驅(qū)動設(shè)計的實施保駕護航。它的評估模型為:

等級團隊需求過程初始級組件團隊,缺乏定期的交流制度沒有清晰的需求管理體系每個版本的開發(fā)周期長,無法快速響應(yīng)需求的變化成長級全功能的特性團隊,每日站立會議定義了產(chǎn)品待辦項和迭代待辦項采用了迭代開發(fā),定期交付小版本成熟級自組織的特性團隊,團隊成員定期輪換,形成知識共享建立了故事地圖、建立了史詩故事、特性與用戶故事的需求體系建立了可視化的看板,由下游拉動需求的開發(fā),消除浪費

領(lǐng)域建模能力

團隊的領(lǐng)域建模能力是推行領(lǐng)域驅(qū)動設(shè)計的基礎(chǔ),也是有別于其他軟件開發(fā)方法的根本。它的評估模型為:

等級領(lǐng)域建模初始級采用數(shù)據(jù)建模,建立以數(shù)據(jù)表關(guān)系為基礎(chǔ)的數(shù)據(jù)模型成長級采用領(lǐng)域建模,建模工作只限于少數(shù)資深技術(shù)人員,并憑借經(jīng)驗完成建模成熟級采用事件風暴、四色建模等建模方法,由領(lǐng)域?qū)<遗c開發(fā)團隊一起圍繞核心子領(lǐng)域開展領(lǐng)域建模

架構(gòu)設(shè)計能力

如果說領(lǐng)域建模完成了對現(xiàn)實世界的抽象與提煉,則架構(gòu)設(shè)計就是在解決方案空間中進一步對領(lǐng)域模型的細化,添加合理的設(shè)計元素,從而建立邊界清晰,具有可重用性與可擴展性的設(shè)計模型。它的評估模型為:

等級架構(gòu)設(shè)計初始級采用傳統(tǒng)三層架構(gòu),未遵循整潔架構(gòu),整個系統(tǒng)缺乏清晰的邊界采用貧血領(lǐng)域模型,業(yè)務(wù)邏輯主要以事務(wù)腳本實現(xiàn)成長級領(lǐng)域?qū)幼鳛榉謱蛹軜?gòu)的獨立一層,并為領(lǐng)域?qū)觿澐至四K采用了富領(lǐng)域模型,遵循面向?qū)ο笤O(shè)計思想,但未明確定義聚合和資源庫成熟級建立了系統(tǒng)層次與限界上下文層次的系統(tǒng)架構(gòu),遵循了整潔架構(gòu),建立了清晰的限界上下文與領(lǐng)域?qū)舆吔缃⒘艘跃酆蠟楹诵牡念I(lǐng)域設(shè)計模型,職責合理地分配給聚合、資源庫與領(lǐng)域服務(wù)

整潔編碼能力

領(lǐng)域?qū)崿F(xiàn)模型才是最終要交付的工件,它的質(zhì)量直接影響了軟件的開發(fā)成本和運維成本。按照領(lǐng)域驅(qū)動設(shè)計方法開發(fā)出來的代碼,應(yīng)該具有清晰表達的領(lǐng)域含義,并成為重要的企業(yè)資產(chǎn)。衡量領(lǐng)域?qū)崿F(xiàn)模型質(zhì)量的標準就是看它是否滿足了整潔代碼的要求。它的評估模型為:

等級編碼自動化測試初始級編碼以實現(xiàn)功能為唯一目的沒有任何自動化測試成長級方法和類的命名都遵循了統(tǒng)一語言,可讀性高為核心的領(lǐng)域產(chǎn)品代碼提供了單元測試成熟級采用測試驅(qū)動開發(fā)編寫領(lǐng)域代碼,遵循簡單設(shè)計原則具有明確的測試戰(zhàn)略,單元測試先行

總結(jié)

許多人反應(yīng)領(lǐng)域驅(qū)動設(shè)計很難。Eric Evans 創(chuàng)造了許多領(lǐng)域驅(qū)動設(shè)計的專有術(shù)語,這為團隊學習領(lǐng)域驅(qū)動設(shè)計制造了知識障礙。對象范式的領(lǐng)域驅(qū)動設(shè)計建立在良好的面向?qū)ο笤O(shè)計基礎(chǔ)上,如果開發(fā)人員對面向?qū)ο笤O(shè)計的本質(zhì)思想理解不深,就會在運用領(lǐng)域驅(qū)動設(shè)計的模式時,顯得首鼠兩端,不知道該做出怎樣的設(shè)計決策才滿足領(lǐng)域驅(qū)動設(shè)計的要求。這種執(zhí)著于書本知識的運用方式過于僵化,一旦面臨設(shè)計難題又找不到標準答案時,就不知該如何是好了。任何一本領(lǐng)域驅(qū)動設(shè)計的書籍都不可能窮盡所有的領(lǐng)域場景,并給出具體的設(shè)計指導,這就需要團隊在學習過程中把握領(lǐng)域驅(qū)動設(shè)計的精髓。

明確領(lǐng)域驅(qū)動設(shè)計的四重邊界,將面向?qū)ο笤O(shè)計思想融入到對邊界的界定與規(guī)劃中,并要求團隊遵守領(lǐng)域驅(qū)動設(shè)計的紀律,就能更好地實施領(lǐng)域驅(qū)動設(shè)計。當然,這一切的基礎(chǔ)還取決于一個成熟的領(lǐng)域驅(qū)動設(shè)計團隊。利用 DCAM 對團隊進行評估,在發(fā)現(xiàn)團隊成員的能力短板后進行針對性的培訓,一旦提升了整個團隊的成熟度,在領(lǐng)域驅(qū)動設(shè)計的精髓指導下,距離領(lǐng)域驅(qū)動設(shè)計的成功就不遠了!

總結(jié)

以上是生活随笔為你收集整理的领域驱动设计(DDD)的精髓的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。