谈谈代码(DDD从入门到完全入门)
本文首发于 泊浮目的简书: https://www.jianshu.com/u/204...
版本 | 日期 | 备注 |
---|---|---|
1.0 | 2021.8.22 | 文章首发 |
谈谈代码:降低复杂度,从放弃三层架构到DDD入门
,通篇下来像 是简单的讲了一些概念,然后快速的实战一下——很多同学反馈感觉就是入门了,但没有完全入门,因此我们再加一篇。1.什么是DDD 先看下万能的维基百科:Domain-driven design (DDD) is the concept that the structure and language of software code (class names, class methods, class variables) should match the business domain. For example, if a software processes loan applications, it might have classes such as LoanApplication and Customer, and methods such as AcceptOffer and Withdraw.
这边将其称为了一个概念。在我看来DDD是设计模式的超集,一种指导思想——用来指导如何解耦业务系统,划分业务模块,定义业务领域模型及其交互。
2. DDD诞生的背景 领域驱动设计这个概念并不新颖,早在 2004 年就被提出了,到现在已经有十几年的历史了。不过,它被大众熟知,还是基于另一个概念的兴起,那就是微服务。因此在实现的时候样子不一定是一模一样的,更多时候还是根据业务场景来因材施教。
3. DDD的核心思想 核心思想是让技术复杂度与业务复杂度隔离,并通过统一语言组织业务逻辑,降低认知成本。
具体主要体现在:
- 基础设施层:它负责隔离技术复杂度,通过抽象封装来对内提供服务,而不是让内部服务直接使用它。
- 厚领域层:同一领域的知识聚合在一个领域中,领域知识不再被割裂。
- 实体:用充血模型代替贫血模型,完全符合面向对象的思想。将业务中的对象完全投射到实体中。
- 大烟囱:每个应用各自为政,类似的需求重复开发,浪费人力
- 服务化:根据不同的业务属性拆分服务。关注服务拆分、服务治理、模型抽象
- 平台化:将相关的微服务同一成一个平台暴露出来。关注领域收敛、领域自治、能力沉淀
- 中台化:将通用能力下沉至中台,快速响应前端服务。需要关注数据打通、能力串联、业务响应力
而微观来说,DDD可以有效减少代码的冗余程度以及需求响应的速度。
5. DDD实践中要注意的 5.1 使用IOC来保证层次之间的隔离
文章图片
经常有小伙伴问我,分层之间该怎么做?因为分层的边界没做好,代码会再度耦合再一起。对此我给出的答案是参考
inversion of control
。其常见实现有:- Object Dependency Inject
- Service Provider Interface
- Strategy
- Abstract Factory
5.2 模块分离 模块分离是一种较为“硬”的手段,它让分层不再是一个约定,而是强制执行的规则。这样当我们拆分微服务时候,也可以较快的完成拆分。
5.3 DDD并不是只有三层到四层 也有小伙伴问过我,转DDD的是否只有三层过来的?其实并非如此。我这边可以举两个例子:
5.3.1 流计算处理
我们以面向在线数据加密应用为例子:当一条数据流过我们的应用时,我们需要根据一些条件对其加密。
应用的基本流程为:
Source(from kafka) -> Map(encryption) -> Sink(to kafka)
。那么代码中,kafka其实是基础层的代码。而
encryption
属于领域层,map(框架)和encryption之间的胶水代码则属于基础层。5.3.2 GUI应用
相信大家都在学生时代学过GUI or HTML 编程。那么按照DDD的做法来,业务逻辑应该与具体的界面无关——比如界面上的一个按钮(数据模型)会触发一种事件,当后台的事件接受者收到这个事件时,则会寻找相应的执行者,执行对应的逻辑。
【谈谈代码(DDD从入门到完全入门)】在这里面:
- 界面可以是Qt,可以是Flex,可以是Ios,可以是Android,也可以是Vue。其本质是用户接口层。
- 后台的事件接受者是基础层。
- 具体的执行逻辑则放在领域层。
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 我在一条路上走了5年
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 《机器学习实战》高清中文版PDF英文版PDF+源代码下载
- 霍兰德职业代码对照表
- Hexo代码块前后空白行问题
- 前端代码|前端代码 返回顶部 backToTop
- 11-代码注入
- 代码不规范容易造成的bug