
DDD(领域驱动设计)中领域和子域这两个核心概念。
这是一个非常基础且关键的区别,理解它们对于掌握DDD至关重要。
概念: 领域指的是一个组织或业务系统所从事的整个业务范围以及其中所包含的所有知识、活动和规则。
你可以把它想象成公司运营的“整个世界”或“宇宙”。它包含了解决特定业务问题所需的一切。
•核心思想: 软件系统是为其领域服务的。因此,代码的结构、语言和模型都应该反映这个领域的现实情况。•例子:
•一个电子商务公司的领域就是 “在线零售”。这个领域包含了商品管理、库存、购物车、订单、支付、物流、客户服务等一系列事情。•一个银行的领域就是 “金融业务”,包括账户管理、存款、贷款、转账、风险控制等。•一个航空公司的领域就是 “航空运输”,包括航班调度、票务、登机、航线管理等。
简单来说,领域就是你的公司是做什么的,它涉及的所有事情的总和。
概念: 子域是领域的一部分,它代表了整个业务领域中的一个特定的、内聚的功能区域或问题空间。
因为一个完整的领域通常非常庞大和复杂,为了降低理解的复杂度,DDD建议我们将庞大的领域分解成多个更小、更易于管理的部分,这些部分就是子域。
•核心思想: “分而治之”。通过划分不同的子域,不同的开发团队可以专注于解决自己最擅长的那部分业务问题,而不会被整个领域的复杂性淹没。•例子:
•在“在线零售”(领域)中,可以划分出以下子域:
•商品目录子域: 负责管理商品信息、分类、搜索等。•订单子域: 负责处理购物车、下单、订单状态跟踪等。•支付子域: 负责与支付网关集成,处理支付、退款等。•物流子域: 负责计算运费、跟踪包裹等。•用户账户子域: 负责用户注册、登录、个人信息管理等。
•整体与部分: 领域是整体,子域是组成部分。一个领域由多个子域构成。•问题空间: 两者都属于“问题空间”的范畴,它们讨论的是业务是什么,而不是技术如何实现。技术实现是“解决方案空间”的事情(比如微服务、模块等)。
在DDD中,根据子域的战略重要性,会将其分为三类。这种分类决定了你应该在何处投入最多的精力和最好的资源。
核心域
•定义: 这是业务的核心竞争力所在,是公司之所以能在市场中脱颖而出、区别于竞争对手的关键部分。它是公司最重要的资产。•投资策略: 投入最优秀的团队和最多的资源进行精心设计和持续打磨。•例子:
•对于亚马逊,其核心域可能是推荐系统和物流优化。•对于Netflix,其核心域是内容推荐算法。•对于一个普通的电商公司,其核心域可能只是独特的商品供应链,而网站本身可能不是最核心的。
通用域
•定义: 这是一个几乎每个同类业务系统都需要用到的功能,但它不是你的核心竞争力。通常,这类功能可以直接购买现成的解决方案或使用开源软件,而不是自己从头开发。•投资策略: 购买优于自研。除非有极特殊的定制需求,否则不应投入大量精力。•例子:
•支付功能:可以使用Stripe、支付宝、微信支付等。•身份验证和授权:可以使用Auth0、Keycloak等。•发送邮件通知:可以使用SendGrid、Mailchimp等。
支撑域
•定义: 这是业务运营所必需的子域,但它既不构成核心竞争力,也不是通用到可以直接外购的。它“支撑”着核心业务的运作。•投资策略: 如果没有合适的现成产品,需要自己开发。但投入的精力应少于核心域,目标是保证其稳定可靠即可,不必过度创新。•例子:
•物流跟踪系统:对于电商公司很重要,但通常不是其最核心的差异点。•客户工单系统:支持客户服务所必需,但通常不是业务增长的主要驱动因素。
概念 | 定义 | 特点 | 例子(以电商为例) |
|---|---|---|---|
领域 | 组织所从事的整个业务范围 | 宏观的、完整的业务宇宙 | 在线零售 |
子域 | 领域中的一个特定功能部分 | 微观的、内聚的业务组件 | 商品目录、订单、支付 |
核心域 | 业务的核心竞争力所在 | 必须自研,投入最优资源 | 独特的推荐算法/供应链 |
通用域 | 行业通用的功能,非核心 | 优先购买,避免重复造轮子 | 支付网关集成 |
支撑域 | 支持核心业务运作的必要功能 | 可以自研,满足需求即可 | 物流跟踪、客服系统 |
一个生动的比喻:
想象你要开一家餐厅(领域)。
•这个餐厅包含很多部分:厨房、用餐区、收银台、菜单设计、营销活动等。这些就是子域。•你的餐厅招牌是独家秘制的酱料(核心域),这是你吸引顾客的法宝,所以你花重金请最好的厨师来研究和改进它。•收银系统(通用域)很重要,但没必要自己造一台收银机,直接去买现成的就好。•餐厅的装修和员工制服(支撑域)需要自己设计定制,它们影响顾客体验,但不是顾客来的首要原因。
通过这种划分,DDD帮助团队清晰地识别出业务的战略重点,从而做出更明智的技术和资源投资决策。