Skip to content

领域模型

领域模型(Domain Model)是对特定业务领域(问题域)中的核心概念、实体、规则、关系和流程的抽象表示。它的核心目的是捕获业务本质,解决业务问题,而不是技术实现细节。

简单来说,领域模型就是用软件开发者能理解和实现的方式,精确地描述业务专家眼中的“业务世界”。它是业务知识在软件设计中的体现。

核心特征和目标

  1. 反映业务现实:

    • 它基于对业务领域的深入理解(通常通过与领域专家交流获得)。
    • 包含该领域的关键概念(如“客户”、“订单”、“产品”、“库存”、“支付”、“航班”、“座位”等)。
    • 描述这些概念之间的关系(如“一个客户可以有多个订单”,“一个订单包含多个产品项”)。
    • 体现重要的业务规则和约束(如“订单总额不能超过客户的信用额度”,“机票一旦出票,24小时内可免费退票”)。
  2. 解决特定业务问题:

    • 领域模型不是通用的,它聚焦于当前软件系统要解决的特定业务问题范围(即“限界上下文”)。
    • 它关注的是业务的核心复杂性和挑战所在。
  3. 独立于技术实现:

    • 领域模型主要描述“业务是什么”和“业务做什么”,而不是“如何存储数据”或“如何调用API”。
    • 它应该与技术细节(如数据库表结构、框架选择、UI设计)解耦。虽然最终要映射到实现,但模型本身是业务逻辑的纯粹表达。
  4. 作为沟通的通用语言:

    • 领域模型是业务专家、产品经理、架构师、开发人员、测试人员等不同角色之间沟通的基础。
    • 模型中的术语(如“订单”、“预订状态”)成为项目团队共享的、具有明确含义的“通用语言”。
  5. 指导软件设计:

    • 领域模型是软件设计的核心输入。系统的架构(尤其是领域层)、类设计、接口设计都应围绕领域模型展开。
    • 它帮助识别出系统中的核心领域对象(实体、值对象)、它们的行为(领域服务、领域事件)以及它们之间的关系(聚合、仓储)。

领域模型的主要组成部分

  • 实体: 具有唯一标识符和生命周期(会变化)的对象。例如:Customer (客户ID唯一)、Order (订单号唯一)、Bank Account (账号唯一)。
  • 值对象: 描述某种特征但没有唯一标识符的对象,其属性组合定义其唯一性。它们通常是不可变的。例如:Money (金额 + 货币)、Address (省市区街道门牌号)、Color (RGB值)。
  • 聚合: 一组紧密关联、作为一个整体进行操作的实体和值对象的集合。 它定义了数据修改的边界和一致性保证。聚合根是聚合内部唯一被外部直接引用的对象。
  • 领域服务: 封装不适合放在实体或值对象中的业务逻辑(通常是跨多个实体的操作或无状态操作)。例如:TransferService (处理两个账户之间的转账,涉及两个Account实体和金额计算)。
  • 仓储: 提供对聚合根进行持久化存储和检索的抽象接口。它屏蔽了底层数据库细节。
  • 领域事件: 表示在领域内发生的、其他部分可能感兴趣的重要事情。用于解耦系统不同部分或触发后续流程。例如:OrderPlacedEvent (订单已创建)、PaymentReceivedEvent (付款已收到)。
  • 工厂: 负责复杂对象或聚合创建逻辑的封装。

领域模型 vs. 数据模型

这是常见的混淆点:

  • 领域模型:
    • 关注业务行为、规则、概念和流程
    • 包含实体、值对象的行为(方法)。
    • 目标是解决业务问题,体现业务逻辑。
    • 设计围绕业务概念和用例。
    • 强调充血模型(Rich Domain Model),即对象不仅包含数据,还包含相关行为。
  • 数据模型:
    • 关注数据的存储、结构和关系(通常是关系型数据库的表、列、主键、外键)。
    • 主要描述数据结构。
    • 目标是高效、一致地存储和查询数据。
    • 设计围绕数据范式(如1NF, 2NF, 3NF)和查询性能。
    • 通常导致贫血模型(Anemic Domain Model),即对象仅有数据属性,行为被抽离到服务层。

为什么领域模型重要?(价值)

  1. 应对复杂性: 将复杂业务逻辑封装在模型中,使核心代码更清晰、更易维护。
  2. 提升可维护性: 业务规则集中在模型内部,修改规则时影响范围更可控。
  3. 改善沟通: 统一的“通用语言”极大减少了沟通误解。
  4. 增强可测试性: 业务逻辑集中在领域层,可以独立于UI、数据库等进行单元测试。
  5. 业务与技术对齐: 确保软件真正满足业务需求,解决业务问题,而不仅仅是实现技术功能。
  6. 更好的设计: 驱动出更符合业务本质的面向对象设计。

如何构建领域模型?

  1. 深入理解业务: 与领域专家密切合作,进行大量访谈和研讨(事件风暴、用例分析等)。
  2. 识别核心概念: 找出领域中的关键实体、值对象。
  3. 定义关系: 明确对象之间的关系(一对一、一对多等)。
  4. 明确业务规则: 梳理并记录重要的业务规则和约束。
  5. 识别聚合: 划定数据修改的边界,确定聚合根。
  6. 定义领域服务: 找出不适合放在实体/值对象中的操作。
  7. 识别领域事件: 找出系统中值得关注的发生点。
  8. 迭代精炼: 领域模型不是一蹴而就的,需要随着对业务理解的加深不断迭代和重构。

总结

领域模型是软件核心业务逻辑的灵魂。它是业务知识在代码中的直接映射,专注于解决特定业务领域的问题,使用该领域的语言,并独立于技术基础设施。构建一个好的领域模型是开发复杂业务系统成功的关键,也是领域驱动设计(DDD)的核心实践。它让软件不再是冷冰冰的代码堆砌,而是真正理解和解决业务问题的智能工具。