领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示。领域模型也称为概念模型、领域对象模型和分析对象模型。

——《UML和模式应用》

我们在日常开发中,经常针对一些功能点争论“这个功能不应该我改,应该是你那边改”,最终被妥协改了之后都改不明白为什么这个功能要在自己这边改。区别于传统的架构设计,领域驱动设计(DDD)也许在这个时候能帮助你做到清晰的划分。

什么是DDD

领域驱动设计最初由Eric Evans提出,但是多年以来一直停留在理念阶段,真正能实现并且落地的项目和公司少之又少,而进来阿里内部其实在大力推行DDD的理念,它主要可以帮助我们解决传统单体式集中架构难以快速响应业务需求落地的问题,并且针对中台和微服务盛行的场景做出指导。

DDD为我们提供的是架构设计的方法论,既面向技术也面向业务,从业务的角度来把握设计方案。

DDD的作用

统一思想:统一项目各方业务、产品、开发对问题的认知,而不是开发和产品统一,业务又和产品统一从而产生分歧。

明确分工:域模型需要明确定义来解决方方面面的问题,而针对这些问题则形成了团队分钟的理解。

反映变化:需求是不断变化的,因此我们的模型也是在不断的变化的。领域模型则可以真实的反映这些变化。

边界分离:领域模型与数据模型分离,用领域模型来界定哪些需求在什么地方实现,保持结构清晰。

DDD的概念

实体

有唯一标志的核心领域对象,且这个标志在整个软件生命周期中都不会发生变化。这个概念和我们平时软件模型中和数据库打交道的Model实例比较接近,唯一不同的是DDD中这些实体会包含与该实体相关的业务逻辑,它是操作行为的载体。

值对象

依附于实体存在,通过对象属性来识别的对象,它将一些相关的实体属性打包在一起处理,形成一个新的对象。

举个栗子:比如用户实体,包含用户名、密码、年龄、地址,地址又包含省市区等属性,而将省市区这些属性打包成一个属性集合就是值对象。

聚合

实体和值对象表现的是个体的能力,而我们的业务逻辑往往很复杂,依赖个体是无法完成的,这时候就需要多个实体和值对象一起协同工作,而这个协同的组织就是聚合。聚合是数据修改和持久化的基本单元,同一个聚合内要保证事务的一致性,所以在设计的时候要保证聚合的设计拆分到最小化以保证效率和性能。

聚合根

也叫做根实体,一个特殊的实体,它是聚合的管理者,代表聚合的入口,抓住聚合根可以抓住整个聚合。

领域服务

有些领域的操作是一些动词,并不能简单的把他们归类到某个实体或者值对象中。这样的行为从领域中识别出来之后应该将它声明成一个服务,它的作用仅仅是为领域提供相应的功能。

领域事件

在特定的领域由用户动作触发,表示发生在过去的事件。比如充值成功、充值失败的事件。

四种模式

失血模型

模型中只有简单的get set方法,是对一个实体最简单的封装,其他所有的业务行为由服务类来完成。

@Data
@ToString
public class User {private Long id;private String username;private String password;private Integer status;private Date createdAt;private Date updatedAt;private Integer isDeleted;
}
public class UserService{public boolean isActive(User user){return user.getStatus().equals(StatusEnum.ACTIVE.getCode());}
}

贫血模型

在失血模型基础之上聚合了业务领域行为,领域对象的状态变化停留在内存层面,不关心数据持久化。

@Data
@ToString
public class User {private Long id;private String username;private String password;private Integer status;private Date createdAt;private Date updatedAt;private Integer isDeleted;public boolean isActive(User user){return user.getStatus().equals(StatusEnum.ACTIVE.getCode());}public void setUsername(String username){return username.trim();}
}

充血模型

在贫血模型基础上,负责数据的持久化。

@Data
@ToString
public class User {private Long id;private String username;private String password;private Integer status;private Date createdAt;private Date updatedAt;private Integer isDeleted;private UserRepository userRepository;public boolean isActive(User user){return user.getStatus().equals(StatusEnum.ACTIVE.getCode());}public void setUsername(String username){this.username = username.trim();userRepository.update(user);}
}

胀血模型

service都不需要,所有的业务逻辑、数据存储都放到一个类中。

对于DDD来说,失血和胀血都是不合适的,失血太轻量没有聚合,胀血那是初学者才这样写代码。那么充血模型和贫血模型该怎么选择?充血模型依赖repository接口,与数据存储紧密相关,有破坏程序稳定性的风险。

建模方法

用例分析法

用例分析法是领域建模最简单可行的方式。大致可以分为获取用例、收集实体、添加关联、添加属性、模型精化几个步骤。

  1. 获取用例:提取领域规则描述

  2. 收集实体:定位实体,

  3. 添加关联:两个实体间用动词关联起来

  4. 添加属性:获取实体属性

  5. 模型精化:可选的步骤,可以用UML的泛华和组合来表达模型间的关系,同时可以做子领域的划分

四色建模法

四色建模法源于《Java Modeling In Color With UML》,它是一种模型的分析和设计方法,通过把所有模型分为四种类型,帮助模型做到清晰、可追溯。

简单来说,四色关注的是某个人的角色在某个地点的角色用某个东西的角色做了某件事情。

事件风暴法

事件风暴法类似头脑风暴,简单来说就是谁在何时基于什么做了什么,产生了什么,影响了什么事情。

架构分层

区别于左图传统架构的分层,一般DDD分层会有一些变化。

Application:包含事件注册、业务逻辑等

Domain:聚合、实体、值对象

InfraStructure:基础设施封装、数据库访问等

