没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
DDD 之最佳借鉴
本次分享既不是 DDD 理论也不是 DDD 实战,而是如何更好的理解借鉴架构和设计发
展进化过程中的思想,通过学以致用,真正提升架构和设计水平,写出更好的代码。
引文
很多人会问或者探究“什么是好的架构或模式”,对于这个问题我认为是没有答案
的。我们要提升自己的思想、理念、能力或技巧,应该思考“什么是不好的架构或模
式,以及如何提升及改进,以应对系统的复杂度不断提升的挑战。
系统的复杂度的成因及应对
业务复杂度:业务需求带来的复杂度
技术复杂度:质量、效率、扩展性、兼容性、高性能、高并发、高可用等需求带来的
复杂度
规模:通过分而治之控制规模
结构:使用分层隔离技术复杂度和业务复杂度,形成清晰的边界
变化:顺应变化方向,以领域为核心建模响应变化(变化的速率、原因和特征)
预测:防止过度设计或设计不足
业界已有一个共识,那就是“通过组件化完成关注点的分离从而降低局部复杂度”。
其实现在我们用的容器、中间件、MQ、数据库等,在某种意义上都是组件化的产
物。而 DDD 以将“领域”放在核心地位的设计方法来应对复杂度。
什么是 DDD
一种思想和方法论。
主要是想是技术主动理解业务。业务如何运行,系统就如何构建,让不懂技术语言的
领域专家参与项目建设。Sap 之类的套装软件,输出的不光是软件功能,还包含业务
流程、管理思想,甚至组织结构,是典型的业务向技术靠拢。而 DDD 正好相反,是
技术向业务靠拢。
DDD 的核心是模型驱动设计,而这个模型即为领域模型。下图为领域驱动设计元模
型。
从上图可以看出,为了保证领域模型在不同的上下文能表达各自的知识语境和确定业
务的自制边界,引入了限界上下文。为了解决多个多个限界上下文之间的协作关系,
引入了上下文映射。
由此,本文探讨的重点就是:
限界上下文的内部架构什么样?
建模阶段是否还能进一步优化?(DCI)
限界上下文之间的关系如何解决?
不同限界上下文团队之间协作关系?
解决什么问题
随着业务的增加,系统也因“不断老化”而引发需求难、开发难、创新难、测试难等
问题。将系统拆分为微服务可在一定程度上缓解,但微服务的继续膨胀如何继续拆
分?
DDD 被认为是目前最为理想的方式。上到战略下到功能模块,都有完整的理论体系。
需求难:系统越来越复杂,多次迭代后,新需求的加入越来越难。最终会引出业务到
底是谁懂的问题。
开发难:祖传代码,各种代码混杂动辄上前行,不敢删不敢动
创新难:应用新技术甚至需要完全重构
测试难:单元测试需要各种基础依赖,无法 mock
误区
《领域驱动设计》一书的作者 Eric Evans,自己也认为:“如果在推行领域驱动设计
时照本宣科的使用本书,这就不太光彩了!”。
只要不违背核心原则,完全可以按照对它的理解,领会它的精髓,结合自身在项目中
的实践来扩展补充整套的方法论。
照本宣科 生搬硬套 牵强附会
指导思想
高内聚、低耦合
限界内高内聚、限界间低耦合
单一职责
一个类应该只有一个引起它变化的原因
单一抽象层次
同一分层的组件处于同一抽象层次
依赖倒置
面向接口而不是面向实现,高层模块不应该依赖于低层模块,两者都应该依赖于抽
象。 抽象不应该依赖于细节,细节应该依赖于抽象。对高层模块而言,低层模块是可
替换的,高层模块是可以单独编译的
正交四原则
消除重复 分离关注点 减小不必要依赖 向着稳定的方向依赖
从一次代码优化说起
UserStory:As a 用户,I want to 发送和接收红包,So that 实现有特殊含义的转
账。
需求:发红包 发送方-Sender 接收方-Receiver
流程:
1、查询 Sender 信息,判断余额。
2、查询 Receiver 信息。
3、调用风控服务
4、计算余额完成转账并持久化
5、发送消息用于审计和风控运算
涉及到:数据库、微服务和消息
Java
// 账户实体
public final Account{
private Long accountId;
private Integer balance;
// getter and setter
}
Java
public class AccountController{
private final IAccountService accountService;
@Inject
public AccountController(AccountService accountService){
this.accountService = accountService;
}
public void redPacket(Long senderId,Long receiverId,Integer amount){
this.accountService.redPacket(senderId,receiverId,amount);
}
}
Java
public class AccountServiceImpl implements IAccountService{
private final IAccountDao accountDao;\\ 数据库
private final IRiskFeignService riskService;\\ 微服务
剩余41页未读,继续阅读
资源评论
W如Q扬
- 粉丝: 3
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功