领域模型,你真的理解的了吗?

背景

UML比较难学,主要是其本身很复杂并且涉及到大量的概念名词。领域模型就是其中之一,网络上搜索到关于领域模型的知识应该是有两种,一种是来源于最初的传统软件开发过程,一种来源于领域驱动设计(DDD),这两者很容易混淆。以下是我对领域模型这个概念的一些理解。

1. 领域模型是什么?

理论派观点:

  • Domain Model是一个商业建模范畴概念,即使一个企业不开发软件,也具备其业务模型;
  • 所有同行企业,其业务模型必定有非常大的共性和内在的规律性。
  • 由行业内的各个企业的业务模型再向上抽象出整个行业的业务模型,这个模型称之为“领域模型”。

实战派观点:

  • 领域模型是一个分析模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物,与问题域相关。
  • 是需求分析人员与用户交流的有力工具,是彼此交流的语言。

理论派

领域模型是一种特殊的业务模型,它分析范围是整个行业,抽象出行业里共性和内在规律性的业务,比业务模型更加抽象,它不属于软件开发范畴的概念,与软件开发无关。

实战派

领域模型是一种分析模型,在软件开发过程分析阶段用于分析如何满足系统功能性需求,属于软件开发范畴,在UML中主要使用类图来描述领域模型。

业务模型是业务建模的输出物,业务建模研究的对象是公司或者组织,业务建模属于软件开发过程中的初始阶段。

软件开发过程:业务建模、需求、分析、设计。

在软件开发过程中我们接触到的领域模型属于实战派。

2. 领域模型作用

理论派

领域模型是一种特殊业务模型,作用都是:

  • 帮助分析理解复杂业务领域问题。
  • 行业内沟通、交流。

实战派
领域模型作用:

  • 分析如何满足系统功能性需求。
  • 指导项目后续的系统设计。

业务模型作用:

  • 帮助系统需求人员理解客户公司业务,下一阶段做需求以业务模型为输入得到系统用例。

3. 领域模型与业务模型的区别

理论派

领域模型是一种特殊的业务模型,所以具备业务模型的所有特点,但是比业务模型更抽象、更通用。

实战派

  • 产出阶段不同

业务模型是在软件开发过程中业务建模阶段产生,领域模型是在分析阶段产生。

  • 作用不同

业务模型是系统需求人员理解客户公司业务的产物,下一阶段需求将以业务模型为输入得到系统需求。

领域模型是系统分析人员分析如何满足系统功能性需求的产物。下一阶段设计将以领域模型为输入。

“实战派”举例说明:

当接到项目,需要做一个酒店预订系统,首先进行业务建模,了解客户公司酒店管理的相关业务,这就会产出业务模型,此时业务模型里除了酒店预订这个业务环节还包括其他与酒店预订同层次的业务环节。

接下来将视线聚焦到酒店预订,改进已有流程得到酒店预订系统需求,即系统用例和需求规约。

接下来通过分析系统用例和需求规约,分析如何满足酒店管理系统功能性需求,从而得到领域模型。

"理论派"和“实战派”的领域模型是两个范畴的东西,若没有分清肯定会引起理解混乱。

4. 另一种“领域模型” - 领域驱动设计(Domain-Driven Design)

还有一种“领域模型”,它出自于Eric Evans的“Domain-Driven Design”简称DDD,也就是“领域驱动设计”,DDD是一套综合软件系统分析和设计的面向对象建模方法,所以要明确区分这两种领域模型。失血模型、贫血模型、充血模型这类概念都属于DDD范畴的“领域模型”。

4.1 两种领域模型的区别

本文中“领域模型”都代表领域驱动设计中的领域模型。

1. 解决的核心问题不同

正如前文所说的,领域模型是一个用于分析业务的分析模型,在实际项目中要解决的核心问题是:

  • 如何满足待开发系统业务功能需求。

而“领域模型”是综合分析与设计的模型,要解决的核心问题是:

  • 保证系统设计能满足项目多变的需求。

在传统的软件开发流程中,分析(系统需求分析)和设计(系统设计)被划分为两个阶段,分别对应国家“系统分析师” 和“系统设计师” 两种职称,这种割裂的结果导致,“系统设计师”要基于需求分析的结果做系统设计后才能进行编码,这中间会存在信息上的丢失或失真,并且实际过程中业务需求会变(可能是外界环境的变化或者对业务有更深的理解引起),就更容易引起系统设计与项目需求脱节。Eric Evans提出的DDD思想就是想解决这样问题。

2. 领域不同

领域模型是业务分析模型,分析的是系统功能性需求所出核心域的业务,软件系统只是实现业务的方式而非业务的一部分(提供IaaS服务的公司除外),不会考虑系统设计IT领域里问题。

“领域模型”是综合分析和设计的模型,涉及到系统设计,需要思考系统的边界,故该模型所分析设计的领域是综合了业务领域和IT领域。

以酒店预订系统为列,其业务描述如下

  • 所有用户都可通过酒店订房管理系统查看酒店客房信息
  • 用户如需预定需先注册成会员

以上涉及到两个对象:用户、会员。

若做业务分析,第一段描述中的“用户”可能就需要考虑,它可能是游客、咨询者的业务含义。

若要考虑系统设计,第一段描述中的“用户”可能就会忽略,即不在系统边界范围内。

3. 使用的阶段和岗位不同