总结

DDD是一套完善的方法论,他能帮助我们合理的对系统进行架构设计,同时,好的模板应该是在不断的适应变化,而DDD也能帮助我们更快速更方便的支撑业务的发展。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

面试官:谈一下你对DDD的理解?我:马什么梅?相关推荐

  1. 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)

    title: 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) tags: 面试常见题 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) 腾讯面试题:创建索 ...

  2. 面试时,不知如何和面试官谈期望薪资

    有这样一个案例,某知名互联网公司,IT开发技术部预算招一位高级软件工程师,薪资范围15-25K. 来了很多应聘者. 部门经理安排了一位刚提升为leader负责人,去面试求职者,其中有一位应聘者,lea ...

  3. 面试时,不知如何和面试官谈期望薪资,不妨看看这篇文章

    有这样一个案例,某知名互联网公司,IT开发技术部预算招一位高级软件工程师,薪资范围15-25K. 来了很多应聘者. 部门经理安排了一位刚提升为leader负责人,去面试求职者,其中有一位应聘者,lea ...

  4. 岗位理解_当面试官问求职者对应聘岗位的理解情况

    虽然求职是看的是岗责是否匹配自己的经历和能力,但是很多面试官还是会问这样的问题.对于求职者来说,对岗位的理解其实就是把岗位职责背一遍,但是面试官既然问了,就要说出一些其他内容来.想回答好这个问题,就要 ...

  5. 面试官:给我说一下你理解的分布式架构

    转载自  面试官:给我说一下你理解的分布式架构 # 什么是分布式架构 分布式系统(distributed system) 是建立在网络之上的软件系统. 内聚性:是指每一个数据库分布节点高度自治,有本地 ...

  6. 精选(26)面试官:讲讲你对ThreadLocal的理解

    前言 在面试环节中,考察"ThreadLocal"也是面试官的家常便饭,所以对它理解透彻,是非常有必要的. 有些面试官会开门见山的提问: "知道ThreadLocal吗? ...

  7. 面试官谈游戏开发入行--技术准备

    [前言:笔者在腾讯北极光工作室群工作,也做客户端通道面试有段时间了,希望写一些能够帮助有志于开发游戏的同学能够更好地入行.] 接上一篇文章,当我们选择进入行业,并尽早开始去做,接下来是一系列的准备. ...

  8. 面试项目亮点_当面试官谈到项目经验的时候,你知道怎么回答吗?怎么反过来控制面试流程?...

    如何在面试中介绍自己的项目经验 在面试时,经过寒暄后,一般面试官会让介绍项目经验 .常见的问法是,说下你最近的(或最拿得出手的)一个项目. 根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴 ...

  9. 日企面试官谈赴日开发工作

    如果不是被自己的公司派驻到日本,靠个人赴日开发工作有以下几种方式. 一,语言完全没有问题的话可以自己联系企业.但是大多数日本企业都比较保守,不擅长与国外求职者直接沟通.希望有第三方(人才公司)做担保才 ...

  10. 跟面试官谈【线程池】

    目录 What? Why? 分类? 1. newCachedThreadPool 1.1.what? 1.2 代码实例 1.3 执行结果 1.4 源码分析 1.5 缺点 2.newFixedThrea ...

最新文章

  1. python编程入门到实践答案-Python编程:从入门到实践
  2. 安卓应用安全指南 4.4.3 创建/使用服务高级话题
  3. python怎么把所有标点符号置空_Python从小白到攻城狮(1)——python环境搭建
  4. 163 coremail_Icoremail企业邮箱
  5. 机器学习与Scikit Learn学习库
  6. 支付宝回应老年版相互宝质疑:5万、10万互助金额度是合理区间
  7. Halcon标定系列(3):我个人总结的“眼在手外“和“眼在手上”的心得笔记
  8. 产品配件类目税目分类_HS编码知识:汽车零部件怎么归类?
  9. 计算机英语知识竞赛题库,大学生计算机基础知识竞赛题库_大学生计算机基础知识竞赛试题附答案...
  10. scv文件单元格内存在换行符
  11. lingo与matlab转换,请教lingo与matlab
  12. 视频拍摄和剪辑经验分享|南京
  13. 一张图掌握产品经理绩效考核表实例
  14. tplink怎么进去_手机怎么进入tplink路由器设置界面?
  15. python 还原九宫格图片_python生成九宫格图片
  16. python是一种解释型、面向什么的计算机程序设计语言_python语言是一种什么类型...
  17. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
  18. 吴恩达老师DeepLearning系列课程最详细学习笔记之4—为什么深度学习会兴起?
  19. apache实现文件上传服务器,使用Apache的Fileupload工具实现文件上传
  20. 本周票房大盘 API数据接口

热门文章

  1. 嵌入式自学多久可以找工作?应届生找嵌入式工作难吗?
  2. 图论-有向图的连通性模板题(hdu1296)(hdu1827)
  3. 可持久化普通线段树 ---- P2839 [国家集训队]middle 可持久化普通线段树 + 二分 求中位数最大值
  4. 树上问题 ---- Codeforces Round #722 (Div. 1) C. Trees of Tranquillity [dfs序区间的性质+最大不相交区间的性质]
  5. 如何实现java虚拟机的优化_Java虚拟机JVM优化实战的过程全记录
  6. P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)
  7. 最小生成树(Kruskal )
  8. android系统休眠发广播,Android - BroadcastReceiver
  9. 汇编语言求无符号数组中出现的次数最多数_【今日最佳leecode通俗易懂】无重复字符的最长子串...
  10. jsessionid和jwt_JWT与Session的比较