DDD精粹:运用子域进行战略设计

本文作者 VaughnVernon

一位经验丰富的软件工匠,也是追求简化软件设计和实现的思想领袖。他是畅销书《实现领域驱动设计》和《响应式架构:消息模式Actor实现与Scala,Akka应用集成》的作者。他在全球面向数百位开发者教授过IDDD课程,并经常在行业会议上发表演讲。他对分布式计算、消息机制、特别是Actor模型非常有兴趣。Vaughn擅长领域驱动设计和使用Scala、Akka实现DDD方面的咨询。

敏捷项目管理核心域

DDD项目中总会碰到很多限界上下文(Bounded Contexts)。这些上下文中一定有一个即将成为核心域(CoreDomain),而其他的限界上下文之中也会存在着许多不同的子域(Sub Domain)。图1中有六个限界上下文与六个子域。正是因为采用了DDD的战略设计,团队方能实现最佳的建模成果:限界上下文与子域之间一一对应。换句话说,敏捷项目管理核心即是一个清晰的限界上下文,也是一个清晰的子域。在某些情况下,一个限界上下文中有可能存在多个子域,但这并非是最理想的建模结果。

  • 什么是子域?

简单地说,子域是整个业务领域的一部分。你可以认为子域代表的是一个单一的、有逻辑的领域模型。通常,大多数的业务领域都过于庞大和复杂,难以作为整体来分析,因此我们一般只关心那些必须在单个项目中涉及的子域。子域可以用来逻辑地拆分整个业务领域,这样你才能理解存在于大型复杂项目中的问题空间。

你也可以认为子域是一个明确的专业领域,假设它负责为核心业务提供解决方案。这意味着特定的子域将会有一位或多位领域专家领衔,他们非常了解由这些特定子域促成的业务的方方面面。对你的业务而言,子域也有或多或少的战略意义。

如果通过DDD来创建子域,它将会被实现成一个清晰的限界上下文。特定业务的领域专家将会成为共建限界上下文的团队中的一员。虽然使用DDD来建立一个清晰的限界上下文是最佳选择,但有时这只是我们一厢情愿的想法。

  • 子域类型

项目中有三种主要的子域类型:

  1. 核心域(Sub Domain):它是一个唯一的、定义明确的领域模型,你要在这里进行战略投资,并在一个明确的限界上下文中投入大量资源去精心打磨通用语言。它是组织中最重要的项目,因为这将是你与其他竞争者的区别所在。正是因为你的组织无法在所有领域都出类拔萃,所以你必须把核心域打造成组织的核心竞争力。做出这样的决定需要对核心域进行深入地学习与理解,而这需要承诺、协作与试验。这是组织最需要在软件中倾斜其投资的方向。
  2. 支撑子域(Supporting Subdomain):这类建模方式提倡的是“定制开发”,因为找不到现成的解决方案。你对它的投入无论如何也达不到与核心域相同的程度。你也许会考虑使用外包的方式实现此类限界上下文,以避免因错误的认为其具有战略意义而进行巨额的投资。这类软件模型仍旧非常重要,核心域的成功离不开它。
  3. 通用子域(Generic Subdomain):通用子域的解决方案可以采购现成的,也可以采用外包的方式,亦或是由内部团队实现,但我们不用为其分配与核心域同样优质的研发资源,甚至都不如支撑子域。请注意不要把通用子域误认为是核心域。你并不希望对其投资过甚。当讨论一个正在实施DDD的项目时,我们最有可能讨论的是核心域。
  • 应对复杂性

业务领域中的某些系统边界将非常可能是遗留系统,它们也许是由你的组织构建的,也许是通过购买软件许可的方式获得的。此时,你可能无法对这些遗留系统进行任何改造,但当它们对核心域产生影响时,仍旧需要我们认真对待。为此,子域可以作为讨论问题空间的工具。

不幸的是,事与愿违,有些遗留系统与强调限界上下文的DDD设计方式大相径庭,甚至可以称之为无边界遗留系统。这样的遗留系统就像是一个“大泥球”。事实上,“大泥球”内充满了多个错综复杂的模型,这些模型本应该被分别设计并实现,但当它们纠缠在一起时,整个系统会乱成一团。

换言之,当我们在讨论某个遗留系统时,其中可能会包含一些,甚至许多逻辑领域模型,我们要将每个逻辑域模型当作一个子域对待。图2中,无边界遗留单体大泥球中,每个逻辑子域都已经被虚线框标识出来。共有五个逻辑模型或子域。这样处理逻辑子域的方式有助于我们应对大型系统的复杂性。这很有意义,因为我们可以像使用DDD和多个限界上下文应对问题空间一样,为其提供解决方案。

如果使用独立的通用语言思考,可能遗留系统就不会成为单体大泥球,这至少也可以帮助我们理解如何与它进行集成。使用子域来思考和讨论此类遗留系统有助于我们应对大型错综复杂模型的残酷现实。当使用这类工具时,我们可以明确那些对业务更有价值、对项目更重要的子域,而其他子域可以降低到次要位置。

