真北群专题分享:领域驱动&测试驱动 简介
时间:4月18日周四晚8:30~9:30
分享嘉宾:
邓志国,1997年毕业于浙江大学工业自动化专业,从事软件开发20余年,现任八九灵技术总监。在敏捷、领域驱动开发、测试驱动开发、微服务上有一定经验。
流程:
1. 群分享:图+文+语音
2. 问答
3. 自愿赞赏
4. 整理发布
大纲:
为什么要DDD
领域层
实现层
门面层
防腐层
对领域层进行TDD
以下为问答,不带邓老师名字的部分为群友提问:
21:06
保持domain曾的先进性与纯洁性
邓志国
必须的
邓志国
我在Domain层唯一一次引用了第三方库:加密解密算法库
感觉像mybatis的语句还是有必要测啊。有什么好的实践么
想问下,如果是微服务框架下,高并发下跨服务增改失败回滚的这种场景应该如何编写单元测试
目的是校验回滚的可靠性
邓志国
Mybatis我也觉得有时候需要测试,我的做法是,再写一个Module,简单的实现Controller,然后调用用例进行测试,不过这不是单元测试,可以称为协议测试。
邓志国
这个我觉得不是单元测试能解决的。如果你把跨服务事务调用作为一个产品,应该是对这个产品的集成测试。
21:10
当A,B两个业务共用的一个业务发生逻辑变化,A需要使用新逻辑,B需要使用旧逻辑的时候,如何处理?假设A,B都写日志,本来日志都写到数据库,新的业务是A需要把日志写到网络而B写到数据库
邓志国
单元测试,我们一般是指一个业务领域下的,一般局限于某一个业务用例的测试
邓志国
业务上,我不建议两个业务领域再共同依赖一些除了基本工具类外的东西,这样会造成业务领域相互耦合。
邓志国
每个业务领域都应该独立,相互不知道对方存在,用独立的数据库表
邓老师,还有一个问题,在企业缺乏领域专家的时候,统一建模比较难,有什么经验,比较方便的检验模型的正确性吗?
针对soa分布式架构,不同应用之间有业务关联的部分要怎么处理?
邓志国
这个我的一些方法可以参考,在项目开始,大家群策群力,把业务里面的名词都找出来,包括角色的名词,各种业务的名词,当你名词都找出来,业务领域也就冒出来了。
比如商品库存和订单,这在领域上应该是2个业务领域。但是订单发货要修改单据状态并减去库存,这个在DDD里该怎么做呢
21:14
邓志国
这个通过防腐层来做。比如在订单的业务领域,声明一个扣除库存的接口,然后在上层业务中,实现这个接口,并通过调用库存领域来实现。
定义一个发货领域吗?
邓志国
邓志国
我举个例子
邓志国
我在Lock的领域,有时候需要用到用户信息,需要获取用户姓名,那么我声明一个接口。
邓志国
然后在应用中,我实现了这个接口,通过调用User领域来实现。
这里的userContact 对于lock来说是个值对象?
邓志国
也不是,只是不是Lock里面的实体,是Lock需要从外部获取的信息。
21:20
那事务处理也在防腐层做?
邓志国
是的
邓志国
邓志国
比如这样
邓志国
除非你有特殊的事务需求,也可以在实现层做
邓志国
Facade、实现层,都可以做事务
用分布式事务还是什么来实现呢?
邓志国
这个就看情况了,如果你是通过共享库的单体应用,直接可用数据库本身事务
邓志国
如果你是分布式的应用,那么就需要分布式事务了。
21:24
邓志国
一般情况下,我不建议着急上微服务,微服务带来的代价,很多情况下多于好处。
邓志国
https://github.com/bobdeng/tenant 一个公租房租户的业务领域以及实现
邓志国
欢迎指正
21:40
邓志国
这是我目前关于DDD和TDD的领悟,欢迎批评指正。
时间到,今天我们的正式分享到此,非常感谢@邓志国 老师的精彩分享和@所有人 的积极参与。大家还可就此话题随意交流。如有人愿意做群专题分享,请联系我(微信glenwangcn,新朋友备注:真北敏捷)
如有收获,请对邓老师赞赏支持。