引言

限界上下文可以拆分為兩個(gè)詞,限界和上下文。
限界:是指一個(gè)界限,具體的某一個(gè)范圍。
上下文:個(gè)人理解就是語境。

比如我們常說的段子:

“我想靜靜。”
這個(gè)句子一般是想表達(dá)“我想靜一靜”的意思。但是我們卻把它玩笑成“靜靜是誰?”。
可見上下文語境很重要。

這個(gè)例子只是個(gè)開胃菜,我們接著往下看。

2. 案例分析

整個(gè)應(yīng)用程序之內(nèi)的一個(gè)概念性邊界。
邊界之內(nèi)的每種領(lǐng)域術(shù)語、詞組或句子--也即通用語言,都有確定的上下文含義。
邊界之外,這些術(shù)語可能表示不同的意思。

每次看到這種解釋就頭大。我們還是結(jié)合我們的案例來聊一聊吧。

根據(jù)上一節(jié)對領(lǐng)域的剖析,我們把案例主要拆分成幾個(gè)子域,其中銷售子域是核心域,商品子域和物流子域?yàn)橹巫佑?。在這三個(gè)子域中,都要和商品打交道。如果把商品抽象為Product對象的話,按我們一般的常規(guī)思路(拋開子域的劃分)來說,不管是商品銷售還是發(fā)貨,我們都可以共用同一個(gè)Product對象。
但在DDD中,在商品子域和銷售子域中,可以共享這個(gè)Product對象,但在物流子域,就有點(diǎn)大材小用。為什么呢?因?yàn)楫吘刮锪髯佑蜿P(guān)注的是商品的發(fā)貨處理和物流跟蹤。針對發(fā)貨流程而言,我只關(guān)心商品的數(shù)量、大小、重量等規(guī)格,而不必了解商品的價(jià)格等其他信息。所以說物流子域應(yīng)該關(guān)注的是貨物的發(fā)貨處理而不是商品。
那為什么我們之前的開發(fā)思路會共用同一個(gè)Product對象呢?
答案很簡單,沒有進(jìn)行領(lǐng)域的劃分。把整個(gè)項(xiàng)目一概而論,統(tǒng)一建模導(dǎo)致的結(jié)果。
在DDD的思想下,當(dāng)劃分子域之后,每個(gè)子域都對應(yīng)有各自的上下文。在銷售子域和商品子域所在的上下文語境中,商品就是商品,無二義性。在物流子域的上下文語境中,我們也可以說商品的發(fā)貨處理,但這時(shí)的商品就特指貨物了。確定了真實(shí)面目之后,我想我們也會不由自主的抽象一個(gè)新的Cargo對象來處理物流相關(guān)的業(yè)務(wù)。這也是DDD帶來的好處,讓我們更清晰的建模。

3. 限界上下文的命名

限界上下文只是一個(gè)統(tǒng)一的命名,在我們劃分子域后,每個(gè)子域一般對應(yīng)一個(gè)上下文,也可以對應(yīng)多個(gè)上下文。但如果子域?qū)?yīng)多個(gè)上下文的時(shí)候,就要考慮一下是不是子域能否繼續(xù)劃分。
命名方式很簡單,領(lǐng)域名+上下文。
比如我們的銷售子域?qū)?yīng)

網(wǎng)友評論