关于ddd:谈谈代码DDD从入门到完全入门

47次阅读

共计 1866 个字符,预计需要花费 5 分钟才能阅读完成。

本文首发于泊浮目标简书:https://www.jianshu.com/u/204…

版本日期备注
1.02021.8.22文章首发

之前的 DDD 文章——谈谈代码:升高复杂度,从放弃三层架构到 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 的核心思想

核心思想是让技术复杂度与业务复杂度隔离,并通过对立语言组织业务逻辑,升高认知老本。

具体次要体现在:

  • 基础设施层:它负责隔离技术复杂度,通过形象封装来对内提供服务,而不是让外部服务间接应用它。
  • 厚畛域层:同一畛域的常识聚合在一个畛域中,畛域常识不再被割裂。
  • 实体:用充血模型代替贫血模型,完全符合面向对象的思维。将业务中的对象齐全投射到实体中。

4. DDD 能解决什么样的问题

个别软件会经验几个不同的周期:

  1. 大烟囱:每个利用各自为政,相似的需要反复开发,节约人力
  2. 服务化:依据不同的业务属性拆分服务。关注服务拆分、服务治理、模型形象
  3. 平台化:将相干的微服务同一成一个平台裸露进去。关注畛域收敛、畛域自治、能力积淀
  4. 中台化:将通用能力下沉至中台,疾速响应前端服务。须要关注数据买通、能力串联、业务响应力

DDD 次要在 技术密集型利用里有较大的作用,尤其是当该利用进入服务化、平台化时,能够在:“服务拆分”、“服务治理”、“畛域收敛”、“畛域自治”施展。在中台化中的“数据买通”也有肯定的作用。

而宏观来说,DDD 能够无效缩小代码的冗余水平以及需要响应的速度。

5. DDD 实际中要留神的

5.1 应用 IOC 来保障档次之间的隔离

常常有小伙伴问我,分层之间该怎么做?因为分层的边界没做好,代码会再度耦合再一起。对此我给出的答案是参考inversion of control。其常见实现有:

  • Object Dependency Inject
  • Service Provider Interface
  • Strategy
  • Abstract Factory

也能够参考我之前写的文章:技巧:遵循 Clean Architecture 写好白盒测试。

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 的做法来,业务逻辑应该与具体的界面无关——比方界面上的一个按钮(数据模型)会触发一种事件,当后盾的事件接受者收到这个事件时,则会寻找相应的执行者,执行对应的逻辑。

在这外面:

  • 界面能够是 Qt,能够是 Flex,能够是 Ios,能够是 Android,也能够是 Vue。其本质是用户接口层。
  • 后盾的事件接受者是根底层。
  • 具体的执行逻辑则放在畛域层。
正文完
 0