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)-- 统一建 ...
随机推荐
- css 实现旋转八卦图
虽然这不算什么亮点,不过也可以供路上的小伙伴学习下 直接上干货: <!doctype html> <html lang="en"> <head> ...
- .dll 文件编写和使用
1.基本概念 dll(dynamic-link library),动态链接库,是微软实现共享函数库的一种方式.动态链接,就是把一些常用的函数代码制作成dll文件,当某个程序调用到dll中的某个函数的时 ...
- jdk8的新特性 Lambda表达式
很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...
- 【转】JDBC学习笔记(4)——PreparedStatement的使用
转自:http://www.cnblogs.com/ysw-go/ PreparedStatement public interface PreparedStatement extends State ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- Java中Json解析
首先准备一个JSON格式的字符串 * String JsonStr = "{object:{persons:" + "[{name:'呵呵',image:'http:// ...
- bootstrap快速入门笔记(八)-按钮,响应式图片
一,默认样式:.btn-default , .btn-primary , .btn-success ,.btn-info, btn-warning ,btn-link 二,尺寸:.btn-lg, . ...
- Vue项目的部署
通过vue-cli创建的工程,默认已经打好了基础,包含vue-loader webpack. 通常我们开发中,使用npm run dev进行开发,webpack会Hot reload,不用我们手动刷新 ...
- phpcms页面替换
首页的替换流程首先要先把静态网页做出来,拿到这里来: 会发现这个网页里面少了图片,样式表也没有了 因为我们只把网页扔过来,所对应的图片和样式表没有扔过来 图片什么的应该扔到: 接着打开index.ht ...
- 使用JS开发桌面端应用程序NW.js-1-Menu菜单的使用小记
前言 本文主要内容为nw.js官方文档中没有提到,而在实际入手开发过程中才碰到的问题以及经验的汇总. 详情请查看官方文档:http://docs.nwjs.io/en/latest/Reference ...