🏆 原文:05|领域建模实践(上):怎样既准确又深刻地理解业务知识?
领域建模主要有两个目的
- 将知识可视化,准确、深刻地反映领域知识,并且在业务和技术人员之间达成一致
- 指导系统的设计和编码,也就是说,领域模型应该能够比较容易地转化成数据库模式和代码实现
建立领域模型,主要是要识别领域对象(domain object),领域对象之间的关系,以及领域对象的关键属性,必要的时候还要将领域对象组织成模块。
领域建模阶段主要关注点
主要关注的是实体和它们之间的关系
DDD 中的领域对象是什么?请举例说明。来自 GPT4 的回答
在领域驱动设计(Domain-Driven Design,简称DDD)中,领域对象(Domain Object)是一种模型,用于封装业务逻辑,包含数据及其行为。这些对象代表着系统中业务概念和业务规则。领域对象通常在领域层(Domain Layer)中定义,这个层次负责表示业务情境中的概念和业务情境下的业务规则。 领域对象分为几种类型,包括但不限于以下几类:
实体(Entities)
实体具有一个唯一标识符,即使其他属性发生变化,该标识符也保持不变。实体通常对应于业务领域中具有明确身份和生命周期的概念。 举例:在电商系统中,Order(订单)可以是一个实体,具有唯一的订单号(标识符),以及与订单相关的用户信息、订单项、支付信息等属性。
值对象(Value Objects)
值对象是不可变的,没有唯一标识符,通常用来描述实体的某些属性。 举例:在电商系统中,Address(地址)可以是一个值对象,用以表示订单的配送地址。它描述了地址的各个组成部分,如街道、城市、邮编等,但不需要一个唯一标识符。
聚合(Aggregates)
聚合是一组相关对象的集合,被视作一个单一的单元。每个聚合都有一个根实体,称为聚合根(Aggregate Root),它对聚合内的其他对象持有最高权限。 举例:在电商系统中,Order(订单)可作为聚合根,它又包含了多个OrderItem(订单项)实体和一个Payment(支付)值对象。
领域服务(Domain Services)
当某些行为不自然属于任何实体或值对象时,这些行为可以定义为领域服务。领域服务包含业务逻辑,但它们的状态不存储业务数据。 举例:在银行系统中,FundsTransferService(资金转账服务)可能会成为一个领域服务,它实现了资金转账的逻辑,但不直接持有资金或账户的状态。
领域事件(Domain Events)
领域事件表示领域中发生的事情,它们通常由实体或领域服务发布,并由感兴趣的部分订阅和响应。 举例:当用户完成购买操作后,系统可以发布一个OrderPlacedEvent(订单已下达事件),这个事件可能触发库存系统的更新和一个通知服务来发送确认邮件给用户。
在 DDD 中,领域对象是把软件模型和业务模型保持对齐的重要手段,它们帮助设计出更加贴近业务实际的软件系统。通过领域对象,系统能够更易于理解、维护,并能够适应业务逻辑的变化。