1. 引言
限界上下文可以拆分為兩個(gè)詞,限界和上下文。
限界:是指一個(gè)界限,具體的某一個(gè)范圍。
上下文:個(gè)人理解就是語(yǔ)境。
比如我們常說(shuō)的段子:
“我想靜靜。”
這個(gè)句子一般是想表達(dá)“我想靜一靜”的意思。但是我們卻把它玩笑成“靜靜是誰(shuí)?”。
可見(jiàn)上下文語(yǔ)境很重要。
這個(gè)例子只是個(gè)開(kāi)胃菜,我們接著往下看。
2. 案例分析
整個(gè)應(yīng)用程序之內(nèi)的一個(gè)概念性邊界。
邊界之內(nèi)的每種領(lǐng)域術(shù)語(yǔ)、詞組或句子--也即通用語(yǔ)言,都有確定的上下文含義。
邊界之外,這些術(shù)語(yǔ)可能表示不同的意思。
每次看到這種解釋就頭大。我們還是結(jié)合我們的案例來(lái)聊一聊吧。
根據(jù)上一節(jié)對(duì)領(lǐng)域的剖析,我們把案例主要拆分成幾個(gè)子域,其中銷售子域是核心域,商品子域和物流子域?yàn)橹巫佑颉T谶@三個(gè)子域中,都要和商品打交道。如果把商品抽象為Product對(duì)象的話,按我們一般的常規(guī)思路(拋開(kāi)子域的劃分)來(lái)說(shuō),不管是商品銷售還是發(fā)貨,我們都可以共用同一個(gè)Product對(duì)象。
但在DDD中,在商品子域和銷售子域中,可以共享這個(gè)Product對(duì)象,但在物流子域,就有點(diǎn)大材小用。為什么呢?因?yàn)楫吘刮锪髯佑蜿P(guān)注的是商品的發(fā)貨處理和物流跟蹤。針對(duì)發(fā)貨流程而言,我只關(guān)心商品的數(shù)量、大小、重量等規(guī)格,而不必了解商品的價(jià)格等其他信息。所以說(shuō)物流子域應(yīng)該關(guān)注的是貨物的發(fā)貨處理而不是商品。
那為什么我們之前的開(kāi)發(fā)思路會(huì)共用同一個(gè)Product對(duì)象呢?
答案很簡(jiǎn)單,沒(méi)有進(jìn)行領(lǐng)域的劃分。把整個(gè)項(xiàng)目一概而論,統(tǒng)一建模導(dǎo)致的結(jié)果。
在DDD的思想下,當(dāng)劃分子域之后,每個(gè)子域都對(duì)應(yīng)有各自的上下文。在銷售子域和商品子域所在的上下文語(yǔ)境中,商品就是商品,無(wú)二義性。在物流子域的上下文語(yǔ)境中,我們也可以說(shuō)商品的發(fā)貨處理,但這時(shí)的商品就特指貨物了。確定了真實(shí)面目之后,我想我們也會(huì)不由自主的抽象一個(gè)新的Cargo對(duì)象來(lái)處理物流相關(guān)的業(yè)務(wù)。這也是DDD帶來(lái)的好處,讓我們更清晰的建模。
3. 限界上下文的命名
限界上下文只是一個(gè)統(tǒng)一的命名,在我們劃分子域后,每個(gè)子域一般對(duì)應(yīng)一個(gè)上下文,也可以對(duì)應(yīng)多個(gè)上下文。但如果子域?qū)?yīng)多個(gè)上下文的時(shí)候,就要考慮一下是不是子域能否繼續(xù)劃分。
命名方式很簡(jiǎn)單,領(lǐng)域名+上下文。
比如我們的銷售子域?qū)?yīng)銷售上下文,物流子域?qū)?yīng)物流上下文。
4. 總結(jié)
通過(guò)我們上面的舉例分析,限界上下文也并不是一個(gè)高深的概念。
用官話來(lái)說(shuō)限界上下文主要用來(lái)封裝通用語(yǔ)言和領(lǐng)域?qū)ο蟆?br>
按我個(gè)人的理解它就是用來(lái)為領(lǐng)域提供上下文語(yǔ)境,保證在領(lǐng)域之內(nèi)的一些術(shù)語(yǔ)、業(yè)務(wù)相關(guān)對(duì)象等(通用語(yǔ)言)有一個(gè)確切的含義,沒(méi)有二義性。
參考資料
What are Bounded Contexts and Context Maps in Domain Driven Design?
2018.1.27 更新
觀察角度的不同,限界上下文劃定的邊界也有所不同。大體可以分為如下三個(gè)方面:
領(lǐng)域邏輯層面:限界上下文確定了領(lǐng)域模型的業(yè)務(wù)邊界,維護(hù)了模型的完整性與一致性,從而降低系統(tǒng)的業(yè)務(wù)復(fù)雜度。
團(tuán)隊(duì)合作層面:限界上下文確定了開(kāi)發(fā)團(tuán)隊(duì)的工作邊界,建立了團(tuán)隊(duì)之間的合作模式,避免團(tuán)隊(duì)之間的溝通變得混亂,從而降低系統(tǒng)的管理復(fù)雜度。
技術(shù)實(shí)現(xiàn)層面:限界上下文確定了系統(tǒng)架構(gòu)的應(yīng)用邊界,保證了系統(tǒng)層和上下文領(lǐng)域?qū)痈髯缘闹滦裕⒘松舷挛闹g的集成方式,從而降低系統(tǒng)的技術(shù)復(fù)雜度。
這三種邊界體現(xiàn)了限界上下文對(duì)不同邊界的控制力,業(yè)務(wù)邊界是對(duì)領(lǐng)域模型的控制,工作邊界是對(duì)開(kāi)發(fā)協(xié)作的控制,應(yīng)用邊界是對(duì)技術(shù)風(fēng)險(xiǎn)的控制。引入限界上下文的目的:其實(shí)不在于如何劃分邊界,而在于如何控制邊界。
--引用自?張逸:領(lǐng)域驅(qū)動(dòng)戰(zhàn)略實(shí)踐?
怎么理解呢,就是說(shuō)對(duì)限界上下文的劃分可以從三個(gè)角度去看。
- 從領(lǐng)域邏輯的角度,即根據(jù)業(yè)務(wù)知識(shí)進(jìn)行劃分,比如將電商項(xiàng)目劃分為訂單、商品、促銷、物流、售后等限界上下文。
- 從技術(shù)實(shí)現(xiàn)角度,比如為了解決系統(tǒng)的高并發(fā),決定引入緩存,那就可以考慮將緩存服務(wù)抽離為一個(gè)獨(dú)立的限界上下文作為支撐。
- 從團(tuán)隊(duì)合作的角度,即回到了以人為本的思想。比如根據(jù)領(lǐng)域業(yè)務(wù)劃分的限界上下文組建領(lǐng)域特性團(tuán)隊(duì)進(jìn)行職責(zé)劃分以確定團(tuán)隊(duì)協(xié)作邊界。明確的團(tuán)隊(duì)邊界有利于團(tuán)隊(duì)的溝通和協(xié)作。