界定上下文

2014 年 1 月 15 日

界定上下文是領域驅動設計中的核心模式。它是 DDD 策略設計區段的重點,而該區段完全在處理大型模型和團隊。DDD 透過將大型模型分割成不同的界定上下文,並明確說明它們的相互關係,來處理大型模型。

DDD 關於根據底層領域的模型來設計軟體。模型充當 通用語言,以協助軟體開發人員和領域專家之間的溝通。它也充當軟體本身設計的概念基礎,也就是它如何分解成物件或函數。要有效,模型需要統一,也就是在內部一致,這樣才不會有矛盾。

當你嘗試對較大的領域建模時,建立單一統一模型會越來越困難。在大型組織的不同部分,不同群組的人會使用微妙不同的詞彙。建模的精確度會快速遇到這個問題,通常會導致許多混淆。通常這種混淆會集中在領域的核心概念上。在我職業生涯的早期,我曾與一家電力公司合作,在這裡,「電表」這個詞對組織的不同部分來說,意思微妙不同:它是電網和地點之間的連接、電網和客戶之間的連接、實體電表本身(如果故障可以更換)。這些微妙的 多義詞 在對話中可以被淡化,但在精確的電腦世界中卻不行。我一次又一次地看到這種混淆會在「客戶」和「產品」等多義詞中重現。

在那些較早的年代,我們被建議建立整個業務的統一模型,但 DDD 承認我們已經了解到「大型系統的領域模型完全統一並不可行或不具成本效益」[1]。因此,DDD 會將大型系統分割成界定上下文,每個上下文都可以有統一的模型,基本上是建構 多個正規模型 的方法。

受限上下文既有互不相關的概念(例如,僅存在於客戶支援上下文的支援票證),也共享概念(例如,產品和客戶)。不同的上下文可能對常見概念有完全不同的模型,並具備機制在這些多義性概念之間進行對應以利整合。多種 DDD 模式探索上下文之間的替代關係。

各種因素在上下文之間劃定界線。通常,主導因素是人類文化,由於模型充當普遍語言,因此當語言改變時,您需要不同的模型。您還可以在同一個網域上下文中找到多個上下文,例如單一應用程式中內存和關聯式資料庫模型之間的分離。此界線由我們表示模型的不同方式設定。

DDD 的策略設計進一步說明受限上下文之間建立關係的各種方式。通常值得使用上下文地圖描繪這些關係。

進一步閱讀

DDD 的標準來源是 Eric Evans 的著作。這不是軟體文獻中最容易閱讀的,但它是那些值得大量投資的書籍之一。受限上下文開啟第四部分(策略設計)。

Vaughn Vernon 的 實作領域驅動設計 從一開始就專注於策略設計。第 2 章詳細說明網域如何劃分為受限上下文,而第 3 章是繪製上下文地圖的最佳來源。

Verraes 和 Wirfs-Brock 探討了描繪受限上下文的某些細微差別,特別是在上下文可能需要基於歷史和人際關係(與網域概念一樣)而分割的情況。

我喜歡既古老又仍然相關的軟體書籍。我最喜歡的其中一本書是 William Kent 的 資料與現實。我仍然記得他對石油井的多義性所做的簡短描述。

Eric Evans 說明如何明確使用受限上下文,讓團隊能夠使用 氣泡上下文 在舊有系統中移植新功能。此範例說明了相關受限上下文如何擁有類似但不同的模型,以及您如何在它們之間進行對應。

備註

1: Eric Evans 在 領域驅動設計