1 你需要知道的 - 战略设计
DDD是一种软件设计和构建方法,其重点在于独立于数据持久化等技术问题,准确表达业务规则。
不幸,DDD 对新手来说极具挑战性,部分原因是它有许多独特的概念需要学习。本文我简要介绍这些重要的思想,以便你能自信继续你的 DDD 旅程。
第一部分将侧重于与所有参与软件开发的人相关的概念,而不仅仅是开发人员。第二部分专门针对编码人员,但无论如何你都可以随意查看!
2 我只剩一分钟空闲!
如果你只能从这篇文章中记住两点,那么 DDD 的核心主张是:
2.1 模型驱动设计
在自包含的领域模型中建模业务流程和规则是重中之重。从数据库设计到架构的其他所有内容都是次要的考虑因素。
2.2 通用语言
开发生命周期中的每个人都应该在特定上下文中使用领域/业务语言进行沟通。理想情况下,会维护一些轻量且易于访问的通用语言文档。
3 战略设计和战术设计
DDD 包含两个相关的学科:战略设计和战术设计。
战略设计
涉及大局观:理解业务需要解决的问题;业务如何获得竞争优势;团队之间的关系;并在考虑这些问题的情况下,决定要构建什么软件。
战术设计
涉及使构建有用领域模型更简单的模式、工具和实践。当我们需要建模复杂的业务逻辑或未来可能引入复杂性时,我们使用战术设计。
本质上:
- 战略设计是关于我们需要构建什么
- 战术设计是关于我们如何构建它
4 通用语言
无论是战略设计还是战术设计,其核心思想都是通用语言。这是一组明确且定义良好的术语,密切反映了业务环境中的语言。在对话、需求和代码中一致使用通用语言,可以消除从开发者术语到业务术语之间频繁转换所带来的负担和错误。
5 问题空间和解决方案空间
想象一下,一家公司提供外包的仓库运营服务(WOaaS)。它的“独门绝技”在于如何管理仓库库存,但它还需要进行销售、广告、跟踪工时等。
每个问题区域都可以被描述为一个子域。对于这家 WOaaS 公司,一个简化的问题空间地图可能如下:
图1: 一个分为四个部分的子域/问题空间简化图,标签为交付/收集、库存、销售和财务
在一个领域中识别问题区域称为问题空间分析。这需要与领域专家,即最了解业务的人密切合作。
将问题空间映射到当前的企业架构上,就得到了解决方案空间。
图2: 一个分为四个部分的“现状”解决方案空间图。交付/收集部分有一个标记为第三方 SaaS 的紫色圆圈。另一个更大的紫色圆圈标记为遗留系统,覆盖了剩下的销售、库存和财务部分
接下来,我们想要确定一个更理想的解决方案空间。为此,反思通用语言的一个后果是很有帮助的。
6 有界上下文
在我们的例子中,一个遗留系统试图解决多个问题区域。尽管有才华的个人付出了最大的努力,它可能还是会因为一个简单的原因而面临高缺陷率和维护成本。
**在每个子域中,词语和短语都有特定的含义。**一个拥有冲突术语的代码库必然会迫使团队成员创建一种新的、即兴的语言,并且必须将其转换为业务语言。不可避免地,这会导致错误、误解、入职缓慢、部落知识等各种问题。
通过试图创建满足多个子域需求的软件,我们的模型变得臃肿、混乱且含糊不清,导致性能问题和复杂性升级。
战略设计建议每个子域单独使用一个系统。我们可以将这些系统描述为有界上下文,在每个上下文内都有明确的通用语言。
现在,回到 WOaaS 公司。我们如何确定一个更理想的“未来”企业架构?我们应该构建什么才能实现最佳的业务结果?
7 核心领域
应该在业务创造竞争优势的子域中投入最多的资源,这些子域就是核心领域。在我们的例子中,这是库存子域。
应该为库存子域创建一个有界上下文,并组建最好的团队来开发它。
图3: 一个分为四个部分的“未来”解决方案空间简化图。交付/收集部分有一个标记为第三方 SaaS 的紫色圆圈。在库存部分有一个更大的紫色圆圈,标记为首要任务:库存有界上下文。另一个较小的紫色便签标记为遗留系统,覆盖了销售和财务部分
其他子域被称为通用子域或支持子域。尽管它们很重要,但无论发票系统多么“美观”,它都不会使企业在竞争中脱颖而出。覆盖这些子域的系统可能是商业现成产品或外包开发的候选者。
核心领域值得最大的投资和 DDD 的战术设计的全力支持……你可以在本系列的第二部分阅读更多内容。
领域模型:仅描述业务环境中相关事物的行为、属性和交互的代码。它完全不涉及运行时环境、持久化、托管环境等问题。
关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。
各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。
负责:
- 中央/分销预订系统性能优化
- 活动&券等营销中台建设
- 交易平台及数据中台等架构和开发设计
- 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
- LLM Agent应用开发
- 区块链应用开发
- 大数据开发挖掘经验
- 推荐系统项目
目前主攻市级软件项目设计、构建服务全社会的应用系统。
本文由博客一文多发平台 OpenWrite 发布!