1. 引言
限界上下文可以拆分為兩個詞,限界和上下文。
限界:是指一個界限颤专,具體的某一個范圍。
上下文:個人理解就是語境钠乏。
比如我們常說的段子:
“我想靜靜栖秕。”
這個句子一般是想表達“我想靜一靜”的意思晓避。但是我們卻把它玩笑成“靜靜是誰簇捍?”。
可見上下文語境很重要俏拱。
這個例子只是個開胃菜暑塑,我們接著往下看。
2. 案例分析
整個應(yīng)用程序之內(nèi)的一個概念性邊界彰触。
邊界之內(nèi)的每種領(lǐng)域術(shù)語梯投、詞組或句子--也即通用語言,都有確定的上下文含義况毅。
邊界之外分蓖,這些術(shù)語可能表示不同的意思。
每次看到這種解釋就頭大尔许。我們還是結(jié)合我們的案例來聊一聊吧么鹤。
根據(jù)上一節(jié)對領(lǐng)域的剖析,我們把案例主要拆分成幾個子域味廊,其中銷售子域是核心域蒸甜,商品子域和物流子域為支撐子域棠耕。在這三個子域中,都要和商品打交道柠新。如果把商品抽象為Product對象的話窍荧,按我們一般的常規(guī)思路(拋開子域的劃分)來說,不管是商品銷售還是發(fā)貨恨憎,我們都可以共用同一個Product對象蕊退。
但在DDD中,在商品子域和銷售子域中憔恳,可以共享這個Product對象瓤荔,但在物流子域,就有點大材小用钥组。為什么呢输硝?因為畢竟物流子域關(guān)注的是商品的發(fā)貨處理和物流跟蹤。針對發(fā)貨流程而言程梦,我只關(guān)心商品的數(shù)量点把、大小、重量等規(guī)格屿附,而不必了解商品的價格等其他信息愉粤。所以說物流子域應(yīng)該關(guān)注的是貨物的發(fā)貨處理而不是商品。
那為什么我們之前的開發(fā)思路會共用同一個Product對象呢拿撩?
答案很簡單,沒有進行領(lǐng)域的劃分如蚜。把整個項目一概而論压恒,統(tǒng)一建模導(dǎo)致的結(jié)果。
在DDD的思想下错邦,當劃分子域之后探赫,每個子域都對應(yīng)有各自的上下文。在銷售子域和商品子域所在的上下文語境中撬呢,商品就是商品伦吠,無二義性。在物流子域的上下文語境中魂拦,我們也可以說商品的發(fā)貨處理毛仪,但這時的商品就特指貨物了。確定了真實面目之后芯勘,我想我們也會不由自主的抽象一個新的Cargo對象來處理物流相關(guān)的業(yè)務(wù)箱靴。這也是DDD帶來的好處,讓我們更清晰的建模荷愕。
3. 限界上下文的命名
限界上下文只是一個統(tǒng)一的命名衡怀,在我們劃分子域后棍矛,每個子域一般對應(yīng)一個上下文,也可以對應(yīng)多個上下文抛杨。但如果子域?qū)?yīng)多個上下文的時候够委,就要考慮一下是不是子域能否繼續(xù)劃分。
命名方式很簡單怖现,領(lǐng)域名+上下文茁帽。
比如我們的銷售子域?qū)?yīng)銷售上下文,物流子域?qū)?yīng)物流上下文真竖。
4. 總結(jié)
通過我們上面的舉例分析脐雪,限界上下文也并不是一個高深的概念。
用官話來說限界上下文主要用來封裝通用語言和領(lǐng)域?qū)ο蟆?br>
按我個人的理解它就是用來為領(lǐng)域提供上下文語境恢共,保證在領(lǐng)域之內(nèi)的一些術(shù)語战秋、業(yè)務(wù)相關(guān)對象等(通用語言)有一個確切的含義,沒有二義性讨韭。
參考資料
What are Bounded Contexts and Context Maps in Domain Driven Design?
2018.1.27 更新
觀察角度的不同,限界上下文劃定的邊界也有所不同脂信。大體可以分為如下三個方面:
領(lǐng)域邏輯層面:限界上下文確定了領(lǐng)域模型的業(yè)務(wù)邊界,維護了模型的完整性與一致性,從而降低系統(tǒng)的業(yè)務(wù)復(fù)雜度透硝。
團隊合作層面:限界上下文確定了開發(fā)團隊的工作邊界狰闪,建立了團隊之間的合作模式,避免團隊之間的溝通變得混亂,從而降低系統(tǒng)的管理復(fù)雜度濒生。
技術(shù)實現(xiàn)層面:限界上下文確定了系統(tǒng)架構(gòu)的應(yīng)用邊界埋泵,保證了系統(tǒng)層和上下文領(lǐng)域?qū)痈髯缘闹滦裕⒘松舷挛闹g的集成方式罪治,從而降低系統(tǒng)的技術(shù)復(fù)雜度丽声。
這三種邊界體現(xiàn)了限界上下文對不同邊界的控制力,業(yè)務(wù)邊界是對領(lǐng)域模型的控制,工作邊界是對開發(fā)協(xié)作的控制觉义,應(yīng)用邊界是對技術(shù)風(fēng)險的控制雁社。引入限界上下文的目的:其實不在于如何劃分邊界,而在于如何控制邊界晒骇。
--引用自?張逸:領(lǐng)域驅(qū)動戰(zhàn)略實踐?
怎么理解呢霉撵,就是說對限界上下文的劃分可以從三個角度去看。
- 從領(lǐng)域邏輯的角度洪囤,即根據(jù)業(yè)務(wù)知識進行劃分徒坡,比如將電商項目劃分為訂單、商品箍鼓、促銷崭参、物流、售后等限界上下文款咖。
- 從技術(shù)實現(xiàn)角度何暮,比如為了解決系統(tǒng)的高并發(fā)奄喂,決定引入緩存,那就可以考慮將緩存服務(wù)抽離為一個獨立的限界上下文作為支撐海洼。
- 從團隊合作的角度跨新,即回到了以人為本的思想。比如根據(jù)領(lǐng)域業(yè)務(wù)劃分的限界上下文組建領(lǐng)域特性團隊進行職責劃分以確定團隊協(xié)作邊界坏逢。明確的團隊邊界有利于團隊的溝通和協(xié)作域帐。