解構(gòu)DDD:軟件的核心是為用戶解決領(lǐng)域相關(guān)的問(wèn)題

軟件的核心是其為用戶解決領(lǐng)域相關(guān)的問(wèn)題的能力。所有其他特性,不管有多么重要,都要服務(wù)于這個(gè)基本目的?!狤ricEvans,《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》

應(yīng)對(duì)軟件復(fù)雜度,許多頂尖的軟件設(shè)計(jì)人員與開發(fā)人員紛紛結(jié)合實(shí)踐提出自己的真知灼見,既包括編程思想、設(shè)計(jì)原則、模式語(yǔ)言、過(guò)程方法和管理理論,又包括對(duì)編程利器自身的打磨。毫無(wú)疑問(wèn),通過(guò)這些真知灼見,軟件領(lǐng)域的先行者已經(jīng)改變或正在改變我們構(gòu)建軟件的方法、過(guò)程和目標(biāo),我們欣喜地看到了軟件的構(gòu)建正在向著好的方向改變。然而,整個(gè)客觀世界的所有現(xiàn)象都存在諸如黑與白、陰與陽(yáng)、亮與暗的相對(duì)性,任何技術(shù)的發(fā)展都不是單向的。隨著技術(shù)日新月異向前發(fā)展,軟件系統(tǒng)的復(fù)雜度也日益增長(zhǎng)。中國(guó)有一句古諺:“道高一尺,魔高一丈?!庇钟兄V語(yǔ):“魔高一尺,道高一丈?!本烤故堑栏哌€是魔高,就看你是站在“道”的一方,還是“魔”的一方。
在構(gòu)建軟件的場(chǎng)景中,軟件復(fù)雜度顯然就是“魔”,控制軟件復(fù)雜度的方法則是“道”。在軟件構(gòu)建領(lǐng)域,“道”雖非虛無(wú)縹緲的玄幻敘述,卻也不是綁定在具象之上的具體手段。軟件復(fù)雜度的應(yīng)對(duì)之道提供了一些基本法則,這些基本法則可以說(shuō)放之四海而皆準(zhǔn),其中一條基本法則就是:能夠控制軟件復(fù)雜度的,只能是設(shè)計(jì)(指廣泛意義上的設(shè)計(jì))方法。因?yàn)槲覀儫o(wú)法改變客觀存在的問(wèn)題空間(參見2.1.2節(jié)對(duì)問(wèn)題空間和解空間的闡釋),卻可以改變?cè)O(shè)計(jì)的質(zhì)量,讓好的設(shè)計(jì)為控制復(fù)雜度創(chuàng)造更多的機(jī)會(huì)。如果我們將軟件系統(tǒng)限制在業(yè)務(wù)軟件系統(tǒng)之上,又可得到另外一條基本法則:“要想克服”(業(yè)務(wù)系統(tǒng)的)復(fù)雜度,就需要非常嚴(yán)格地使用領(lǐng)域邏輯設(shè)計(jì)方法。[8]1在近20年的時(shí)間內(nèi),一種有效的領(lǐng)域邏輯設(shè)計(jì)方法就是EricEvans提出的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(domain-drivendesign)。

EricEvans通過(guò)他在2003年出版的經(jīng)典著作《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》(Domain-DrivenDesign:Tackling Complexity in the Heart of Software)全方位地介紹了這一設(shè)計(jì)方法,該書的副標(biāo)題旗幟鮮明地指出該方法為“軟件核心復(fù)雜性應(yīng)對(duì)之道”。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)究竟是怎樣應(yīng)對(duì)軟件復(fù)雜度的?作為一種將“領(lǐng)域”放在核心地位的設(shè)計(jì)方法,其名稱足以說(shuō)明它應(yīng)對(duì)復(fù)雜度的態(tài)度。用EricEvans自己的話來(lái)說(shuō):“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種思維方式,也是一組優(yōu)先任務(wù),它旨在加速那些必須處理復(fù)雜領(lǐng)域的軟件項(xiàng)目的開發(fā)。為了實(shí)現(xiàn)這個(gè)目標(biāo),本書給出了一套完整的設(shè)計(jì)實(shí)踐、技術(shù)和原則。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)概覽

