领域驱动设计(DDD)的个人见解(二)

1. 整体流程和优点

在这里插入图片描述
我想先用这张图描述一个项目的整体流程。核心思想是把大问题拆解为小问题,分而治之。

系统上下文就是将整个需求拆分为不同系统,比如说电商,就要分为支付系统,商品系统等。将一个业务分成多个子系统,每个系统又分成多个限界上下文,每个限界上下文映射成菱形结构。菱形结构是以领域模型为核心的自治单元。菱形结构作为基本结构单元,将业务聚合在限界上下文内部,符合单一职责原则,相当于将业务能力做了纵向切分,菱形结构里,北向网关引入服务层,南向网管引入基础设施层和防腐层来保证领域层独立演进,不受外界改变的影响,如下图所示。当然要不要设计成菱形结构得看业务复杂度,业务简单可以用mvc三层架构,这里只探讨DDD。
三层架构明显的缺点就是架构跟业务无关,业务复杂服务层就会有重复代码,结构职责不清晰。

三层架构与菱形架构对比图

2. 领域建模的流程

领域建模的难点就是对领域模型的抽象实现领域模型
领域建模分为三个阶段,领域分析建模、领域设计建模、领域实现建模。三个阶段是迭代式的,不是阶段式的,循环往复不断优化模型。

2.1 领域分析建模

动名词法。也称快速建模法。
在这里插入图片描述

2.2 领域设计建模

根据建模关系,用实体,值对象,领域事件、聚合、工厂、领域服务和资源库等战术来实现设计领域模型。输出就是UML类图。

2.3 领域实现建模

测试驱动开发,发现问题,优化上一步设计的模型。

3. 案例

3.1 需求

公司雇员有3种类型:钟点工、月薪雇员和销售人员。

对于钟点工,系统会按照雇员记录中每小时报酬字段的值为他们支付报酬。他们每天会提交记录了日期以及工作小时数的工作时间卡。如果他们每天工作超过8小时,超过部分会按照正常报酬的1.5倍进行支付。月薪雇员以月薪进行支付,在雇员记录中有月薪字段。公司会对雇员做考勤处理,如果雇员迟到、早退或旷工,会扣除其月薪的一定金额对于销售人员,则根据他们的销售情况支付一定的报酬。他们会提交销售凭条,其中记录了销售的日期和销售产品的数量,酬金保存在雇员记录的酬金报酬字段。
在为各种类型的雇员结算薪资后,系统会根据每位雇员预留的银行账户在规定时间向其自动支付薪资。钟点工的薪资支付日期为每星期五,月薪雇员的薪资支付日期为每个月的最后一个工作日,销售人员的薪资支付日期为每隔一星期的星期五。
在这里插入图片描述

3.2 支付薪资服务规约

  • 服务编号: s0005

  • 服务名:支付薪资

  • 服务描述:
    作为财务人员:
    我想要系统按期自动支付薪资,一遍提高财务人员的工作效率,及时发放薪资

  • 触发事件:
    每天00:00自动触发

  • 基本流程:
    确定是否为支付日。
    获取要支付报酬的员工。
    计算员工薪酬,生成工资条。
  1. 钟点工。按工作时间卡计算薪资。
  2. 月薪员工。按考勤计算。
  3. 销售。根据销售凭条计算工资。
    向员工账户转账,支付薪资。
    通过邮件,向员工发送工资条。

  • 替换流程:
    不是支付日,直接退出。
    支付失败,发送失败原因,发送给财务。

  • 验收标准:
  1. 钟点工支付日为每个星期五。
  2. 如果钟点工未提交工作时间卡,视为未工作。
  3. 工作时间卡最低不少于1个小时,最高不多于12小时。
  4. 超过8小时不分,1.5倍支付。
  5. 月薪雇员为每月最后一个工作日。
  6. 若月薪雇员的出勤记录包含旷工,按照月薪计算日薪,扣除。
  7. 若早退、迟到,扣除日薪的20%。
  8. 销售人员每隔一周的星期五支付。
  9. 若销售人员未提交销售凭条,酬金报酬为0.
  10. 会为符合支付条件的员工生成工资条。
  11. 支付成功后,员工工资条的状态会更改为已支付。
  12. 员工收到薪资发送的通知。

3.3 领域模型

  1. 识别其中的名词。(加粗表示)
  2. 识别其中的动词。(斜体表示)
  3. 识别关系。

作为财务人员(Accountant)
我想要系统按期自动支付 薪资(Salary),一遍提高财务人员的工作效率,及时发放薪资

  • 触发事件:
  • 每天00:00自动触发
  • 基本流程:
    确定是否为支付日(PayDay)
    获取要支付报酬的员工(Employee)
    计算员工薪酬,生成工资条(PayRoll)
  1. 钟点工(HourlyEmployee)。按**工作时间卡(TimeCard)**计算薪资,超过8小时按1.5倍计算。
  2. 月薪员工(SalariedEmployee)。按**考勤记录(Attendance)**计算。
  3. 销售(CommissionedEmployee)。根据销售凭条(SaleReceipt)计算工资。
    向员工
    账户(SavingAccount)转账,支付薪资。
    通过
    邮件(Email)
    ,向员工发送工资条(PayRoll)
  • 验收标准:
  1. 钟点工支付日为每个星期五。
  2. 如果钟点工未提交工作时间卡,视为未工作。
  3. 工作时间卡最低不少于1个小时,最高不多于12小时。
  4. 超过8小时不分,1.5倍支付。
  5. 月薪雇员为每月最后一个工作日。
  6. 若月薪雇员的出勤记录包含旷工,按照月薪计算日薪,扣除。
  7. 若早退、迟到,扣除日薪的20%。
  8. 销售人员每隔一周的星期五支付。
  9. 若销售人员未提交销售凭条,酬金报酬为0.
  10. 会为符合支付条件的员工生成工资条。
  11. 支付成功后,员工工资条的状态会更改为已支付。
  12. 员工收到薪资发送的通知(Notification)

第一步之后的名词模型为
在这里插入图片描述
第二步,根据动词识别。要判断行为是否需要产生过程数据。要从管理、法律或财务等角度来判断过程数据的必要性。
从财务的角度来说,支付应保存支付记录(Payment)。

第三步,识别关系。分为两个限界上下文,如下图所示
在这里插入图片描述
至此,领域设计建模已完成。篇幅有限,实现模型下一章讲。

4. 最后

本文引用自《结构领域驱动设计》一书,强烈推荐
https://item.jd.com/13378760.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值