初窥Bounded Context

Bounded Context(限界上下文)是DDD中最难解释的原则,但或许也是最重要的原则。可以说,没有Bounded Context,就不能做DDD。

Bounded Context是领域驱动设计中战略设计的重要组成部分,一定程度上决定了系统的逻辑架构以及集成方式。基于康威定律,Bounded Context的划分也可能会影响项目的组织结构。DDD社区将Bounded Context定义为:

应该显式地定义某个模型所应用的上下文。还应该在团队组织、应用中特定部分的使用以及像代码库和数据库模式等物理表现等方面显式地设定边界。要保持边界中模型的严格一致,而不要受外界问题的影响与干扰。

这段话表达了一个关键概念是“边界”,这与软件设计中“分而治之”的思想有关。通过为领域模型划定合理的边界,就可以降低设计与开发的复杂度。此外,边界还能够划分知识的层次,例如对外而言,可以只保障暴露在边界外接口的一致性,以及关注它们之间的集成方式。边界之内则自成一体,可以独立演化,甚至可以包容一到多个遗留模块。

正是因为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的理解:

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之间的关系:

Bounded Context的一个显著特点在于它与Domain匹配。因此,它体现的是高层的抽象机制。Bounded Context并非编程语言或框架的产出工件,而是体现了人们对领域思考的本质。

结合这些知识,我们可以这样描述Bounded Context的特征:

  • BC是模型概念,与实现无关,是高层的抽象机制
  • 具有自己独立的边界,是自治的,遵循高内聚、松耦合
  • BC之间的关系决定它们之间的协作与通信方式
  • 它与Domain应为一一对应关系
  • 一个上下文意味着一个专有的职责

要驱动出Bounded Context,毫无疑问需要与领域专家交流,通过提炼统一语言,来创建BC。然而,统一语言的建立固然有助于进一步深化和细化领域模型,但并不能直接帮助我们创建BC。从Bounded Context到Context Map的设计过程并非单向的,而是一个螺旋演进的过程。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2015-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

前端新人之“不知所措”

前几天发了“前端工程师都能做什么”这篇文章, 此文的末尾有这样一句话:“...毕竟,无限可能嘛...” 有同学留言给我, “可是新手往往望着无限可能而不知所措...

1769
来自专栏华仔的技术笔记

iOS应用架构谈 view层的组织和调用方案 pragma mark - life cyclepragma mark - life cyclepragma mark - getters and set

3348
来自专栏数据小魔方

一点儿建议、一枚彩蛋~~~

这段时间写了太多的教程,感觉自己都写烦了,不知道大家看的烦不烦,今天没有教程,写一点儿心得总结下这段时间以来的经验和体会,顺便介绍一款图表插件,也将是小魔方下一...

3375
来自专栏CDA数据分析师

如何让Hadoop结合R语言做统计和大数据分析?

R是GNU的一个开源工具,具有S语言血统,擅长统计计算和统计制图。由Revolution Analytics发起的一个开源项目RHadoop将R语言与Hadoo...

1865
来自专栏人工智能头条

DMLC对于机器学习和系统开发者意味着什么?

1426
来自专栏北京马哥教育

R、Python、Scala 和 Java,到底该使用哪一种大数据编程语言?

当你找到大数据项目,你首先会怎么做?确定这个项目的问题领域,确定这个项目的基础设施,在往上,确定项目的框架,选择最适合用来处理当前数据的所有内容。这个时候唯一摆...

2905
来自专栏企鹅号快讯

网络编程零基础如何入门

网络编程零基础如何入门,这对很多想加入互联网行业的朋友来说是一个难题。因为网络编程门槛并不低,网络编程语言多、技术迭代更新快、技术要求比较高等原因让很多新手很迷...

1916
来自专栏Java架构师学习

一些最好用的数据可视化工具

摘要: 如今同质化的应用越来越多,应用开发者也开始在用户体验上下功夫,比如数据可视化,将一大堆密密麻麻的数字转成图表形式,可以更直观地向用户展示数据之间的联系和...

4295
来自专栏哲学驱动设计

学习过程反思

    本篇反思总结了一般的学习过程。掌握学习的方法,可以让你更高效地进行学习。这对于天天要学新技术的IT人员来说,是非常重要的。     本文反思了自己学习W...

17611
来自专栏程序员的SOD蜜

理论有何用?不问“何用”,先问“用否”!

    昨天准备写点东西,把原来同事的代码拿过来看看,这位同事有数年大型国企、数年知名外企工作经验,而且“案头”常放一部厚案头的“设计模式”方面的书,但我之前从...

2237

扫描关注云+社区