結(jié)合我們通過(guò)理解能力和預(yù)測(cè)能力兩個(gè)維度對(duì)軟件系統(tǒng)復(fù)雜度成因的剖析,確定了影響復(fù)雜度的3個(gè)要素:規(guī)模、結(jié)構(gòu)與變化??刂茝?fù)雜度的著力點(diǎn)就在這3個(gè)要素之上!領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)對(duì)軟件復(fù)雜度的應(yīng)對(duì),是引入了一套提煉為模式的設(shè)計(jì)元模型,對(duì)業(yè)務(wù)軟件系統(tǒng)做到了對(duì)規(guī)模的控制、結(jié)構(gòu)的清晰化以及對(duì)變化的響應(yīng)。

要深刻體會(huì)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是如何控制軟件復(fù)雜度的,還需要整體了解EricEvans建立的這一套完整的軟件設(shè)計(jì)方法體系,包括該方法體系提出的設(shè)計(jì)概念與設(shè)計(jì)過(guò)程。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的基本概念

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)作為一個(gè)針對(duì)大型復(fù)雜業(yè)務(wù)系統(tǒng)的領(lǐng)域建模方法體系(不僅限于面向?qū)ο蟮念I(lǐng)域建模),它改變了傳統(tǒng)軟件開發(fā)工程師針對(duì)數(shù)據(jù)庫(kù)建模的方式,通過(guò)面向領(lǐng)域的思維方式,將要解決的業(yè)務(wù)概念和業(yè)務(wù)規(guī)則等內(nèi)容提煉為領(lǐng)域知識(shí),然后借由不同的建模范式將這些領(lǐng)域知識(shí)抽象為能夠反映真實(shí)世界的領(lǐng)域模型。

EricEvans之所以提出這套方法體系,并非刻意地另辟蹊徑,創(chuàng)造出與眾不同的設(shè)計(jì)方法與模式,而是希望恢復(fù)業(yè)務(wù)系統(tǒng)設(shè)計(jì)核心關(guān)注點(diǎn)的本來(lái)面貌,也就是認(rèn)識(shí)到領(lǐng)域建模和設(shè)計(jì)的重要性,然而在當(dāng)時(shí)看來(lái),這卻是全新的知識(shí)提煉。正如他自己所云:“至少20年前,一些頂尖的軟件設(shè)計(jì)人員就已經(jīng)認(rèn)識(shí)到領(lǐng)域建模和設(shè)計(jì)的重要性,但令人驚訝的是,這么長(zhǎng)時(shí)間以來(lái)幾乎沒(méi)有人寫出點(diǎn)兒什么,告訴大家應(yīng)該做哪些工作或如何去做……本書為做出設(shè)計(jì)決策提供了一個(gè)框架,并且為討論領(lǐng)域設(shè)計(jì)提供了一個(gè)技術(shù)詞匯庫(kù)?!边@里提到的“技術(shù)詞匯庫(kù)”就是我提到的設(shè)計(jì)元模型。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)元模型

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)元模型是以模式的形式呈現(xiàn)在大家眼前的,由諸多松散的模式構(gòu)成,這些模式在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的關(guān)系如圖所示。


領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的核心是模型驅(qū)動(dòng)設(shè)計(jì),而模型驅(qū)動(dòng)設(shè)計(jì)的核心又是領(lǐng)域模型,領(lǐng)域模型必須在統(tǒng)一語(yǔ)言的指導(dǎo)下獲得。為整個(gè)業(yè)務(wù)系統(tǒng)建立的領(lǐng)域模型要么屬于核心子領(lǐng)域,要么屬于通用子領(lǐng)域。之所以區(qū)分子領(lǐng)域,一方面是為了將一個(gè)不易解決的龐大問(wèn)題切割為團(tuán)隊(duì)可以掌控的若干小問(wèn)題,達(dá)到各個(gè)擊破的目的,另一方面也是為了更好地實(shí)現(xiàn)資產(chǎn)(人力資產(chǎn)與財(cái)力資產(chǎn))的合理分配。