考虑到这一点,你甚至可以通过同样的简单图表展示团队正在或正准备构建的核心域。这将帮助你了解子域间的关联与依赖。

当使用DDD时,限界上下文应该与子域一一对应(1:1)。也就是说,如果存在一个限界上下文,那么它的目标就应该是对应且只对应一个子域模型。想要始终做到这一点很难,但在可能的前提下,尽量以这种方式去建模很重要。这样可以使限界上下文清晰并且始终专注于核心战略举措。

如果必须在同一个限界上下文(你的核心域之中)中创建第二个模型,应该使用一个完全独立的模块将该模型从核心域中分离出来。(DDD的模块基本上等同于Scala和Java中的包,或者是F#和C#的命名空间)。DDD通过清晰的语言声明了一个模型是核心,而另一个只是它的支撑。你可以在解决方案空间中使用分离子域这种特殊方法。

————

本文节选自《领域驱动精粹》(Domain-Driven DesignDistilled)一书,本书预计将于年中面世。本书适用于对快速学习 DDD 核心概念和主要工具感兴趣的人。最主要的读者是软件架构师和开发者,他们将在项目中实践 DDD。通常,软件开发者会很快发现 DDD 的美妙之处,并被其强大的工具深深地吸引。尽管如此,本书也可以帮助高管、领域专家、经理人、业务分析师、信息架构师和测试人员理解这一主题。阅读原文将带你领略DDD大师Vernon的成名作,它是国内众多DDD实践者的启蒙读物。

  • 内容简介:本书着重介绍DDD的战略设计、团队战略协作方式、软件集成方式、使用聚合进行战术建模等关键只是,并教授限界上下文、通用语言、子域(新应用建模时用来应对新应用与现有遗留系统集成的复杂性)、上下文映射、领域事件等DDD核心概念,更是涉及非常鲜见却无比重要的一些加速设计和管理项目的工具。

原文发布于微信公众号 - 前沿技墅(Edge-Book)

原文发表时间:2018-05-30

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

如何在三年内快速成长为一名技术专家

作者 | 清英 文章来源GitChat,CSDN独家合作发布,查看交流实录:http://gitbook.cn/books/59b69dc608f7233e6...

19360
来自专栏大数据文摘

聊聊身份欺诈和窃取那些事

13820
来自专栏JAVA高级架构

如何在三年内快速成长为一名技术专家

清英, 蚂蚁金服技术专家,支付宝架构师,《JAVA并发编程的艺术》作者,10年+软件开发和架构经验,并发编程网(http://ifeve.com/)创始人。

15230
来自专栏PPV课数据科学社区

大数据可视化、实时性分析的工具——Datawatch

编者注:互联网后时代,我们谈的最多的不是电脑,而是基于互联网产生的伟大的互联网公司,比如谷歌、微软、百度、阿里巴巴等;移动互联网后时代,我们谈的更多的不是手机,...

634100
来自专栏FreeBuf

聊聊身份欺诈和窃取那些事

很多人都认为“个人隐私”不过是一纸空谈而已,引用老炮儿中六爷的一句被删台词:“我活那么大,我TM都不知道自己还有隐私?” ? 目前社交媒体如此发达,而社交平台上...

21890
来自专栏EAWorld

Serverless架构:用服务代替服务器

还记得在十多年前,SaaS鼻祖SalesForce喊出的口号『No Software』吗?SalesForce在这个口号声中开创了SaaS行业,并成为当今市值5...

1.2K90
来自专栏程序你好

微服务实战: 从电子商务平台到微服务电子商务(Omni-Commerce)

对于企业来说,微服务比单体架构应用更灵活,尤其是零售和电子商务行业来说。了解这个解决方案面临的挑战和系统架构。

13530
来自专栏DevOps时代的专栏

中国银行 DevOps 历程、 效果及展望

? 讲师 | 张新 编辑 | 白凡 作者简介: ? 个人简介:张新,曾从事中国银行软件设计开发工作,熟悉银行业务系统和开发过程;现作为中国银行软件中心DevO...

48040
来自专栏Python自动化测试

漫谈接口测试

在前面的很多的文章对中接口测试有很多的介绍,包含了常用的接口测试工具postman,以及测试工具Jmeter(目前在持续介绍中)和使用Pytho...

20260
来自专栏敏捷开发&项目管理

章节 2.1 可靠的软件 – 灵活,可靠的软件 使用设计模式和敏捷开发

可靠性和测试 学习目标 学习使软件变得可靠,对于想成为具有竞争力和成功的开发人员是非常重要的。本书大部分将致力于使软件不会失败的开发习惯,技能和实践。本章节的目...

34980

扫码关注云+社区

领取腾讯云代金券