1. 整体流程和优点
我想先用这张图描述一个项目的整体流程。核心思想是把大问题拆解为小问题,分而治之。
系统上下文就是将整个需求拆分为不同系统,比如说电商,就要分为支付系统,商品系统等。将一个业务分成多个子系统,每个系统又分成多个限界上下文,每个限界上下文映射成菱形结构。菱形结构是以领域模型为核心的自治单元。菱形结构作为基本结构单元,将业务聚合在限界上下文内部,符合单一职责原则,相当于将业务能力做了纵向切分,菱形结构里,北向网关引入服务层,南向网管引入基础设施层和防腐层来保证领域层独立演进,不受外界改变的影响,如下图所示。当然要不要设计成菱形结构得看业务复杂度,业务简单可以用mvc三层架构,这里只探讨DDD。
三层架构明显的缺点就是架构跟业务无关,业务复杂服务层就会有重复代码,结构职责不清晰。
2. 领域建模的流程
领域建模的难点就是对领域模型的抽象和实现领域模型。
领域建模分为三个阶段,领域分析建模、领域设计建模、领域实现建模。三个阶段是迭代式的,不是阶段式的,循环往复不断优化模型。
2.1 领域分析建模
动名词法。也称快速建模法。
2.2 领域设计建模
根据建模关系,用实体,值对象,领域事件、聚合、工厂、领域服务和资源库等战术来实现设计领域模型。输出就是UML类图。
2.3 领域实现建模
测试驱动开发,发现问题,优化上一步设计的模型。
3. 案例
3.1 需求
公司雇员有3种类型:钟点工、月薪雇员和销售人员。
对于钟点工,系统会按照雇员记录中每小时报酬字段的值为他们支付报酬。他们每天会提交记录了日期以及工作小时数的工作时间卡。如果他们每天工作超过8小时,超过部分会按照正常报酬的1.5倍进行支付。月薪雇员以月薪进行支付,在雇员记录中有月薪字段。公司会对雇员做考勤处理,如果雇员迟到、早退或旷工,会扣除其月薪的一定金额对于销售人员,则根据他们的销售情况支付一定的报酬。他们会提交销售凭条,其中记录了销售的日期和销售产品的数量,酬金保存在雇员记录的酬金报酬字段。
在为各种类型的雇员结算薪资后,系统会根据每位雇员预留的银行账户在规定时间向其自动支付薪资。钟点工的薪资支付日期为每星期五,月薪雇员的薪资支付日期为每个月的最后一个工作日,销售人员的薪资支付日期为每隔一星期的星期五。
3.2 支付薪资服务规约
- 服务编号: s0005
- 服务名:支付薪资
- 服务描述:
作为财务人员:
我想要系统按期自动支付薪资,一遍提高财务人员的工作效率,及时发放薪资
- 触发事件:
每天00:00自动触发
- 基本流程:
确定是否为支付日。
获取要支付报酬的员工。
计算员工薪酬,生成工资条。
- 钟点工。按工作时间卡计算薪资。
- 月薪员工。按考勤计算。
- 销售。根据销售凭条计算工资。
向员工账户转账,支付薪资。
通过邮件,向员工发送工资条。
- 替换流程:
不是支付日,直接退出。
支付失败,发送失败原因,发送给财务。
- 验收标准:
- 钟点工支付日为每个星期五。
- 如果钟点工未提交工作时间卡,视为未工作。
- 工作时间卡最低不少于1个小时,最高不多于12小时。
- 超过8小时不分,1.5倍支付。
- 月薪雇员为每月最后一个工作日。
- 若月薪雇员的出勤记录包含旷工,按照月薪计算日薪,扣除。
- 若早退、迟到,扣除日薪的20%。
- 销售人员每隔一周的星期五支付。
- 若销售人员未提交销售凭条,酬金报酬为0.
- 会为符合支付条件的员工生成工资条。
- 支付成功后,员工工资条的状态会更改为已支付。
- 员工收到薪资发送的通知。
3.3 领域模型
- 识别其中的名词。(加粗表示)
- 识别其中的动词。(斜体表示)
- 识别关系。
作为财务人员(Accountant):
我想要系统按期自动支付 薪资(Salary),一遍提高财务人员的工作效率,及时发放薪资
- 触发事件:
- 每天00:00自动触发
- 基本流程:
确定是否为支付日(PayDay)。
获取要支付报酬的员工(Employee)。
计算员工薪酬,生成工资条(PayRoll)。
- 钟点工(HourlyEmployee)。按**工作时间卡(TimeCard)**计算薪资,超过8小时按1.5倍计算。
- 月薪员工(SalariedEmployee)。按**考勤记录(Attendance)**计算。
- 销售(CommissionedEmployee)。根据销售凭条(SaleReceipt)计算工资。
向员工账户(SavingAccount)转账,支付薪资。
通过邮件(Email),向员工发送工资条(PayRoll)。
- 验收标准:
- 钟点工支付日为每个星期五。
- 如果钟点工未提交工作时间卡,视为未工作。
- 工作时间卡最低不少于1个小时,最高不多于12小时。
- 超过8小时不分,1.5倍支付。
- 月薪雇员为每月最后一个工作日。
- 若月薪雇员的出勤记录包含旷工,按照月薪计算日薪,扣除。
- 若早退、迟到,扣除日薪的20%。
- 销售人员每隔一周的星期五支付。
- 若销售人员未提交销售凭条,酬金报酬为0.
- 会为符合支付条件的员工生成工资条。
- 支付成功后,员工工资条的状态会更改为已支付。
- 员工收到薪资发送的通知(Notification)。
第一步之后的名词模型为
第二步,根据动词识别。要判断行为是否需要产生过程数据。要从管理、法律或财务等角度来判断过程数据的必要性。
从财务的角度来说,支付应保存支付记录(Payment)。
第三步,识别关系。分为两个限界上下文,如下图所示
至此,领域设计建模已完成。篇幅有限,实现模型下一章讲。
4. 最后
本文引用自《结构领域驱动设计》一书,强烈推荐
https://item.jd.com/13378760.html