為了保證定義的領(lǐng)域模型在不同上下文表達(dá)各自的知識(shí)語(yǔ)境,需要引入限界上下文,來(lái)確定業(yè)務(wù)能力的自治邊界,并考慮通過(guò)持續(xù)集成來(lái)維護(hù)模型的統(tǒng)一。上下文映射清晰地表達(dá)了多個(gè)限界上下文之間的協(xié)作關(guān)系。根據(jù)協(xié)作方式的不同,可以將上下文映射分為如下8種模式:

  • 客戶方/供應(yīng)方;
  • 共享內(nèi)核;
  • 遵奉者;
  • 分離方式;
  • 開放主機(jī)服務(wù);
  • 發(fā)布語(yǔ)言;
  • 防腐層;
  • 大泥球

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)元模型

模型驅(qū)動(dòng)設(shè)計(jì)可以在限界上下文的邊界內(nèi)部進(jìn)行,它通過(guò)分層架構(gòu)(layeredarchitecture)將領(lǐng)域獨(dú)立出來(lái),并在統(tǒng)一語(yǔ)言的指導(dǎo)下,通過(guò)與領(lǐng)域?qū)<业膮f(xié)作獲得領(lǐng)域模型。表示領(lǐng)域模型的設(shè)計(jì)要素包括實(shí)體(entity)、值對(duì)象(valueobject)、領(lǐng)域服務(wù)(domainservice)和領(lǐng)域事件(domainevent)。領(lǐng)域邏輯都應(yīng)該封裝在這些對(duì)象中。這一嚴(yán)格的設(shè)計(jì)原則可以免領(lǐng)域邏輯泄露到領(lǐng)域?qū)又?,?dǎo)致技術(shù)實(shí)現(xiàn)與領(lǐng)域邏輯的混淆。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)概覽

聚合(aggregate)(參見第15章)是一種邊界,它可以封裝一到多個(gè)實(shí)體與值對(duì)象,并維持該邊界范圍之內(nèi)的業(yè)務(wù)完整性。聚合至少包含一個(gè)實(shí)體,且只有實(shí)體才能作為聚合根(aggregateroot)。工廠(factory)和資源庫(kù)(repository)(參見第17章)負(fù)責(zé)管理聚合的生命周期。前者負(fù)責(zé)聚合的創(chuàng)建,用于封裝復(fù)雜或者可能變化的創(chuàng)建邏輯;后者負(fù)責(zé)從存放資源的位置(數(shù)據(jù)庫(kù)、內(nèi)存或者其他Web資源)獲取、添加、刪除或者修改聚合。

問(wèn)題空間和解空間

哲學(xué)家常常會(huì)圍繞真實(shí)世界和理念世界的映射關(guān)系探索人類生存的意義,即所謂“兩個(gè)世界”的哲學(xué)思考。軟件世界也可一分為二,分為構(gòu)成描述需求問(wèn)題的真實(shí)世界與獲取解決方案的理念世界。整個(gè)軟件構(gòu)建的過(guò)程,就是從真實(shí)世界映射到理念世界的過(guò)程。如果真實(shí)世界是復(fù)雜的,在映射為理念世界的過(guò)程中,就會(huì)不斷受到復(fù)雜度的干擾。根據(jù)Allen Newell和Herbert Simon的問(wèn)題空間理論:“人類是通過(guò)在問(wèn)題空間(problem space)中尋找解決方案來(lái)解決問(wèn)題的”,構(gòu)建軟件(世界)也就是從真實(shí)世界中的問(wèn)題空間尋找解決方案,將其映射為理念世界的解空間(solution space)來(lái)滿足問(wèn)題空間的需求。因此,軟件系統(tǒng)的構(gòu)建實(shí)則是對(duì)問(wèn)題空間的求解,以獲得構(gòu)成解空間的設(shè)計(jì)方案,如圖所示。

從問(wèn)題空間到解空間*

為什么要在軟件構(gòu)建過(guò)程中引入問(wèn)題空間和解空間?

實(shí)際上,隨著IT技術(shù)的發(fā)展,軟件系統(tǒng)正是在這兩個(gè)方向不斷發(fā)展和變化的。在問(wèn)題空間,我們要解決的問(wèn)題越來(lái)越棘手,空間規(guī)模越來(lái)越大,因?yàn)殡S著軟件技術(shù)的發(fā)展,許多原本由人來(lái)處理的線下流程慢慢被自動(dòng)化操作所替代,人機(jī)交互的方式發(fā)生了翻天覆地的變化,IT化的范圍變得更加寬廣,涉及的領(lǐng)域也越來(lái)越多。問(wèn)題空間的難度與規(guī)模直接決定了軟件系統(tǒng)的復(fù)雜度。

