初窥Bounded Context

简介: Bounded Context(限界上下文)是DDD中最难解释的原则,但或许也是最重要的原则。可以说,没有Bounded Context,就不能做DDD。本文就带领大家初探Bounded Context。

序言:  张逸者,70年代生人。软件开发生涯经历了从程序员、项目经理、测试经理、开发部长、技术总监到架构师的一个循环,而后程序员,现在是创业公司CTO。三大爱好是开发、写作与阅读。著译作包括《软件设计精要与模式》、《WCF服务编程》、《Java设计模式》与《恰如其分的软件架构》。张逸现居于锦官城,与中生代诸君多有往来。张君于设计模式、软件架构、DDD以及clean code等方面研究尤深。开公众号而不刷粉,则多数文字并不显于街市,中生代编辑之以飨读者,使佳作流传,善莫大焉!


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是一个显式的边界,领域模型便存在于这个边界之内。领域模型把通用语言表达成软件模型。创建边界的原因在于,每一个模型概念,包括它的属性和操作,在边界之内都具有特殊的含义。
                                                       2b36a1e4adc853172c41df0fdf0e7d141a735763
                                                                     ▲ 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


目录
相关文章
|
数据采集 分布式计算 监控
DataX教程(03)- 源码解读(超详细版)
DataX教程(03)- 源码解读(超详细版)
4319 0
DataX教程(03)- 源码解读(超详细版)
|
11月前
|
缓存 安全 JavaScript
WordPress主题实用指南(最新完整版)
《WordPress主题实用指南(最新完整版)》全面解析了WordPress主题开发的核心技术与最佳实践。内容涵盖主题架构、模板开发、Hook系统应用、性能优化、安全防护、现代功能集成、调试维护及商业化开发规范八大章节。从标准模板层级结构到子主题开发,从条件标签到自定义文章类型,再到数据库查询优化与资源加载策略,本书深入浅出地讲解了WordPress主题开发的各个环节。同时,针对安全性与国际化需求,提供了输入验证、文件上传保护及多语言支持的实现方法。最后,通过自动化测试与更新系统的集成,帮助开发者打造高效、稳定且符合商业标准的主题产品。无论是初学者还是资深开发者,都能从中受益匪浅。
241 13
|
11月前
|
Go C++
Go语言方法与接收者 -《Go语言实战指南》
本文介绍了 Go 语言中方法的相关概念和用法。方法是绑定到特定类型上的函数,包含值接收者和指针接收者两种形式。值接收者不会改变原始数据,而指针接收者可修改原始数据,且在处理大型结构体时性能更优。文章详细对比了方法与普通函数的区别,并说明了选择指针接收者的原因,如修改原始值、提升性能及保持一致性。此外,Go 支持为任意自定义类型定义方法,不仅限于结构体。最后通过表格总结了方法的核心概念和使用场景。
293 34
|
存储 传感器 物联网
Golang 串口通信
Golang 串口通信
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
本文介绍了如何在Spring Boot项目中实现MVC分层架构,通过将代码划分为controller、service、dao和entity四个部分,实现高内聚低耦合的设计。示例项目包括用户增删查改功能,详细展示了各层的具体实现及运行测试。
375 11
|
算法 数据处理 数据库
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
生物学经典Blast序列比对算法原理,如何在R语言和Python中实现序列的比对分析?
|
存储 安全 程序员
|
网络协议 Java 程序员
如何发布自己的项目到Maven中央仓库?
如何发布自己的项目到Maven中央仓库?
2985 0
如何发布自己的项目到Maven中央仓库?
|
SQL 开发框架 .NET
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
4682 0