领域建模过程
Posted tangdong3415
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了领域建模过程相关的知识,希望对你有一定的参考价值。
1、领域建模过程
2、领域建模方法
2.1、四色建模
四色建模代表的领域对象类型
- 时标型(Moment-Interval)对象:具有可追溯性的记录运营或管理数据的时刻或时段对象,用粉红色表示。
- PPT(Party/Place/Thing)对象:代表参与到流程中的参与方/地点/物,用绿色表示。
- 角色(Role)对象:在时标型对象与 PPT 对象(通常是参与方)之间参与的角色,用黄色表示。
- 描述(Description)对象:对 PPT 对象的一种补充描述,用蓝色表示。
时标型对象特征
- 时标型对象是支撑运营体系关键流程的执行结果。
- 时标型对象是过去某个时刻或时段发生的事实(Fact);
- 时标型对象记录的数据是决策者和管理者关注的信息,满足对责任的可追溯性;
- 时标型对象记录的数据是为了满足财务和法律的需求,倘若缺失,会影响到参与方的权益和义务。
四色建模法的建模过程
- 首先以满足管理和运营的需要为前提,寻找需要追溯的事件。
- 根据这些需要追溯,寻找足迹以及相应的时标型对象。
- 寻找时标对象周围的参与方/地点/物品。
- 从中抽象角色。
- 把一些信息用描述对象补足
2.2、事件风暴
在DDD建模过程中,以领域事件为线索逐步得到领域模型已经成为了主流的实践,即:事件风暴。事件风暴是一项团队活动,在活动中,团队先通过头脑风暴的形式罗列出领域中的所有的领域事件,整合之后形成最终的领域事件集合,然后对于每一个事件,标注出导致该事件的命令,然后再为每个事件标注出命令发起方的角色,命令可以是用户发起的,也可以是第三方系统调用或者是定时器触发等。最后对事件进行分类找出聚合。
事件特征
-
- 事件是过去发生的与业务有关的事实。
- 事件是管理者和运营者重点关心的内容,若缺少该事件,会对管理与运营产生影响
- 事件具有时间点的特征,所有事件连接起来会形成明显的时间
- 事件会导致目标对象状态的变化
事件风暴中关注的对象
-
- 事件 -> 是过去发生的与业务有关的事实。
- 决策命令 ->与事件一一对应
- 角色 -> 发送决策命令的人、条件、外部系统
- 实体、聚合 -> 决策命令作用主体,关联对象
4、领域模型设计
领域分析建模是实现了从现实世界到对象图模型的映射,那么领域设计建模就是在这个映射关系上针对对象图模型施加设计约束,从而解决将现实照进理想时出现的问题。设计约束引入的设计要素,就是领域驱动设计给出的设计模式。
5、领域建模语言
5.1、实体
实体特征
- 标识必须唯一。
- 两个实体对象只要它们的标识相等,哪怕标识属性以外的所有属性值都不相等,这两个对象也认为是同一个实体。
- 实体的标识不可变,标识属性以外的属性值是可变的。
实体包含的元素
- 唯一标识
- 属性
- 基本属性
- 组合属性
- 领域行为
- 变更状态的行为
- 自给自足的领域行为
- 互为协作的领域行为
5.2、值对象
当你只关心某个对象的属性时,该对象便可做为一个值对象,用于描述事物的数量、性质、关系、地点、时间与形态。
值对象特征
- 不具备唯一标识
- 通过属性判等
- 不变性,线程安全
值对象的不变性
- 对象创建后其状态不可变
- 对象所有字段都是final的
5.3、聚合
将实体和值对象划分为聚合并围绕着聚合定义边界。选择一个实体作为每个聚合的根,并允许外部对象仅能持有聚合根的引用。作为一个整体来定义聚合的属性和不变量(Invariants),并将执行职责(Enforcement Responsibility)赋予聚合根或指定的框架机制。
聚合的特征
- 聚合是包含了实体和值对象的一个边界。
- 聚合内包含的实体和值对象形成了一棵树,只有实体才能作为这棵树的根,这个根称为聚合根(Aggregate Root),这个实体称为根实体。
- 外部对象只允许持有聚合根的引用,如此才能起到边界的控制作用
- 聚合作为一个完整的领域概念整体,在其内部会维护这个领域概念的完整性,体现业务上的不变量约束
- 由聚合根统一对外提供履行该领域概念职责的行为方法,实现内部各个对象之间的行为协作
5.4、工厂
领域驱动设计要求聚合内所有对象保证一致的生命周期,这往往会导致创建逻辑趋于复杂。为了减少调用者的负担,同时也为了约束生命周期,通常都会引入工厂来创建聚合。
使用工厂的优势
- 工厂方法有名称,通过名称可以很好的体现领域逻辑
- 工厂可返回产品类型的任何子类型,聚合对象具有继承体系
工厂实现方式
- 由被依赖聚合担任工厂
- 引入专门的聚合工厂
- 聚合自身担任工厂
- 使用构建者组装聚合
5.5、仓储
仓储(Repository)是对数据访问的一种业务抽象,使其具有业务意义。利用资源库抽象,就可以解耦领域层与外部资源,使领域层变得更为纯粹,能够脱离外部资源而单独存在。“我们可以通过对象之间的关联来找到对象。但当它处于生命周期的中间时,必须要有一个起点,以便从这个起点遍历到一个实体或者对象。”
资源库与DAO差异
- 资源库操作的是属于领域层中的具有边界的聚合;DAO 操作的是数据传输对象,即持久化对象,该对象与 DAO 一起都位于数据访问层;
- 资源库强调了聚合生命周期的管理,其目的在于获取聚合对象的引用,在形成聚合的对象图后,便于调用者对其进行操作。
资源库的实现原则
- 保证资源库接品不要混入基础设施的实现
- 一个聚合对应一个资源库
- 在领域层,只有领域服务才依赖于资源库
5.6、领域事件
什么是领域事件
-
- 领域专家所关心的发生在领域中的一些事件。
- 将领域中所发生的活动建模成一系列的离散事件。
- 每个事件都用领域对象来表示。
- 领域事件是领域模型的组成部分,表示领域中所发生的事情。
5.7、领域服务
领域服务(Domain Service)代表了在名词世界(面向对象)中对动词的封装(接口),它封装了领域行为。前提在于,这一领域行为在实体或值对象中找不到容身之处。换言之,当我们针对领域行为建模时,需要优先考虑使用值对象和实体来封装领域行为,只有确定无法寻觅到合适的对象来承担时,才将该行为建模为领域服务的方法。
领域服的识别
- 领域行为需要多个聚合参与协作,目的是使用聚合内的实体和值对象编排业务逻辑
- 领域行为与状态无关
- 领域行为需要与访问包括数据库在内的外部资源协作
5.8、领域能力
领域能力的一些业务策略,不同业务有不同的需求,这种因业务而异、无法确定的逻辑被定义成扩展点,由前台业务自行设置。
比如订单取消服务(领域服务),由订单状态判断、订单有效期判断等多个领域能力支撑,其中订单有效期面对秒杀、预售、手机充值等不同业务场景会有不同的有效时间,这个有效时间可以做成一个扩展点:订单有效期,由前台业务进行定义。
扩展点有版本概念,业务包一般基于一个版本开发,所以扩展点的升级需要做到多版本兼容,降低前台研发使用成本。
扩展点就是SPI,只是传统的SPI没有业务身份的概念。
更多例子如下:
- 减库策略能力:库存策略选择(拍减/预扣/付减)、是否回补、预扣超时时间
- 普通收货方式能力:是否使用常用地址、是否过滤赠品、是否展示地址
- 京豆能力:可用京豆数量、是否禁用京豆
- 买家评价能力:是否允许买家评价、POP评价计分规则、是否允许卖家回复
- 其他:是否支持优惠、是否支持货到付款、是否支持白条分期、是否强制匿名购买
扩展点需要有个默认逻辑,同时不同业务身份可以定义自己的逻辑,即不同业务身份定义不同的扩展点实现。
6、领域建模学习资料
- 内部学习心得总结:404-阿里云开发者社区
以上是关于领域建模过程的主要内容,如果未能解决你的问题,请参考以下文章