針對(duì)軟件系統(tǒng)提出的問(wèn)題,解決方案的推陳出新自然毋庸諱言,無(wú)論是技術(shù)、工具,還是設(shè)計(jì)思想與模式,都有了很大變化。解決方案不是從石頭里蹦出來(lái)的,而必然是為了解決問(wèn)題而生的。

面對(duì)錯(cuò)綜復(fù)雜的問(wèn)題,解決方案自然也需要靈活變化。軟件開發(fā)技術(shù)的發(fā)展是伴隨著復(fù)用性和擴(kuò)展性發(fā)展的。倘若問(wèn)題存在相似性,解決方案就有復(fù)用的可能。通過(guò)抽象尋找到不同問(wèn)題的共性時(shí),相同的解決方案也可以運(yùn)用到不同的問(wèn)題中。同時(shí),解決方案還需要響應(yīng)問(wèn)題的變化,能在變化發(fā)生時(shí)以最小的修改成本滿足需求,同時(shí)保障解決方案的新鮮度。無(wú)疑,構(gòu)成解空間的解決方案不僅要解決問(wèn)題,還要控制軟件系統(tǒng)的復(fù)雜度。

問(wèn)題空間需要解空間來(lái)應(yīng)對(duì),解空間自然也不可脫離問(wèn)題空間而單獨(dú)存在。對(duì)于客戶提出的需求,要分清楚什么是問(wèn)題,什么是解決方案,真正的需求才可能浮現(xiàn)出來(lái)。在看清了問(wèn)題的真相之后,我們才能有據(jù)可依地尋找真正能解決問(wèn)題的解決方案。軟件構(gòu)建過(guò)程中的需求分析,實(shí)際就是對(duì)問(wèn)題空間的定位與探索。如果在問(wèn)題空間還是一團(tuán)迷霧的時(shí)候就貿(mào)然開始設(shè)計(jì),帶來(lái)的災(zāi)難性結(jié)果是可想而知的。徐鋒認(rèn)為,“要做好軟件需求工作,業(yè)務(wù)驅(qū)動(dòng)需求思想是核心。傳統(tǒng)的需求分析是站在技術(shù)視角展開的,關(guān)注的是‘方案級(jí)需求’;而業(yè)務(wù)驅(qū)動(dòng)的需求思想則是站在用戶視角展6開的,關(guān)注的是‘問(wèn)題級(jí)需求’。”

怎么區(qū)分方案級(jí)需求和問(wèn)題級(jí)需求?方案級(jí)需求就好比一個(gè)病人到醫(yī)院看病,不管病情就直接讓醫(yī)生開阿司匹林,而問(wèn)題級(jí)需求則是向醫(yī)生描述自己身體的癥狀。病情是醫(yī)生要解決的問(wèn)題,處方是醫(yī)生提供的解決方案。那種站在技術(shù)視角展開的需求分析,實(shí)際就是沒(méi)有明確問(wèn)題空間與解空間的界限。在針對(duì)問(wèn)題空間求解時(shí),必須映射于問(wèn)題空間定義的問(wèn)題,如此才能遵循恰如其分的設(shè)計(jì)原則,在問(wèn)題空間的上下文約束下尋找合理的解決方案。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)為問(wèn)題空間與解空間提供了不同的設(shè)計(jì)元模型。對(duì)于問(wèn)題空間,強(qiáng)調(diào)運(yùn)用統(tǒng)一語(yǔ)言來(lái)描述需求問(wèn)題,利用核心子領(lǐng)域、通用子領(lǐng)域與支撐子領(lǐng)域來(lái)分解問(wèn)題空間,如此就可以“揭示什么是重要的以及在何處付出努力”。除去統(tǒng)一語(yǔ)言與子領(lǐng)域,其余設(shè)計(jì)元模型都將運(yùn)用于解空間,指導(dǎo)解決方案圍繞著“領(lǐng)域”這一核心開展業(yè)務(wù)系統(tǒng)的戰(zhàn)略設(shè)計(jì)與戰(zhàn)術(shù)設(shè)計(jì)。

戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)

