菜单

Loen
发布于 2025-10-14 / 0 阅读
0
0

DDD领域驱动设计

当然可以!这是一个非常棒的问题。领域驱动设计(Domain-Driven Design,简称DDD)听起来很复杂,但

一、DDD 领域驱动设计(Domain-Driven Design,简称DDD)到底是啥?(一句话说清)

DDD 的核心思想是:软件的核心复杂性应该通过深刻地理解和精确地建模“业务领域”来解决,而不是被技术实现细节所主导。

简单来说,就是 “让软件说业务的语言”

  • 传统开发:程序员听到“用户下单”,脑子里想的是 user_tableorder_table,然后开始写 SQL 和 API。
  • DDD开发:程序员、产品经理、业务专家坐在一起,先搞清楚到底什么是“订单”?“下单”这个动作具体包含哪些步骤?(检查库存、计算价格、锁定库存等),然后用代码把这些业务概念和规则直接表现出来。

二、如何短时间内掌握核心思想?(15分钟速成)

你不需要一下子掌握所有术语和模式。抓住以下四个最核心的概念,你就抓住了DDD的魂。

核心概念 1:领域与子领域

  • 领域:就是你软件要解决的那个业务问题本身。比如,你要做一个电商系统,那么“电商”就是你的领域。
  • 子领域:一个大的业务领域可以拆分成多个更小的、专注的领域。
    • 核心子领域:公司的核心竞争力所在。比如电商的商品交易子领域(下单、支付、库存)。这是最需要投入精力的地方。
    • 通用子领域:很常见,但没有特殊性,可以直接用现成方案或简单开发。比如电商的用户认证子领域(登录、注册)。
    • 支撑子领域:不是核心,但业务需要,得自己实现。比如电商的物流跟踪子领域

核心思想识别并区分核心域,把最好的资源投入在核心域上。

核心概念 2:统一语言

这是DDD中最简单、也最容易被忽视,但最重要的一点。

  • 是什么:在项目团队(包括开发、测试、产品、业务方)内部,对每一个业务概念都使用一个清晰、无歧义的词汇
  • 怎么做:在讨论和文档中,坚决使用业务术语,而不是技术名词。
    • 错误示范:“我调用 OrderServicecreate 方法,然后往 order_item 表里插了几条数据。”
    • 正确示范:“用户提交了一个订单,这个订单包含了三个订单项。”
  • 好处:极大减少沟通成本,防止需求理解偏差,并且这个语言会直接体现在你的代码(类名、方法名)中。

核心思想团队共用一套业务语言,这套语言就是代码的基石。

核心概念 3:限界上下文

这是DDD中最关键的战略模式,用来处理模型的复杂度。

  • 是什么:一个语义上的边界。在这个边界内,一个术语(比如“产品”)有且只有一种明确的含义。
  • 经典例子:在电商系统中:
    • 在“商品上下文中”:“产品”指的是待售的商品,它有价格、描述、库存等属性。
    • 在“物流上下文中”:“产品”指的是一个物理包裹,它有重量、体积、易碎品标识等属性。
    • 这两个“产品”根本不是同一个东西!你不能把物流的重量属性加到商品上下文的“产品”模型里。
  • 怎么做:明确识别出这些边界,每个边界内都有自己的领域模型统一语言。边界之间通过明确的接口(如API、消息)进行通信。

核心思想一个大系统要拆分成多个高内聚、低耦合的“小模块”,每个模块负责一块独立的业务,并拥有自己独立的模型。

核心概念 4:实体与值对象

这是DDD中最基础的战术建模构件,帮助你构建出富有表现力的模型。

  • 实体有唯一标识、有生命周期的对象。我们关心的是它的身份,而不是它的属性。
    • 例子订单用户。一个订单无论其收货地址如何修改,它还是那个订单,我们通过订单ID来识别它。
  • 值对象没有唯一标识,只关心其属性值的对象。它通常是不变的。
    • 例子金额(由数值和货币单位组成)、地址(由省市区街道组成)。两个金额,只要数值和单位相同,我们就可以认为它们是相同的。我们不会去修改一个金额,而是用一个新的金额来替换它。

核心思想用“实体”来管理有身份的业务对象,用“值对象”来描述那些没有身份的、不可变的业务属性。


三、实践路径:从“知道”到“会用”

  1. 第一步:沟通先行

    • 下次开会或讨论需求时,有意识地和产品经理确认:“咱们说的这个‘客户’,具体指的是什么?和‘用户’是一个意思吗?” 这就是在建立统一语言
  2. 第二步:画边界图

    • 拿到一个复杂需求,别急着写代码。先在白板上画一画,这个系统可以分成哪几个大的、相对独立的业务板块?这就是在识别限界上下文
  3. 第三步:聚焦核心

    • 问问自己或团队:“我们做的这个功能,属于公司的核心竞争力吗?” 如果不是,也许不需要过度设计,找个简单的开源方案搞定即可。这就是在区分核心域、通用域和支撑域
  4. 第四步:优化代码模型

    • 在写一个类的时候,想一想:“这个对象是需要被唯一追踪的(实体),还是仅仅是一个属性的集合(值对象)?” 这能帮你设计出更清晰的代码。

总结

把DDD想象成城市规划

  • 领域 = 你要规划的城市(比如一个科技新城)。
  • 子领域 = 商业区(核心)、住宅区(支撑)、公园(通用)。
  • 统一语言 = 全市统一的路牌和地图标识,防止迷路。
  • 限界上下文 = 每个区都有自己的规划规则和建筑风格,商业区高楼大厦,住宅区安静宜居,区与区之间有明确的主干道(接口)相连。
  • 实体与值对象 = 城市规划中的基本元素,一栋有门牌号的楼是实体,一条没有标识的普通小路是值对象

短时间内掌握的核心思想就是:

面对复杂软件,不要一头扎进技术里。要先和业务专家一起,用统一的业务语言,把复杂的业务领域划分成清晰的边界,然后聚焦核心,用富有业务含义的模型(实体/值对象)去实现它。

先理解这些战略层面的思想,远比一开始就纠结“聚合根”、“领域服务”、“仓储”等具体战术模式要重要得多。


评论