DDD的全称为Domain-driven Design,即领域驱动设计.
领域:二手商品(二手车)交易平台,宠物托管平台
子域:支付子域,产品子域,用户认证子域
界限上下文:支付上下文,认证上下文
子域提供问题空间,界限上下文提供解决空间
领域驱动主模块划分:界限上下文
实体Entity(可以理解成为学校的学生)
- 唯一标识(用户提供,应用生成UUID/GUID,持久化生成)
- 数据可变
- 生命周期管理(订单状态管理)
- 唯一标识是实体与实体,聚合与聚合之间的纽带
值对象Value Object(可以理解为一本书)
- 无标识
- 数据不可变,可复制,可替代
- 整体性(比如:¥100,只有将人民币单位跟100结合在一起才能表示这是100元钱)
- 度量和描述
聚合Aggregate(可以理解为学校里面的班级)
- 事务一致性边界.(一起上课,一起打比赛,一起联谊,一起打架)
- 聚合之间通过聚合根(通常为聚合同名实体)进行沟通.(聚合根可以理解为一个班的班长,班长可以代表这个班进行联谊,打比赛,这个班级也可以指代班级,比如张三的班级xxxx)
- 尽量缩小聚合(最终一致性和领域消息).(小聚合易于扩展)
- 聚合是创建,发布领域事件和操作资源库的操作主体.(一切荣誉归班级,黑锅一起背)
工厂Factory
- 创建聚合实体
- 工厂类,工厂方法,创建者模式
- 对象解耦
- 封装复杂操作过程
资源库Repository
- 聚合的增删改查
- 对接持久化机制(如:mybatis)
- 和DAO,Mapper类似,但更侧重集合的处理
- 封装复杂操作过程
领域服务Domain Service
- 无状态
- 无法归为实体和值对象
- 业务操作过程,对领域对象进行转换
- 如:密码加密服务,文字转换服务,应收账款和应付账款对账
属性和约束:值对象化
比如:
- 100块钱打车能开30公里,这就是属性
- 我这次出差打车费不能超过100块,这就是约束
- 把这些相关内容,相关逻辑封装在一个值对象里面,限制实体描述实体这就是属性和约束
贫血充血模型
- 血:业务逻辑
- 贫血:getter setter方法,CRUD工程师
- 充血:说人话,应用逻辑为主,数据管理为辅
- 贫血:上手快,发展受限,适合应用逻辑简单,信息记录类型的业务
- 充血:上限高,容易三高,适合逻辑复杂,信息处理类型的业务
CQRS(Command Query Responsibility Separation):写和读的责任分离
- Command:执行动作,返回void
- Query:只查询不修改对象状态
- 风格:事件驱动系统风格,管道过滤器风格
事件风暴核心思想
- 由下而上,更快
- 事件驱动,更新
- 团队破冰,更嗨