對(duì)于一個(gè)復(fù)雜度高的業(yè)務(wù)系統(tǒng),過(guò)于遼闊的問(wèn)題空間使得我們無(wú)法在深入細(xì)節(jié)的同時(shí)把握系統(tǒng)的全景。既然軟件構(gòu)建的過(guò)程就是對(duì)問(wèn)題空間求解的過(guò)程,那么面對(duì)太多太大的問(wèn)題,就無(wú)法奢求一步求解,需要根據(jù)問(wèn)題的層次進(jìn)行分解。不同層次的求解目標(biāo)并不相同:為了把握系統(tǒng)的全景,就需要從宏觀層次分析和探索問(wèn)題空間,獲得對(duì)等于軟件架構(gòu)的戰(zhàn)略設(shè)計(jì)原則;為了深入業(yè)務(wù)的細(xì)節(jié),則需要從微觀層次開展建?;顒?dòng),并在戰(zhàn)略設(shè)計(jì)原則的指導(dǎo)下做出戰(zhàn)術(shù)設(shè)計(jì)決策。這就是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的兩個(gè)階段:戰(zhàn)略設(shè)計(jì)階段和戰(zhàn)術(shù)設(shè)計(jì)階段。

戰(zhàn)略設(shè)計(jì)階段要從以下兩個(gè)方面來(lái)考量。

  • 問(wèn)題空間:對(duì)問(wèn)題空間進(jìn)行合理分解,識(shí)別出核心子領(lǐng)域、通用子領(lǐng)域和支撐子領(lǐng)域,并確定各個(gè)子領(lǐng)域的目標(biāo)、邊界和建模策略。
  • 解空間:對(duì)問(wèn)題空間進(jìn)行解決方案的架構(gòu)映射,通過(guò)劃分限界上下文,為統(tǒng)一語(yǔ)言提供知識(shí)語(yǔ)境,并在其邊界內(nèi)維護(hù)領(lǐng)域模型的統(tǒng)一。每個(gè)限界上下文的內(nèi)部有著自己的架構(gòu),限界上下文之間的協(xié)作關(guān)系則通過(guò)上下文映射來(lái)體現(xiàn)和表達(dá)。

子領(lǐng)域的邊界明確了問(wèn)題空間中領(lǐng)域的優(yōu)先級(jí),限界上下文的邊界則確保了領(lǐng)域建模的最大自由度。這也是戰(zhàn)略設(shè)計(jì)在分治上起到的效用。當(dāng)我們?cè)趹?zhàn)略層次從問(wèn)題空間映射到解空間時(shí),子領(lǐng)域也將映射到限界上下文,即可根據(jù)子領(lǐng)域的類型為限界上下文選擇不同的建模方式。例如為處于核心子領(lǐng)域的限界上下文選擇領(lǐng)域模型(domainmodel)模式,為處于支撐子領(lǐng)域(supporting subdomain)的限界上下文選擇事務(wù)腳本(transactionscript)模式,這樣就可以靈活地平衡開發(fā)成本與開發(fā)質(zhì)量。

戰(zhàn)術(shù)設(shè)計(jì)階段需要在限界上下文內(nèi)部開展領(lǐng)域建模,前提是你為限界上下文選擇了領(lǐng)域模型模式。在限界上下文內(nèi)部,需要通過(guò)分層架構(gòu)將領(lǐng)域獨(dú)立出來(lái),在排除技術(shù)實(shí)現(xiàn)的干擾下,通過(guò)與領(lǐng)域?qū)<业膮f(xié)作在統(tǒng)一語(yǔ)言的指導(dǎo)下逐步獲得領(lǐng)域模型。戰(zhàn)術(shù)設(shè)計(jì)階段最重要的設(shè)計(jì)元模型是聚合模式。雖然聚合是實(shí)體和值對(duì)象的概念邊界,然而在獲得了清晰表達(dá)領(lǐng)域知識(shí)的領(lǐng)域模型后,我們可以將聚合視為表達(dá)領(lǐng)域邏輯的最小設(shè)計(jì)單元。如果領(lǐng)域行為是無(wú)狀態(tài)的,或者需要多個(gè)聚合的協(xié)作,又或者需要訪問(wèn)外部資源,則應(yīng)該將它分配給領(lǐng)域服務(wù)。至于領(lǐng)域事件,則主要用于表達(dá)領(lǐng)域?qū)ο鬆顟B(tài)的遷移,也可以通過(guò)事件來(lái)實(shí)現(xiàn)聚合乃至限界上下文之間的狀態(tài)通知。
戰(zhàn)略設(shè)計(jì)與戰(zhàn)術(shù)設(shè)計(jì)并非割裂的兩個(gè)階段,而是模型驅(qū)動(dòng)設(shè)計(jì)過(guò)程在不同階段展現(xiàn)出來(lái)的不同視圖。戰(zhàn)略設(shè)計(jì)指導(dǎo)著戰(zhàn)術(shù)設(shè)計(jì),這就等同于設(shè)計(jì)原則指導(dǎo)著設(shè)計(jì)決策。EricEvans就明確指出,“戰(zhàn)略設(shè)計(jì)原則必須把模型的重點(diǎn)放在捕獲系統(tǒng)的概念核心,也就是系統(tǒng)的‘遠(yuǎn)景’上?!碑?dāng)一個(gè)業(yè)務(wù)系統(tǒng)的規(guī)模變得越來(lái)越龐大時(shí),戰(zhàn)略設(shè)計(jì)高屋建瓴地通過(guò)限界上下文規(guī)劃了整個(gè)系統(tǒng)的架構(gòu)。只要維護(hù)好限界上下文的邊界,管理好限界上下文之間的協(xié)作關(guān)系,限制在該邊界內(nèi)開展的戰(zhàn)術(shù)設(shè)計(jì)所要面對(duì)的就是一個(gè)復(fù)雜度得到大幅降低的小型業(yè)務(wù)系統(tǒng)。