领域模型是分析业务的分析模型,在实际项目中主要由系统分析师在分析阶段中使用。

DDD的“领域模型”是综合分析、设计的模型,在实际项目中横跨分析和设计两个阶段,岗位需要具备“系统分析师”和“系统设计师”的综合能力。

4. 包含的内容不同

领域模型主要内容:

  • 业务实体
  • 业务实体之间关系

“领域模型”主要内容:

  • 业务实体
  • 业务实体属性
  • 业务实体之间关系
  • 服务
  • 服务与实体之间的关系

5. 总结

领域模型分理论派和实战派,理论派属于商业范畴不属于软件开发范畴,软件开发过程不用理会理论派,切忌相互混淆。

实战派认为领域模型是一种分析模型,用于分析理解复杂业务领域问题,具体到软件开发过程中就是在分析阶段分析如何满足系统功能性需求。

同时在软件开发范畴还有来自于DDD的“领域模型”,这是一种综合分析与设计一体的模型,注重系统设计与需求分析、系统需求的衔接,设计出系统与需求有较好的一致性,针对合理的需求变化也更具有良好的扩展性。

6. 参考文章

  • 软件方法 - 建模和UML
  • 领域驱动设计(DDD:Domain-Driven Design)
  • 面向对象与领域建模
  • 来源网址 https://www.jianshu.com/p/fe45506ea358

转载于:https://www.cnblogs.com/guoby/p/9063400.html

领域模型,你真的理解的了吗?相关推荐

  1. 你真的理解“吃亏是福”么?

    你真的理解"吃亏是福"么?且看 一个10几年的运维老鸟老男孩的随笔! 供朋友参考! 一定不要计较一时的得失! 有一次老男孩老师看电视,一位老大爷(当时70岁)感慨的说," ...

  2. TCP 三次握手原理,你真的理解吗

    转载自  TCP 三次握手原理,你真的理解吗 最近,阿里中间件小哥哥蛰剑碰到一个问题--client端连接服务器总是抛异常.在反复定位分析.并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么 ...

  3. 简单人物画像_你真的理解用户画像吗?| 船说

    " 「设计师沙龙」是ARK下半年开始逐渐形成的传统,由ARKers自发组织,分为视觉和交互两类,每月各举办一次.大家围绕一个话题展开,聊聊行业最新案例和工作上的心得,帮助大家共同进步. AR ...

  4. [转载] Java内存管理-你真的理解Java中的数据类型吗(十)

    参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...

  5. 程序员你真的理解final关键字吗?

    文章目录 1.修饰类 2.修饰方法 3.修饰变量 4.final变量修饰变量(成员变量.局部变量) 4.1 final修饰成员变量: 4.2 final修饰局部变量: 5.final变量和普通变量的区 ...

  6. linux 运行长后内存就满了,关于Linux 内存的使用,你确定真的理解吗?

    原标题:关于Linux 内存的使用,你确定真的理解吗? 作者:coloriy

  7. 您真的理解了SQLSERVER的日志链了吗?

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

  8. Android Binder通信一次拷贝你真的理解了吗?

        Android Binder通信一次拷贝你真的理解了吗? Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android Binder ...

  9. 您真的理解了SQLSERVER的日志链了吗

    您真的理解了SQLSERVER的日志链了吗? 先感谢宋沄剑给本人指点迷津,还有郭忠辉童鞋今天在QQ群里抛出的问题 这个问题跟宋沄剑讨论了三天,再次感谢宋沄剑 一直以来,SQLSERVER提供了一个非常 ...

最新文章

  1. 用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
  2. 【已解答】Linux ./configure --prefix 命令是什么意思?
  3. Oracle ——概述 Oracle 5 步调优方法论
  4. 使用python编写自己的进程调试工具
  5. 解决mysql大小写敏感问题
  6. 1.4_select_sort_选择排序
  7. 添加SAP_ALL权限
  8. 为什么开发移动端web不使用jQuery
  9. Excel如何快速提取红色字体文本
  10. Python初学笔记
  11. labview温度采集系统,温度计正负范围内显示,附加温度预警操作部分(初学者~)
  12. axure能做剪切蒙版吗_二手车销售好做吗?没经验能做二手车销售吗?
  13. HDU5144 NPY and shot BestCoder Round #22 1003
  14. ctypes 指针类型 byref pointer POINTER
  15. Chrome浏览器关闭地址栏的搜索记录
  16. 大数据与BI的联系与区别
  17. 快捷指令|支付宝合集|安卓支付宝shell快捷指令大全
  18. 采购员的主要职责是什么?
  19. 介绍 Go 断续器(Tickers)
  20. 笔记本重置找不到恢复环境_重置Windows10系统时提示“找不到恢复环境”的解决方案...

热门文章

  1. Quartus II软件添加设备
  2. C++explicit与implicit
  3. shader入门精要读书笔记20 Unity中的光源类型与衰减计算
  4. 【编译原理】计算机考研复试问答题总结
  5. vivo Xplay(16GB) root教程_方法
  6. Vue 插件 vee-validate校验插件详解大全
  7. 渗透测试-----信息收集(概述、whois、子域名查询、爆破、vulhub域名传送漏洞复现、kali安装docker)
  8. C语言——Prim算法实现最小生成树
  9. C语言中信号量的使用
  10. Linux 内核参数:extra_free_kbytes