天天看點

初窺Bounded Context

<b>序言: </b> 張逸者,70年代生人。軟體開發生涯經曆了從程式員、項目經理、測試經理、開發部長、技術總監到架構師的一個循環,而後程式員,現在是創業公司cto。三大愛好是開發、寫作與閱讀。著譯作包括《軟體設計精要與模式》、《wcf服務程式設計》、《java設計模式》與《恰如其分的軟體架構》。張逸現居于錦官城,與中生代諸君多有往來。張君于設計模式、軟體架構、ddd以及clean code等方面研究尤深。開公衆号而不刷粉,則多數文字并不顯于街市,中生代編輯之以飨讀者,使佳作流傳,善莫大焉!

<b>bounded context(限界上下文)是ddd中最難解釋的原則,但或許也是最重要的原則。可以說,沒有bounded context,就不能做ddd。</b>

bounded context是領域驅動設計中戰略設計的重要組成部分,一定程度上決定了系統的邏輯架構以及內建方式。基于康威定律,bounded context的劃分也可能會影響項目的組織結構。ddd社群将bounded context定義為:

<b>應該顯式地定義某個模型所應用的上下文。還應該在團隊組織、應用中特定部分的使用以及像代碼庫和資料庫模式等實體表現等方面顯式地設定邊界。要保持邊界中模型的嚴格一緻,而不要受外界問題的影響與幹擾。</b>

這段話表達了一個關鍵概念是“邊界”,這與軟體設計中“分而治之”的思想有關。通過為領域模型劃定合理的邊界,就可以降低設計與開發的複雜度。此外,邊界還能夠劃分知識的層次,例如對外而言,可以隻保障暴露在邊界外接口的一緻性,以及關注它們之間的內建方式。邊界之内則自成一體,可以獨立演化,甚至可以包容一到多個遺留子產品。

正是因為bounded context帶來的隔離性,juelin lerman才認為:“把一個将大量的類放在一個上下文中的獨立模型分解為多個較小的模型是有好處的。bounded context建立的模型較小,而且内聚性更高,同時維持了模型之間的邊界。”

于是,bounded context在ddd中的重要性也就凸顯,ddd社群逐漸認識到了這一點。mike在文章《ddd: the bounded context explained》中認為:bounded context是ddd中最難解釋的原則,但或許也是最重要的原則。可以說,沒有bc,就不能做ddd。在了解aggregate root、aggregate、entity等概念之前,需要先了解bc。

重要性凸顯了,然而問題也随之而來。幾個問題如烏雲一般盤旋在我的頭頂,驅使我思考bounded context的本質。問題如下:

如何确定或劃分bounded context?

bounded context是否具有層次?

bounded context劃分的邊界是邏輯的,還是實體的?

bounded context之間的通信方式?

為了解決如上問題,我查閱了許多書籍與資料,也從項目實踐中去探索。在回答這些問題之前,我先抛出一些概念知識。

vaughn vernon的大作implementing domain-driven design解釋了他對bounded context的了解:

<b>bounded context是一個顯式的邊界,領域模型便存在于這個邊界之内。領域模型把通用語言表達成軟體模型。建立邊界的原因在于,每一個模型概念,包括它的屬性和操作,在邊界之内都具有特殊的含義。</b>

初窺Bounded Context

                                                                     ▲ vaughn vernon | 實作領域驅動設計

mike同樣認為一個上下文意味着一個專有的職責,而且bc之間應該是解耦的,彼此并不知道。一個bc并不知道另一個bc的内部,但這兩個bc都可以使用common objects(dtos)來完成彼此之間的通信;或者使用專用的adapter。

這裡事實上談到的是bc的設計原則,它與oo設計原則一脈相承。在文章《bounded contexts as a strategic pattern beyond ddd》中,作者提到了開發者可以應用grasp原則來設計bounded context,尤其是低耦合、高内聚與資訊專家模式。

就在這篇文章中,作者還提到了bc與domain之間的關系:

<b>bounded context的一個顯著特點在于它與domain比對。是以,它展現的是高層的抽象機制。bounded context并非程式設計語言或架構的産出工件,而是展現了人們對領域思考的本質。</b>

結合這些知識,我們可以這樣描述bounded context的特征:

bc是模型概念,與實作無關,是高層的抽象機制

具有自己獨立的邊界,是自治的,遵循高内聚、松耦合

bc之間的關系決定它們之間的協作與通信方式

它與domain應為一一對應關系

一個上下文意味着一個專有的職責

要驅動出bounded context,毫無疑問需要與領域專家交流,通過提煉統一語言,來建立bc。然而,統一語言的建立固然有助于進一步深化和細化領域模型,但并不能直接幫助我們建立bc。從bounded context到context map的設計過程并非單向的,而是一個螺旋演進的過程。

本文作者 <b>張逸</b>