人們常以“只見樹木,不見森林”來(lái)形容一個(gè)人不具備高瞻遠(yuǎn)矚的戰(zhàn)略眼光,然而,若是“只見森林,不見樹木”,也未見得是一個(gè)褒揚(yáng)的好詞語(yǔ),它往往可以形容一個(gè)人好高騖遠(yuǎn),不愿意腳踏實(shí)地將戰(zhàn)略方案徹底落地。無(wú)論戰(zhàn)略的規(guī)劃多么完美,到了戰(zhàn)術(shù)設(shè)計(jì)的實(shí)際執(zhí)行階段,團(tuán)隊(duì)在開展對(duì)領(lǐng)域的深層次理解時(shí),總會(huì)發(fā)現(xiàn)之前被遺漏的領(lǐng)域概念,并經(jīng)過(guò)不斷的溝通與協(xié)作,“碰撞”出對(duì)領(lǐng)域的新的理解。對(duì)領(lǐng)域概念的新發(fā)現(xiàn)與完善除了能幫助我們將領(lǐng)域模型突破到深層模型,還可能促進(jìn)我們提出對(duì)戰(zhàn)略設(shè)計(jì)的修改與調(diào)整,其中就包括對(duì)限界上下文邊界的調(diào)整,從而使戰(zhàn)略設(shè)計(jì)與戰(zhàn)術(shù)設(shè)計(jì)保持統(tǒng)一。

從戰(zhàn)略設(shè)計(jì)到戰(zhàn)術(shù)設(shè)計(jì)是一個(gè)自頂向下的設(shè)計(jì)過(guò)程,體現(xiàn)為設(shè)計(jì)原則對(duì)設(shè)計(jì)決策的指導(dǎo);將戰(zhàn)術(shù)設(shè)計(jì)方案反饋給戰(zhàn)略設(shè)計(jì),則是自底向上的演化過(guò)程,體現(xiàn)為對(duì)領(lǐng)域概念的重構(gòu)引起對(duì)戰(zhàn)略架構(gòu)的重構(gòu)。二者形成不斷演化、螺旋上升的設(shè)計(jì)循環(huán)。

領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種思維方式[8]2,而模型驅(qū)動(dòng)設(shè)計(jì)則是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一種設(shè)計(jì)元模型。因此,模型驅(qū)動(dòng)設(shè)計(jì)必須在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思維方式的指導(dǎo)下進(jìn)行,那就是面向領(lǐng)域的模型驅(qū)動(dòng)設(shè)計(jì),或者更加準(zhǔn)確地將其描述為領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)。

