? ? ? 邊界上下文是領(lǐng)域驅(qū)動設(shè)計的一個重要模式。它是領(lǐng)域驅(qū)動設(shè)計中策略設(shè)計部分的關(guān)注點-這部分是關(guān)于處理大型模型和團隊的洲胖。領(lǐng)域驅(qū)動設(shè)計通過把大型模型分割成不同的上下文并且明確定義它們之間的關(guān)系來處理大型模型渴庆。
? ? ? 領(lǐng)域驅(qū)動設(shè)計是基于背后領(lǐng)域的模型來設(shè)計軟件。一個模型作為一種統(tǒng)一語言幫助軟件開發(fā)人員和領(lǐng)域?qū)<抑g交流。它也作為軟件自身設(shè)計的概念基礎(chǔ)—如何分解成對象或者方法炬藤。為了有效性额港,一個模型必須是統(tǒng)一的即它是內(nèi)部一致的已至于在內(nèi)部沒有相矛盾的點饺窿。
? ? ? 當你試圖對一個更大的領(lǐng)域建模,構(gòu)建統(tǒng)一的模型會越來越困難移斩。在一個大型組織的不同部門肚医,不同小組的人可能使用略微不同的詞匯。模型的精確性很快會遇到這種問題向瓷,常常導(dǎo)致很多疑惑肠套。這種疑惑往往是因為關(guān)注于領(lǐng)域的中心概念。在我職位生涯的早期我做過一些與電力相關(guān)的工作—在這里”米”在公司的不同部門代表不同的東西:它是輸電網(wǎng)與地區(qū)之間猖任,輸電網(wǎng)與用戶之間的連接你稚,它是物理上米的意思。這些微妙的多義詞可能在溝通中比較緩和朱躺,但是對于計算機的精確性并不能這樣刁赖。我一次又一次的發(fā)現(xiàn)這個問題發(fā)生在一些多義詞上,比如“用戶”和“產(chǎn)品”长搀。
? ? ? 在那段年輕歲月宇弛,我們被建議在整個業(yè)務(wù)中構(gòu)建一個統(tǒng)一的模型,但是DDD認為我們所學習的”對一個大型系統(tǒng)盈滴,領(lǐng)域模型的完全統(tǒng)一將是不可行的或者不劃算的“涯肩。所以取而代之,DDD把大型系統(tǒng)分割成邊界上下文巢钓,每一個都有一個統(tǒng)一模型—本質(zhì)上是構(gòu)建多個重要模型(MultiCanonicalModels)的方法病苗。
? ? ? 邊界上下文即包含不相關(guān)的概念(例如一個售后票據(jù)僅僅存在于用戶售后上下文中)同時也共享一些概念(例如產(chǎn)品和用戶)。在集成的時候不同的上下文可能有一些相同的概念在不同的機制下有完全不同的模型映射到這些多義詞上症汹。很多DDD模式探索了上下文之間關(guān)系的可替換方式硫朦。
? ? ? 多種因素影響上下文之間的邊界劃定。比較常用的重要方法是人類文化背镇,因為模型作為一種統(tǒng)一語言咬展,在語言改變的時候你需要一個不同的模型。你也可以在相同的領(lǐng)域上下文中找到多個上下文瞒斩,例如一個應(yīng)用中內(nèi)存和關(guān)系數(shù)據(jù)庫模型的分離破婆。通過不同的方式描述模型,邊界就被設(shè)置胸囱。
? ? ? DDD的策略設(shè)計部分描述了多種方法祷舀,你可以使用它處理上下文之間的管理。使用一個上下文地圖來描述這些關(guān)系是非常值得的。
進一步閱讀
DDD的權(quán)威來源是Eric Evans的書裳扯。對于軟件著作來說它不是最容易讀的抛丽,但是它包含了大量實質(zhì)性的研究。上下文邊界在第4部分饰豺。
Vaughn Vernon的《Implementing Domain-Driven Desgin》書關(guān)注于策略設(shè)計亿鲜。第2章詳細介紹了一個領(lǐng)域怎樣被分成邊界上下文,第3章是繪制上下文地圖的最好資源冤吨。
我喜歡一些老但是仍然有用的軟件書籍蒿柳。我最喜歡的書之一是William Kent的《Data and Reality》。我仍然記的他對油井的多異性的簡短描述漩蟆。
Eric Evans描述了一個邊界上下文的明確使用如何允許團隊使用冒泡上下文把一個新功能移植到一個遺留系統(tǒng)中其馏。例子描述了相關(guān)的邊界上下文如何有相同的和不同的模型以及如何在它們之間做對應(yīng)。
作者:Martin Fowler