DDD理论学习系列(4)-- 领域模型
1.引言
我们还是先来拆词理解,领域模型可以拆为“领域”和“模型”二词。
领域:按照我们之前的文章的理解,DDD中的领域是指软件系统要解决的问题,如我们的办公设备公众号在线商城就是为了解决电商问题,对应的就是电商领域。
模型:百度百科解释为对于某个实际问题或客观事物、规律进行抽象后的一种形式化表达方式。如户型图就是实际房屋结构的模型。
把两个词结合起来,我们给领域模型下个定义:领域模型是对我们软件系统中要解决问题的抽象表达。
这个理解还是很生涩,没关系,容我娓娓道来。
2.领域模型的来历和作用
我们知道,软件开发过程主要包括:需求分析、概要设计、详细设计、编码、测试、软件交付、验收、维护。其实简单来说就是分析、设计和实现。
而传统的软件开发方式中,系统分析、设计和实现三个阶段完全脱节,最后开发出来的软件不能很好的满足业务需求,在未来也不能很好的适应需求变化进行功能演进。
那在DDD中是如何做到呢,下面我们就从以下几个问题来分析说明。
怎样确保最终的软件设计能满足客户需求且适应变化?
那就要保证系统分析、设计和实现不脱节。那如何做到不脱节呢?
如果按照我的理解,那就需要有某一个东西能贯穿整个开发流程,来衔接分析、设计和实现三个阶段。那这个东西是什么呢?
聪明如你,是的,就是我们今天的主题——领域模型。那领域模型是如何做到的呢?
在分析阶段,所有的参与人员(领域专家、设计人员、开发人员等)对业务进行需求分析,通过大家的不断交流讨论,提取出业务规则和流程中的关键词汇和概念形成通用语言,进而发现领域概念,随着大家对领域的认识不断深入,通用语言的词汇也会不断丰富和精准,从而确保了业务需求的正确表达。
在设计阶段,以通用语言为交流基础,将发掘的领域概念进行领域模型设计,以面向对象的思想抽象出实体,确定实体所对应的方法和属性,以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式展现出来,形成领域模型。
在实现阶段,开发人员根据确立的领域模型进行代码实现,做到代码与模型的绑定,从而实现了设计和实现阶段的衔接。
通过这样一种方式,我们实现了语言、模型、代码三者紧密绑定,确保开发出来的软件来准确反应需求并能适应变化。
通过上面对领域模型的来历和作用的介绍,我们对领域模型就有了一个大致的印象。
3.案例分析
按照上面的理解,领域模型无非就是综合了系统分析和设计的产物,而这个产物我们正好可以通过UML来展示,下面我们就结合办公设备微信公众号在线商城案例,简单对销售子域进行领域模型设计。
从该销售子域的UML类图中,我们可以看出它包含了销售子域涉及到相关实体以及实体之间的关系。只要看到这个类图,我们就知道它涉及的相关概念和流程。所以说上面这张UML类图是销售子域的领域模型也不为过。
4.总结
领域反应的是我们业务上需要解决的问题,模型是我们针对该问题提出的解决方案。
综合来说,领域模型就是用来描述我们正在解决的问题和提出的解决方案。
领域模型按照我个人的理解,就是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系。然后将这些实体和实体之间的关系以某种形式(比如UML、图形、代码、文字描述等)展现出来。
以上只是领域模型理论上的理解,但领域模型的设计(领域建模)却是另一个复杂的话题,择日再聊。
参考资料:
领域模型,你真的理解的了吗?
DDD领域驱动设计基本理论知识总结
What is the Domain Model in Domain Driven Design? | Culttt
相关文章
DDD理论学习系列(1)-- 通用语言
DDD领域驱动之干货 (一)
DDD理论学习系列(2)-- 领域
DDD理论学习系列(3)-- 限界上下文
从事件和DDD入手来构建微服务
WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端
原文地址:http://www.cnblogs.com/sheng-jie/p/6931622.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
DDD理论学习系列(4)-- 领域模型相关推荐
- DDD理论学习系列(13)-- 模块
1. 引言 Module,即模块,是指提供特定功能的相对独立的单元.提到模块,你肯定就会想到模块化设计思想,也就是功能的分解和组合.对于简单问题,可以直接构建单一模块的程序.而对于复杂问题,则可以先创 ...
- DDD理论学习系列(12)-- 仓储
1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译. 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一般由仓库管理员来管理.当工厂生产了一批货 ...
- DDD理论学习系列(11)-- 工厂
1.引言 在针对大型的复杂领域进行建模时,聚合.实体和值对象之间的依赖关系可能会变得十分复杂.在某个对象中为了确保其依赖对象的有效实例被创建,需要深入了解对象实例化逻辑,我们可能需要加载其他相关对象, ...
- DDD理论学习系列(9)-- 领域事件
1. 引言 A domain event is a full-fledged part of the domain model, a representation of something that ...
- DDD理论学习系列(8)-- 应用服务amp;amp;领域服务
1. 引言 单从字面理解,不管是领域服务还是应用服务,都是服务.而什么是服务?从SOA到微服务,它们所描述的服务都是一个宽泛的概念,我们可以理解为服务是行为的抽象.从前缀来看,根据DDD的经典分层架构 ...
- DDD理论学习系列(5)-- 统一建模语言
1.引言 上一节讲解了领域模型,领域模型主要是将业务中涉及到的概念以面向对象的思想进行抽象,抽象出实体对象,确定实体所对应的方法和属性,以及实体之间的关系.然后将这些实体和实体之间的关系以某种形式(比 ...
- DDD理论学习系列(8)-- 应用服务领域服务
DDD理论学习系列--案例及目录 1. 引言 单从字面理解,不管是领域服务还是应用服务,都是服务.而什么是服务?从SOA到微服务,它们所描述的服务都是一个宽泛的概念,我们可以理解为服务是行为的抽象.从 ...
- DDD理论学习系列(7)-- 值对象
[DDD理论学习系列--案例及目录:http://www.jianshu.com/p/6e2917551e63] 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是s ...
- DDD理论学习系列(6)-- 实体
DDD理论学习系列--案例及目录 1.引言 实体对应的英语单词为Entity.提到实体,你可能立马就想到了代码中定义的实体类.在使用一些ORM框架时,比如Entity Framework,实体作为直接 ...
最新文章
- 安装 并且使用_房子装地暖还是墙暖暖气?使用过的人建议这样去选择!
- Android进阶笔记:AIDL内部实现详解 (二)
- 单片机模块学习之键盘
- 对js面向对象的理解
- linux 中使用 crontab 执行定时任务
- 大白话说Java泛型:入门、使用、原理
- css --- 浮动元素与 块框/行内框重叠时的细节
- 【原】基于Windows Media Player, 写自己的播放器【有源码,可下载整个工程】
- 上位机软件控制下位机PHP,采用stm32f103CB硬件I2C1/2(自制硬件)中断/DMA访问,四轴开源程序,DMP,PCB外框图纸库文件,USBToVCOM代码下位机...
- springMVC:前端请求后台并传值
- Restful 风格
- 记一次服务器故障及解决办法
- Proteus 8.9下载安装指南
- 零拷贝原理详解(很多大厂面试题哦)
- 信用修复的社会意义及基本概念、要素?
- 动画基础,3种动画方式
- 贪婪洞窟2一直显示连接服务器失败,贪婪洞窟2登陆不了怎么办?游戏无法登陆解决方法...
- 解决android repo (git出错的问题)
- 零基础Unreal Engine 4(UE4)图文笔记之基础篇-基本操作(二)
- AirDisk产品A6/A4支持OTG数据线连接到手机吗
热门文章
- jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作
- 实施Exchange 2013中的 MailTip
- google code for xbmc addons2
- c# 爬虫 -ChromeDriver+HtmlAgilityPack爬取比赛实时比分
- WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题
- .NET 6 中的HTTP 3支持
- RabbitMQ简介和六种工作模式详解
- 一篇万字长文读懂微软PDB、SourceLink——.net core之nuget 包调试
- WPF显示富文本emoji表情+文本(类似微信)
- C# ConcurrentBag的实现原理