領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)通過(guò)單一的領(lǐng)域模型同時(shí)滿足分析建模、設(shè)計(jì)建模和實(shí)現(xiàn)建模的需要,從而將分析、設(shè)計(jì)和編碼實(shí)現(xiàn)糅合在一個(gè)整體階段中,避免彼此的分離造成知識(shí)傳遞帶來(lái)的知識(shí)流失和偏差。它樹立了一種關(guān)鍵意識(shí),就是開發(fā)團(tuán)隊(duì)在針對(duì)領(lǐng)域邏輯進(jìn)行分析、設(shè)計(jì)和編碼實(shí)現(xiàn)時(shí),都在進(jìn)行領(lǐng)域建模,產(chǎn)生的輸出無(wú)論是文檔、設(shè)計(jì)圖還是代碼,都是組成領(lǐng)域模型的一部分。EricEvans將那些參與模型驅(qū)動(dòng)設(shè)計(jì)過(guò)程并進(jìn)行領(lǐng)域建模的人員稱為“親身實(shí)踐的建模者”(hands-on modeler)。

模型驅(qū)動(dòng)設(shè)計(jì)主要在戰(zhàn)術(shù)階段進(jìn)行,換言之,整個(gè)領(lǐng)域建模的工作是在限界上下文的邊界約束下進(jìn)行的,統(tǒng)一語(yǔ)言的知識(shí)語(yǔ)境會(huì)對(duì)領(lǐng)域模型產(chǎn)生影響,至少,建模人員不用考慮在整個(gè)系統(tǒng)范圍下領(lǐng)域概念是否存在沖突,是否帶來(lái)歧義。由于限界上下文擁有自己的內(nèi)部架構(gòu),一旦領(lǐng)域模型牽涉到跨限界上下文之間的協(xié)作,就需要遵循限界上下文與上下文映射的架構(gòu)約束了。

既然模型驅(qū)動(dòng)設(shè)計(jì)是面向領(lǐng)域的,就必須明確以下兩個(gè)關(guān)鍵原則。

  • 以領(lǐng)域?yàn)榻r?qū)動(dòng)力:在建模過(guò)程中,針對(duì)領(lǐng)域知識(shí)提煉抽象的領(lǐng)域模型,并不斷針對(duì)領(lǐng)域模型進(jìn)行深化與突破,直到最終以代碼來(lái)表達(dá)領(lǐng)域模型。

  • 排除技術(shù)因素的干擾:領(lǐng)域建模與技術(shù)實(shí)現(xiàn)的關(guān)注點(diǎn)分離有助于保證領(lǐng)域模型的純粹性,也能避免混淆領(lǐng)域概念和其他只與技術(shù)相關(guān)的概念。

模型驅(qū)動(dòng)設(shè)計(jì)不能一蹴而就。畢竟,即使通過(guò)限界上下文降低了業(yè)務(wù)復(fù)雜度,對(duì)領(lǐng)域知識(shí)的理解是一個(gè)漸進(jìn)的過(guò)程。在這個(gè)過(guò)程中,開發(fā)團(tuán)隊(duì)需要和領(lǐng)域?qū)<揖o密協(xié)作,共同研究領(lǐng)域知識(shí)。在獲得領(lǐng)域模型之后,也要及時(shí)驗(yàn)證,確認(rèn)領(lǐng)域模型有沒(méi)有真實(shí)表達(dá)領(lǐng)域知識(shí)。一旦發(fā)現(xiàn)遺漏或失真的現(xiàn)象,就需要重構(gòu)領(lǐng)域模型。首先建立領(lǐng)域模型,然后重構(gòu)領(lǐng)域模型,進(jìn)而精煉領(lǐng)域模型,保證領(lǐng)域概念被直觀而真實(shí)地表達(dá)為簡(jiǎn)單清晰的領(lǐng)域模型。顯然,在戰(zhàn)術(shù)設(shè)計(jì)階段,模型驅(qū)動(dòng)設(shè)計(jì)也應(yīng)該是一個(gè)演進(jìn)的不斷完善的螺旋上升的循環(huán)過(guò)程。

本文摘錄于張逸老師新書《解構(gòu)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》。

引用:https://mp.weixin.qq.com/s?__biz=MzIxMzEzMjM5NQ==&mid=2651054016&idx=2&sn=b4abfe5bbb09b379b4c68fa6e63ef3f6&chksm=8c4c0ac4bb3b83d27ffcc581969c4ae0196f12891356349a9e941657fb2caaf35a5b0396f2e7&scene=178&cur_album_id=1694423786747428868#rd

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

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

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