大家好,我叫大鸡腿,大家可以关注下我,会持续更新技术文章还有人生感悟,感谢~

文章目录

  • 前言
  • 目的
  • 概念
  • Domain Primitive
  • DDD分层
    • 按照个人见解画的分层图
  • 参考博客

前言

这段时间学习了一波ddd,整体下来的感受,现状是业务冗余,业务代码都写在一起很混乱,在复杂业务的时候不方便管理、扩展。
代码设计原则里面就有高内聚,低耦合的原则,ddd其实就是为了实现这想法的。

目的

ddd为了实现高内聚,低耦合的作用,减少每一层的耦合,这样不会互相影响,也方便后续扩展

概念

  1. 领域:领域是相对于业务领域,或者问题域,范围概念。一个领域会包含多个子域,比如说订单域,会有商品、订单等等子域
  2. 限界上下文:既然有范围,那么就有边界,领域之间靠context上下文来进行通讯
  3. 实体、值对象:实体对应PO,值对象,在实体基础上会加上其他属性
  4. 聚合,聚合根:对实体、值对象会进行聚合,聚合根,可以通过这个访问内部实体的东西,不会直接操作跟内部实体
  5. 防腐层 ACL:限界上下文处理外界上下文的时候,需要做业务处理

贫血模型
里面只有属性,但是它的校验、属于它方法放在外面。违反单一原则,封装性比较差的

充血模型
里面包括属性,以及对应的方法实现。这样的好处,开闭原则,以后扩展的话在类里头新增方法。放在外面去做的话,其实是修改,应该减少修改的情况

Domain Primitive

在很多业务中,我们面向过程,比如说一个方法(String,String) 参数,他就会有前后顺序,分别代表什么
如果我们把它封装成对象的话,可以减少这样的问题。

原则

  1. 隐形概念显式化 比如说聚合根,对于一个东西,它有唯一的标识。如果是前者的话,可以是name,phone等等做标识
  2. 隐式上下文显式化
  3. 封装多对象

这就是为什么有很多值对象,聚合根,entity,其实是为了封装对应类,以及相关的方法,符合开闭原则

DDD分层


经典ddd分层的就四层:

接口层、应用层、领域层、基础层

接口层:面向接口,controller
Application 属于编排,就是其他层都封装各自小单元类,他们执行的顺序由应用层来处理
应用层:面向用例,就是会管理各个领域的调用关系,比如说校验完->A领域->B领域
领域层:有领域服务,以及对应子域。处理该领域的业务逻辑
基础层:处理数据库、缓存、第三方等等

依赖倒置分层
domain层都是接口,而基础设施层则实现domain接口

有没有想过为啥这么设计?
我们很多框架都强依赖第三方框架,比如说mybatis、mq等等中间件
那么它有什么坏处呢?就是当我换其他组件的时候,会改很多东西

domain层设计成接口的好处,就是具体实现不会强依赖其他组件,随时可以另外实现

domain 包含内容 描述
Repositity 映射mapper以及扩展,避免强依赖底层
ACL 防腐层,处理跟外部不一样的东西,比如说协议、api、缓存

洋葱架构以及六边形架构,多了适配器

按照个人见解画的分层图

参考博客

阿里淘系有几讲,非常好的介绍以及有案例

  • DDD系列第五讲:聊聊如何避免写流水账代码

个人看法
在一讲的时候真的为啥要封装那么类,封装性,以及测试性比较好。
二讲是针对依赖倒置的情况做解释,也就是避免强依赖其他组件,
三讲Repositity,这里发表个人看法:我觉得我们在系统设计的时候,应该避免过度设计。比如说mybatis plus其实已经实现很多功能,你再封装一个Repositity,很多接口都得重新写。然后一些小项目,很少去改变底层依赖,所以我觉得看菜下饭

  • DDD 实战课
  • 领域驱动设计在互联网业务开发中的实践
  • DDD 领域驱动模型设计中的分层架构

DDD 基础知识扫盲篇相关推荐

  1. 理财投资 之 基金投资 - #1篇:基金基础知识扫盲

    目录 基金基础 理财干货 理财百科 基金基础 1.基金基础知识扫盲 理财干货 1.投资股票正确步骤 :分散投资.匆赌匆盲从.匆追涨杀跌.长期持有.选择性定投 ①掌握投资底层逻辑 ②海选好公司 ③精选出 ...

  2. SQL 基础知识扫盲

    文章目录 SQL & 数据库基础知识扫盲 SQL是什么? 数据库是什么? 挺身入局,实践出真知 DBMS初体验 MySQL:初体验 Oracle:初体验 PostgreSQL:初体验 Demo ...

  3. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  4. JavaScript 基础知识 - DOM篇(二)

    7. 节点操作 7.1 节点的属性 节点分类: 标签节点 文本节点 属性节点 注释节点 节点常用的属性: nodeType:节点的类型 nodeName:节点名称 nodeValue:节点值 常见的节 ...

  5. JavaScript 基础知识 - 入门篇(二)

    11. 函数 11.1 函数的基础知识 为什么会有函数? 在写代码的时候,有一些常用的代码需要书写很多次,如果直接复制粘贴的话,会造成大量的代码冗余: 函数可以封装一段重复的javascript代码, ...

  6. SQL数据库基础知识-巩固篇一

    SQL数据库基础知识-巩固篇<一>... 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用了> MySQL-57 D ...

  7. 《火球——UML大战需求分析》(第1章 大话UML)——1.1 UML基础知识扫盲

    说明: <火球--UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  8. 基础知识:篇4-make工具与Makefile文件概念

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  9. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

最新文章

  1. linux定时器多次,Spring 定时器执行两次
  2. list sort方法
  3. P1800 software_NOI导刊2010提高(06)
  4. shell中break的使用案例
  5. 02_pyplot.plot函数、回顾第一个例子、格式字符串、plot函数、线型风格字符、标记(marker)字符、颜色字符
  6. Python和单元测试那些事儿
  7. STM32的学习记录--单个模块开发思路
  8. 用户不在sudoers文件中,此事将被报告
  9. Win11如何自动关机 windows11自动关机的设置方法
  10. 第二章 关键数据结构
  11. qt调用SSDP协议
  12. 批量检查pdb数据库某些蛋白质的pdb文件是否存在
  13. ssoj1556土地购买
  14. python 爬虫获取商家信息_Python爬取商家联系电话以及各种数据的方法
  15. 吴裕雄--天生自然 诗经:琵琶行
  16. 直通车推广有哪些容易被忽略的地方
  17. 推荐几款实用的PDF文件压缩大小软件,还不快码住
  18. hiredis——Redis的C++库(使用教程
  19. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)
  20. 闲人闲谈PS之一项目库存跨公司业务STO解决方案--SAP闲人的开篇

热门文章

  1. django注册发送邮箱激活账号
  2. WLAN无法自动打开问题分析
  3. golang 内存分配
  4. 国家网络安全宣传周之代表厂商盘点——上海浪擎引领国内灾备产业发展潮流...
  5. 织梦list标签:解决重复显示文章列表
  6. File-String互转
  7. android刺激战场不卡机型,刺激战场什么手机可以开高画质 高清画质机型
  8. tp6发送邮件(qq邮箱)
  9. 记录 - 收货地址的坑
  10. 企业实战(6)修改Harbor镜像仓库默认存储路径