DDD中的“领域模型”
大家好,欢迎来到小蒋的技术圈。上次跟大家聊到了领域驱动设计,也叫DDD。分享了“美团点评业务系统”他们用DDD到底解决什么样的痛点。领域驱动设计,听这个名字,“领域”肯定在整个体系中占据主导地位。那DDD中提到的“领域模型”是什么?和我们传统软件设计中以及UML中的领域模型有什么关系?今天小蒋准备和大家一起聊聊看。下面我们开始吧。
在网上搜索领域模型,有大量的文章。一种是来源于最初的传统软件开发过程,一种来源于领域驱动设计(DDD)。在传统软件开发中,软件设计师通常使用UML语言进行系统建模,里面也在强调领域模型的重要性,这两者很容易混淆。我给大家找到了一些资料,先来看看传统软件开发中,领域模型是什么。
领域模型是什么?
理论派观点:
- Domain Model 是一个商业建模范畴概念,即使一个企业不开发软件,也具备其业务模型;
- 所有同行企业,其业务模型必定有非常大的共性和内在的规律性。
- 由行业内的各个企业的业务模型再向上抽象出整个行业的业务模型,这个模型称之为“领域模型”。
实战派观点:
- 领域模型是有一个分析模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物,与问题域相关。
- 是需求分析人员与用户交流的有力工具,是彼此交流的语言。
领域模型作用?
理论派
领域模型是一种特殊业务模型,作用是:
- 帮助分析理解复杂业务领域问题。
- 行业内沟通、交流。
实战派
领域模型作用:
- 分析如何满足系统功能性需求。
- 指导项目后续的系统设计。
业务模型作用:
- 帮助系统需求人员理解客户公司业务,下一阶做需求以业务模型为输入得到系统用例。
领域模型与业务模型的区别?
理论派
- 领域模型是一种特殊的业务模型,所以具备业务模型的所有特点,但是比业务模型更抽象、更通用。
实战派
- 产出阶段不同
业务模型是在软件开发过程中业务建模阶段产生,领域模型是在分析阶段产生。
- 作用不同
业务模型是系统需求人员理解客户公司业务的产物,下一阶段需求将以业务模型输入得到系统需求。
领域模型是系统分析人员分析如何满足系统功能性需求的产物。下一阶段软件设计将以领域模型为输入。
“实战派”举例说明:
当接到项目,需要做一个酒店预订系统,首先先入业务建模,了解客户公司酒店管理的相关 业务,这就会产出业务模型,此时业务模型里除了酒店预订这个业务环节还包括其他与酒店预订同层次的业务环节。
接下来将视线聚焦到酒店预订,改进已有流程得到酒店预订系统需求,也就是系统用例和需求规约。
接下来通过分析系统用例和需求规约,分析如何满足酒店管理系统功能性需求,从而得到领域模型。
从上面例子描述上看到,“理论派”和“实战派”的领域模型是两个范畴的东西,一个更关注业务,一个更关注软件实现。若没有分清肯定会引起理解混乱。
另一种“领域模型”—领域驱动设计(Domain-Driven Design)
还有一种“领域模型”,它出自于埃里克·埃文斯(Eric Evans) 的领域驱动设计,简称DDD,DDD是一套综合系统分析和设计的面向对象建模方法,所以要明确区分传统软件开发中的领域模型和领域驱动设计中的“领域模型“。失血模型、贫血模型、充血模型这些类概念都属于DDD范畴的“领域模型”。
两种领域模型的区别
本文中“领域模型”都代表领域驱动设计中的领域模型。
- 解决的核心问题不同
正如刚刚前面提到的,领域模型是一个用于分析业务的分析模型,在实际项目中要解决的核心问题:
- 如何满足待开发系统的业务功能需求。
而DDD中“领域模型”是综合分析与设计的模型,要解决的核心问题是:
- 保证系统设计能满足项目多变的需求。
在传统的软件开发流程中,分析(系统需求分析)和设计(系统设计)被划分为两个阶段,分别对应国家“系统分析师”和“系统设计师”两种职称,这种割裂的结果导致,“系统设计师”要基于“系统分析师“需求分析分析的结果做系统设计,然后才能进行编码,这中间会存在信息上的丢失或失真,并且实际过程中业务需求会变,这个变化可能是外界环境的变化或者对业务有更深的理解引起,就更容易引起系统设计与项目需求脱节。埃里克·埃文斯(Eric Evans)提出的DDD思想就是想解决业务与设计被割裂这样的问题。
- 领域不同
领域模型是业务分析模型,分析的是系统功能性需求所反映出的核心业务,软件系统只是实现业务的方式而非业务的一部分(提供IaaS服务的公司除外),不会考虑系统设计IT领域里的问题。
而DDD中的“领域模型”是综合分析和设计的模型,涉及到系统设计,需要思考系统的边界,故该模型所分析设计的领域是综合了业务领域和IT领域。
以酒店预订系统为例,其业务描述如下:
- 所有用户都可以通过酒店订房管理系统查看酒店客房信息
- 用户如需预订需先注册成会员
以上涉及两个对象:用户、会员。
若做业务分析,第一段描述中的“用户”可能就要考虑,究竟这些“用户”是游客呢,还是企业客户。哪种“用户”是主要客户源,如何针对这些“用户”做针对性的服务,以便更加有力的吸引“用户”预订酒店客房。
若要考虑系统设计,那第一段描述中的“用户”可能就会忽略,即不在系统边界范围内。只需要要提供“客房查询”功能即可。
- 使用的阶段和岗位不同
领域模型是分析业务的分析模型,在实际项目中主要由系统分析师在分析阶段中使用。
DDD的“领域模型”是综合分析、设计的模型,在实际项目中横跨分析和设计两个阶段,岗位需要具备“系统分析师”和“系统设计师”的综合能力。
为什么要区分,不能混淆?
- 包含的内容不同
领域模型主要内容:
- 业务实体
- 业务实体之间关系
DDD的“领域模型”主要内容:
- 业务实体
- 业务实体属性
- 业务实体之间关系
- 服务
- 服务与实体之间的关系
- 总结
领域模型分理论派和实战派,理论派属于商业范畴不属于软件开发范畴,软件开发过程不用理会理论派,切忌相互混淆。
实战派认为领域模型是一种分析模型,用于分析理解复杂的业务领域问题,具体到软件开发过程中,就是在分析阶段分析如何满足系统功能性需求。
同时在软件开发范畴还有来自于DDD的“领域模型”,这是一种综合分析与设计一体的模型,不仅仅注重需求分析与还更关注系统设计、系统需求的衔接,它要求设计出系统与需求要有较好的一致性,所以针对合理的需求变化也更具有良好的扩展性。
这样一对比,领域驱动设计中的“领域模型“就好理解的多了,它的领域模型关注的不仅是业务,还更关注怎么把业务和设计如何有机的结合起来。
好的,以上就是今天的分享。下次来聊聊传统的领域模型与领域驱动设计中的“领域模型“都是如何设计系统的,他们分别都有什么优缺点。
音频下载地址:https://download.csdn.net/download/wei_wei10/12100999
(审核完成后,可下载)
DDD中的“领域模型”相关推荐
- DDD中的聚合和UML中的聚合以及组合的关系
UML: 聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在. 如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯 ...
- 商品领域ddd_为 Gopher 打造 DDD 系列:领域模型-资源库
前言: 作为领域模型中最重要的环节之一的Repository,其通过对外暴露接口屏蔽了内部的复杂性,又有其隐式写时复制的巧妙代码设计,完美的将DDD中的Repository的概念与代码相结合! Rep ...
- 深入理解DDD中的聚合
本文来说下领域驱动设计中的聚合 文章目录 概述 聚合解决的核心问题是什么 聚合划分的原则 生命周期一致性 问题域一致性 场景频率一致性 尽量小的聚合 实现方面的考虑 资源库.工厂面向聚合定义 代码结构 ...
- ddd java repository_初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- DDD 中的几个困难问题
领域到底是什么? 对领域这个词的理解就是 DDD 入门的第一个难关.我们有时会被客户问到,领域到底是什么?首先要清晰地知道领域是什么,才能划分核心域.支撑域和通用域.换句话说,构成领域的要素是什么呢? ...
- DDD中的建模方法有哪些
一.背景 在之前的文章中已经介绍了DDD相关的概念模式,DDD相关的业务技术架构,但是我们还没有找到一个核心的抓手去实践DDD.DDD的一个核心本质就是对业务建模,或者领域建模.说的很简单,但是做好确 ...
- DDD专栏4:DDD如何保护领域模型
04.DDD如何保护领域模型 上一讲中,我们已经提到了领域服务.实体和值对象的重要性,基于这些基础对象,就能够形成一个基础的领域模型.我们对这个领域模型进行一些贫血模型和充血模型的设计,就能搭建出 ...
- ORM中的Model与DDD中的DomainModel
0.引言 在现有的系统开发中,大部分的系统应该都会用到ORM,无论用的是EF还是NHibernate.作为对象和持久化数据的桥梁,ORM确实非常方便,以至于在DDD的时候,我们很自然的将 ORM中的M ...
- 关于DDD中Domain的思考
2019独角兽企业重金招聘Python工程师标准>>> 本文既不推销UML,也不推广DDD,更不涉及各种论战.-- 作者 某天又一次打开关于DDD(领域驱动设计)的PDF文档时,自己 ...
- 1.DDD中的领域对象、值对象、聚合根
一.DDD中的领域对象.值对象.聚合根 参考地址: DDD-快速理解聚合根.实体.值对象的区别和联系_王瑞学习笔记-CSDN博客聚合根.实体.值对象的关系:1.实体具有ID,生命周期,状态用值对象描述 ...
最新文章
- 如何将DynamoDB的数据增量迁移到表格存储
- hdu 5591 ZYB's Game 博弈论
- 【组合数学】组合存在性定理 ( 三个组合存在性定理 | 有限偏序集分解定理 | Ramsey 定理 | 相异代表系存在定理 | Ramsey 定理内容概要 )
- [转]双线性插值(Bilinear interpolation)
- 【英语学习】【WOTD】cacophony 释义/词源/示例
- linux下.so、.ko、.a的区别
- 英语语音识别_英语 语音识别_英语语音识别软件 - 云+社区 - 腾讯云
- Eclipse里面导工程的时候报错faceted project problem
- 运输层详解(二)(TCP)
- Linux下用客户端连接校园网
- 三菱plc与西门子plc编程有什么不同?
- Cisco CCNA考试题库大全
- java并发包和类总结-JUC总结
- Cousera - Deep Learning - 课程笔记 - Week 6
- html版本绩拼音怎么写,绩这个字怎么读、绩怎么念、绩怎么拼音、绩怎么组词...
- 五项python小游戏代码测试
- u盘插到电脑计算机里没有反应,U盘插在Windows7电脑上没反应怎么办?
- 国产存储芯片,emmc,性能强
- C++实现Socket连接通信
- 电容旁路(bypass)和去耦(decoupling)的区别
热门文章
- 【Linux】Infiniband 驱动安装---(HCA光钎)---mlnx
- ps4如何设置虚拟服务器,PS5官方使用指南 账号设置/PS4传输数据/调整主机设定
- 久违了,我的baby!
- DES加密解密Delphi、C#互通
- ls命令显示颜色含义详解
- ContextCapture空三后像控点颜色含义
- 连载]第四讲 测量准确度、重复性、复现性及标准偏差
- java泊松分布随机数,C语言生成泊松分布随机数
- 或许你一辈子都是个小人物
- 斗鱼弹幕服务器第三方接入协议v1.6.2,.NET斗鱼直播弹幕客户端(上)