DDD理论学习系列(4)-- 领域模型
1.引言
我们还是先来拆词理解,领域模型可以拆为“领域”和“模型”二词。
- 领域:按照我们之前的文章的理解,DDD中的领域是指软件系统要解决的问题,如我们的办公设备公众号在线商城就是为了解决电商问题,对应的就是电商领域。
- 模型:百度百科解释为对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。如户型图就是实际房屋结构的模型。
把两个词结合起来,我们给领域模型下个定义:领域模型是对我们软件系统中要解决问题的抽象表达。
这个理解还是很生涩,没关系,容我娓娓道来。
2.领域模型的来历和作用
我们知道,软件开发过程主要包括:需求分析、概要设计、详细设计、编码、测试、软件交付、验收、维护。其实简单来说就是分析、设计和实现。
而传统的软件开发方式中,系统分析、设计和实现三个阶段完全脱节,最后开发出来的软件不能很好的满足业务需求,在未来也不能很好的适应需求变化进行功能演进。
那在DDD中是如何做到呢,下面我们就从以下几个问题来分析说明。
- 怎样确保最终的软件设计能满足客户需求且适应变化?
那就要保证系统分析、设计和实现不脱节。 - 那如何做到不脱节呢?
如果按照我的理解,那就需要有某一个东西能贯穿整个开发流程,来衔接分析、设计和实现三个阶段。 - 那这个东西是什么呢?
聪明如你,是的,就是我们今天的主题——领域模型。 - 那领域模型是如何做到的呢?
在分析阶段,所有的参与人员(领域专家、设计人员、开发人员等)对业务进行需求分析,通过大家的不断交流讨论,提取出业务规则和流程中的关键词汇和概念形成通用语言,进而发现领域概念,随着大家对领域的认识不断深入,通用语言的词汇也会不断丰富和精准,从而确保了业务需求的正确表达。
在设计阶段,以通用语言为交流基础,将发掘的领域概念进行领域模型设计,以面向对象的思想抽象出实体,确定实体所对应的方法和属性,以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式展现出来,形成领域模型。
在实现阶段,开发人员根据确立的领域模型进行代码实现,做到代码与模型的绑定,从而实现了设计和实现阶段的衔接。
通过这样一种方式,我们实现了语言、模型、代码三者紧密绑定,确保开发出来的软件来准确反应需求并能适应变化。
通过上面对领域模型的来历和作用的介绍,我们对领域模型就有了一个大致的印象。
3.案例分析
按照上面的理解,领域模型无非就是综合了系统分析和设计的产物,而这个产物我们正好可以通过UML来展示,下面我们就结合办公设备微信公众号在线商城案例,简单对销售子域进行领域模型设计。
从该销售子域的UML类图中,我们可以看出它包含了销售子域涉及到相关实体以及实体之间的关系。只要看到这个类图,我们就知道它涉及的相关概念和流程。所以说上面这张UML类图是销售子域的领域模型也不为过。
4.总结
领域反应的是我们业务上需要解决的问题,模型是我们针对该问题提出的解决方案。
综合来说,领域模型就是用来描述我们正在解决的问题和提出的解决方案。
领域模型按照我个人的理解,就是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式(比如UML、图形、代码、文字描述等)展现出来。
以上只是领域模型理论上的理解,但领域模型的设计(领域建模)却是另一个复杂的话题,择日再聊。
参考资料:
领域模型,你真的理解的了吗?
DDD领域驱动设计基本理论知识总结
What is the Domain Model in Domain Driven Design? | Culttt
DDD理论学习系列(4)-- 领域模型的更多相关文章
- DDD理论学习系列(5)-- 统一建模语言
DDD理论学习系列--案例及目录 1.引言 上一节讲解了领域模型,领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系.然后将这些 ...
- DDD理论学习系列(7)-- 值对象
DDD理论学习系列--案例及目录 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是strut和enum,引用类型的代表是class.interface.delega ...
- DDD理论学习系列(8)-- 应用服务&领域服务
DDD理论学习系列--案例及目录 1. 引言 单从字面理解,不管是领域服务还是应用服务,都是服务.而什么是服务?从SOA到微服务,它们所描述的服务都是一个宽泛的概念,我们可以理解为服务是行为的抽象.从 ...
- DDD理论学习系列(9)-- 领域事件
DDD理论学习系列--案例及目录 1. 引言 A domain event is a full-fledged part of the domain model, a representation o ...
- DDD理论学习系列(10)-- 聚合
DDD理论学习系列--案例及目录 1.引言 聚合,最初是UML类图中的概念,表示一种强的关联关系,是一种整体与部分的关系,且部分能够离开整体而独立存在,如车和轮胎. 在DDD中,聚合也可以用来表示整体 ...
- DDD理论学习系列(11)-- 工厂
DDD理论学习系列--案例及目录 1.引言 在针对大型的复杂领域进行建模时,聚合.实体和值对象之间的依赖关系可能会变得十分复杂.在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻 ...
- DDD理论学习系列(12)-- 仓储
DDD理论学习系列--案例及目录 1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译. 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一般由仓 ...
- DDD理论学习系列(13)-- 模块
DDD理论学习系列--案例及目录 1. 引言 Module,即模块,是指提供特定功能的相对独立的单元.提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合.对于简单问题,可以直接构建单一模块 ...
- DDD理论学习系列——案例及目录
目录 DDD理论学习系列(1)-- 通用语言 DDD理论学习系列(2)-- 领域 DDD理论学习系列(3)-- 限界上下文 DDD理论学习系列(4)-- 领域模型 DDD理论学习系列(5)-- 统一建 ...
随机推荐
- mui 页面间传值得2种方式
通过最近得工作开发刚接触mui框架,用到了页面间得传值, 第一种:通过url进行传值 父页面代码: mui.openWindow({ id:'子页面.html', url:'子页面.html?para ...
- Spring MVC执行原理
spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...
- script defer和async一探
今天几经折腾,终于回家了,最近公司上的事忙了好一阵子,终于可以闲下来,重新在整理一下,又重新了解了一下defer和async在页面加载过程差异. 定义和用法 async 属性规定一旦脚本可用,则会异步 ...
- lib-flexble 使用遇到的bug及解决方案
1 lib-flexble解决微信端长按不能弹出识别二维码功能 加viewport就完美解决 flexble可以自动完成 一般情况不建议加 但是么 bug出来了 加上就好了 2 Font Boos ...
- Hadoop - 操作练习之单机配置 - Hadoop2.8.0/Ubuntu16.04
系统版本 anliven@Ubuntu1604:~$ uname -a Linux Ubuntu1604 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb ...
- Laravel 5.2 教程 - 数据填充
一.简介 Laravel提供的填充类(seed),可以让大家很容易的实现填充测试数据到数据库.所有的填充类都位于database/seeds目录.填充类的类名完全由你自定义,但最好还是遵循一定的规则, ...
- hdu1054最小顶点覆盖
最小定点覆盖是指这样一种情况: 图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点.我们称集合V覆盖了G的边.最小顶点覆盖是用最少的顶点来覆盖所有的边.顶点覆盖数是最小顶点覆盖 ...
- button按钮点击不刷新(前端交流学习:452892873)
<button type="button" value="test" >确认买单</button> 可实现页面点击不刷新效果
- (详细)php实现留言板---会话控制-----------2017-05-08
要实现留言功能,发送者和接受者必不可少,其次就是留言时间留言内容. 要实现的功能: 1.登录者只能查看自己和所有人的信息,并能够给好友留言 2.留言板页面,好友采取下拉列表,当留言信息为空时,显示提示 ...
- UIView的属性
.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = ; // 不透明 view.alpha = ; .clipsToBounds // 默认是NO,当设置为yes时, ...