为什么你应该关心领域模型?

简介: 领域模型是DDD的核心,更是业务的深入认知

作者简介:张刚,软件工程博士,阿里云云效资深技术专家,ALPD方法学核心成员。

 

引言

 

领域模型是重要的概念。但是,真正了解并能熟练运用它的人并不多。这实在是殊为可惜的一件事情。

 

软件开发中的许多问题,例如需求难于沟通,软件难以演化,都和领域模型紧密相关。更关键的是,掌握这个概念并不难。通过练习,一个团队只需要一两个小时,就可以习惯领域模型的建模思路,并且开始从中受益。

 

那么,什么是领域模型?如何理解领域模型的本质?为什么领域模型能给软件开发带来巨大帮助?如何表达它,如何应用它?本文将依次展开这些概念。

 

什么是领域模型?

 

首先我们来看什么是领域模型。

 

领域模型定义了领域内的关键的概念以及这些概念之间的关系。

 

为什么要强调“领域内”?是因为模型(或者说概念)只在它所处问题空间中才有意义。这分为两种情况:

 

1)一个概念只在某个特定领域有意义。例如,“应收账款”,就只是在财务领域,更严格的说是会计领域才有意义。

 

2)一个概念必须通过领域限定,才有具体的意义。例如,“轨道”这个概念,它可能是天文学领域的行星运动轨道,也可能是铁路领域的火车轨道,必须得先限定领域,这个概念才有真正的价值。

 

关键信息1:领域模型最重要的是概念,领域模型也被称为概念模型。

 

虽然有人说“领域模型是领域内的概念的可视化表示”,但是, “可视化”并不本质,虽然它也重要。相比较而言,“概念”才是根本。

 

关键信息2:“语言的边界就是思想的边界”—— 一个好的领域模型,必然承载了有用的知识。

 

对一个不熟悉特定领域的人来说,理解概念,往往是进入一个领域最快的方式。例如,小时候的儿歌:太阳大,地球小,地球绕着太阳跑。地球大,月亮小,月亮绕着地球跑。它就可以认为是一种概念模型的表达。在这个模型中,包括了3个概念实体:太阳,地球和月亮。而太阳和地球的关系是地球绕着太阳运动,地球和月亮的关系是月亮绕着地球运动。用一张图画下来就是:

图片 1.png

 

这张图其实是UML的对象图,当然即使你不熟悉UML,就是作为线框图,也能很容易理解。

 

同样,在各种业务领域,都有自己的关键概念。这些概念的表达也不一定是图。例如,刚才所讲的会计领域,我们可以使用一张表来表达下列的几个关键概念:

 

会计主体(本方)->对方

应收账款

货物已经发给对方,但是尚未收到货款

应付账款

已经收到对方货物,但是尚未支付货款

预收账款

已经收到对方货款,但是尚未发货

预付账款

已经支付对方货款,但是尚未收到货物

 

通过这样一张表格,相信即使对会计领域不甚了解对小伙伴,也能快速掌握相关的知识。如果我们更进一步,能够理解到,应收和预付,本质上是本方的债权,而预收和应付,本质上是本方的债务。用一张图表示就是:

 

图片 2.png

 

 

在这里我们使用了UML类图来表示。对于不熟悉UML的小伙伴,可能需要解释一下三角形箭头的意思,它代表“是一种”,例如,应收账款是一种债权。

 

更严格的,如果一笔应收账款的帐期已经很长,例如5年,那么这种账款有很大概率已经收不回来了,所以需要计提坏账。有一些通用的坏账计提策略,例如:一年以内5%,一到二年20%,二到三年50%,三年以上100%等。所以,面向刚才的应收账款,我们可以用下面的图来表达这样的概念:

 

图片 3.png

 

 

图是一种视图,它不需要面面俱到。例如,本图中,并没有显示一切和会计科目相关的信息,而只是集中于坏账的计提。其中,我们在应付账款和坏账之间引入了一个新的符号,认识UML的小伙伴知道我们表达的是”应收账款中包括坏账“。图中的帐期、金额等,我们成为“属性”,用于详细的说明应收账款、坏账这些概念还包括哪些内容。

 

由于领域模型本质上传递的是概念,是知识性的信息,所以,对于软件开发的场景来说,把这些知识显式化,能快速对齐不同角色、不同参与方之间的概念,加速沟通,避免误解。

 

领域模型是重要的业务资产

 

领域概念沉淀业务知识,而且非常稳定。

 

一家在某个领域深耕多年的企业,和一个新入行的企业,差别是什么?差距可能是多方面的,但是最大的差距应该是“认知”。——所以我们常常会看到,新入行的企业追赶深耕多年的企业的办法,常常是去成熟的的企业高薪“挖角”。按道理说,挖来的这些人既不能把原公司的客户带来,也不可能把原公司的系统带来,那么本质上他们给新企业带来了什么呢?他们对新公司最大的帮助,是对特定领域的认知。在业务领域,认知非常值钱,而且非常稳定。我们也会看到,一些在某个领域建立了优势的企业,特别是咨询类企业,单靠业务领域的咨询,就能给企业带来客观的收入。如果有良好维护的领域模型,那么领域模型就是这些认知沉淀的最佳位置所在。

 

更重要的是,尽管业务常新,但是领域模型却相当稳定。我们以商品交易为例。我们知道买家、买家、商品、交易这些概念,都是商品交易领域的核心概念。这些概念并不会随着业务的演进发生剧烈的变化,无论是B2C业务,C2C业务,C2M业务,拼团业务还是秒杀业务。不同的业务,体现的只是对这些业务概念的不同组织方式。当然,真正的领域模型要远远比上述概念复杂的多。我们这里只是举一个简单的例子,说明领域概念的稳定性。

 

领域模型的跃迁和生长

 

当然,我们说领域模型稳定,并不是说它一成不变。优秀的领域模型都一定会持续生长,甚至有时候会发生本质的跃迁。

 

一旦一个模型被推翻,我们会认为,我们对某个领域的认知,一定发生了非常本质的跃迁。例如,前述的儿歌“太阳大,地球小,地球绕着太阳跑。地球大,月亮小,月亮绕着地球跑。”并不是一开始就是这样认知的。无论中外,在几百年前,我们都曾经认为,地球是宇宙的中心,太阳、月亮都是绕着地球运行的。那么,这个模型画出来就是下面这个样子:

 

图片 4.png

地心说对象图

 

 

地心说到日心说,是我们宇宙认知到巨大进步,以为日心说模型彻底否定了地心说模型。在软件领域也是这样。我曾经经历过几次领域模型跃迁的场景,每次都伴随这业务认知的巨大进步。

 

当然,在现实生活中,跃迁并不多见。更多的时候都是在原有的模型上稳定发展,逐步增入各种新的概念和各种细节。模型的生长过程,本质上也是业务能力积累的过程。

 

稳定的领域模型带来软件的适应性

 

需求是不稳定性的,而领域模型是稳定的,这启发我们,如果以领域模型为中心去构造软件,那么我们就会构造出很多稳定的积木块。新的需求,就可能通过这些稳定的积木块,通过不同的搭建方式,形成丰富多彩的应用。在这种情况下,我们的软件对于变化的适应力最强,开发成本最低。

 

领域模型存在于哪里

 

用类图表示领域模型

 

UML类图是表达领域模型的非常好的工具,虽然并不存在如何表达领域模型的标准。因为在UML中,“类”并不简单是软件设计中的“类”,它代表的其实是“概念”,所以,把类图用在领域模型的表达上,是非常恰切的。而且,UML已经约定了概念和概念之间的关系,例如:类、属性、关联、关联的多重性、泛化、聚合、组合、依赖等等。

 

对于不熟悉UML的人来说,使用UML也完全没必要有什么心理负担。UML是一个高度灵活的结构,它具有渐近的能力。你没有必要掌握所有复杂的概念才开始工作,根据我的经验,只要一开始能把类(代表概念)、类的属性和它们的关系描述出来,最多再知道多重性怎么表示,就足以应付大多数的场景。

有些小伙伴有面向对象的经验,在这里会纠结于要不要对“方法/操作”进行建模。在“领域模型”是一种“业务概念”这个上下文中,方法是完全多余的东西,暂时不需要在这个阶段进行建模。我认为在实现阶段补足它们更合适。

 

在交流和文档中使用领域模型

 

领域模型写在纸上并不是最关键的。作为概念模型,它反映了这个领域的最重要的概念,也构成了表达业务概念的词汇。所以:

 

 

最好的领域模型,应该时刻存在于团队成员的心中,存在于日常的交流活动中。

 

为了做到这一点,我对自己的团队和辅导过的团队,都有一个要求,这个要求也被成为交流活动中的“统一语言”:

 

任何在需求描述中出现的概念,都必须出现在领域模型中。如果需求描述中存在概念之间的关系,领域模型中也必须有这个关系

 

这个要求看似简单,实际做到会比较困难。特别在刚开始的时候,团队成员可能并不适应这种做法,常常就忘记了这个准则,需要经常纠正。但是一旦习惯,大家会发现,在日常交流活动中,因为所有的概念都已经显式化,误解大大减少,共识更容易达成,导致的后果就是最后团队成员,都会非常自觉的维护“统一语言”的做法。

 

出于同样的原因,编写文档时,使用领域模型作为统一语言也成了一个非常自然的结果。

 

在代码中使用领域模型

 

由于领域模型已经被显式化,所以如果能够在代码中使用领域模型,那么代码就会获得更好的易读性。由于领域模型和代码对应的更加一致,那么在领域模型发生演进时,代码就会变得更容易演进。在这方面,领域驱动设计给出了一组完备的模式,可以帮助架构师和开发人员自然地把领域模型转化为代码。本文中我们并不准备展开这些模式。在此,暂时先请读者们记住下面的结论,后面会有更深入的讨论:

 

代码和问题域之间的表示差距应该尽量缩小,领域模型是连接现实世界和数字世界的最佳桥梁。使用领域模型作为代码中的业务概念的基本表达元素,可以大幅提升代码的易读性,也可以更好的支持业务的演进。

 

 

领域模型来自哪里

 

领域模型反映了关键的业务认知,但是认知并不会凭空建立。能够一上来就洞悉一切本质的,要么是这个人是天才,要么说明这个领域已经是一个非常成熟的领域,已经无需探索和发现。

 

大多数时候,认知都来自于业务场景的启发。所以,领域模型建立的过程,往往是伴随着需求分析同步产生的。

 

我画了下面这张图,来说明领域模型和业务场景之间的关系:

 

图片 5.png

 

也就是说,领域模型是在业务场景的激励下逐渐完善的。而且,反过来因为对领域的认知更加深刻,领域模型还有助于新的业务场景的发现。

 

探索和发现最好不要一个人独自进行。更多地时候,应该尽量进行集体建模。集体建模不仅仅利于探索和发现,而且它也有助于达成对于关键业务概念的共识。

 

集体建模的最好工具并不是UML的电子化工具,使用白板,在开放空间中的讨论,往往能够收到最好的效果。

 

由于领域模型表达的是概念,所以对于概念及时地分解和抽象,是领域建模的基本功。当然,现实中受过严格的分解和抽象训练的人并不多,特别是很多业务人员往往都缺乏这方面的能力。我在实际工作中,观察到具有面向对象经验的开发人员,经过一定时间的练习,可以很快掌握这方面的技能。所以,如果有一些具有经验的开发人员参与建模,往往可以获得质量更高的模型。

 

常见误区

 

领域模型的概念产生于90年代的面向对象社区。在那个时候,业务变化还不像今天这样频繁,迭代的思想也还没有完全成熟,业务人员和技术人员也没有像今天这样密集的交流,所以,无论是从参考书上,还是实践上,领域模型的概念都难免留下早年做法的影响。其中,有若干误区,在实践中是应该尽量避免的:

 

误区1:  从开发视角进行领域模型的建模

 

常常有技术人员问:“领域模型和ER图有什么关系?” 对这个问题最直接的回答就是:“没有关系”。固然,我肯定知道在有了领域模型之后,设计ER图会更简单,或者对于一个还缺乏领域模型的遗留系统,研究数据库结构可以带来有效的输入,但是它们的立足点是完全不一样的。

 

领域模型一定要从业务视角去看,因为领域模型反映的是业务认知。一旦在领域模型中掺杂了技术的概念,不仅仅是因为它不够纯粹,更重要的是它已经堵死了从业务视角对领域模型进行演进和纠正的机会。因为没有软件背景的业务人员,是不可能去看一个充斥着技术概念的模型的。统一语言无法建立,领域模型带来的价值就已经损失了一大部分。此外,从开发视角进行建模,往往还会忽视业务人员的参与。而实践一再表明,资深的业务人员在领域建模时,往往能提出深入的洞察。所以,从开发视角对领域模型进行建模绝对不可取。

 

误区2: 建立庞大的领域模型

 

当我们说“领域”的时候,并没有限定一个“领域”应该有多大。究竟是“航空”作为一个领域,还是“航空”中的“订票”是一个领域?

 

当你考虑到“领域的核心是认知”,这个答案就变得非常清楚了。领域越大,越不利于建立认知和共识。我们应该这问题域,把大的领域划分为小的领域,然后逐个建立这些小的领域的领域模型。那种整整一面墙的领域模型,往往都是不可取的。

 

误区3: 重文档,轻交流和共识

 

领域模型的核心在于建立共同的共识,所以,如果只是把领域模型作为一种“制品”,作为某个阶段的“输出”,这是非常不合适的。领域模型需要作为交流工具。“统一语言”是避免该误区的重要方法。

 

误区4: 不把领域模型显式化

 

很多人认为自己是有“认知”的,甚至是有“领域模型”的,但是,如果你问他们模型在哪里,这些要么就是在某个项目曾经有过一些讨论,但是现在已经不知所踪,要么就是虽然文档还在,但是团队的概念表达依旧混乱。没有显式化,没有把领域模型写下来,没有形成团队口口相传的知识,那么这种模型,并不真正存在。除了“统一语言”,我们还有一个非常简便的检验方法,就是看这个团队如何给新人介绍自己的系统。因为领域模型反映了基本的业务概念,是一个非常好的新人培养工具,但凡真正有“领域模型”的组织,是不可能不把领域模型拿出来做介绍的。

 

总结

 

本文我们主要介绍了领域模型的基本概念及重要度,领域模型对于“统一语言”的价值以及领域模型应用的常见误区。

 

总结一下要点:

 

  • 领域模型的本质是概念和认知,它定义了领域内的关键概念以及这些概念之间的关系
  • 相对于业务的多变,领域模型相对稳定,优质的领域模型可以低成本的支持业务,领域模型也是统一语言的基础,能有效提升沟通效率
  • 领域模型来自于业务滋养,领域模型生长的过程,也是业务认知建立的过程,协作建模是更有效的建模方法

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三包围结构的字是什么样的_一年级语文重点(字、字母、字词、词语、句子)知识点汇总!...

一年级语文重点汇总一、字母A B C D E F G H I J K L M N O P Q R S T U V W X Y Za b c d e f g h i j k l m n o p q r s t u v w x y z二、 字1、组词。(形近字和同音字)么(什么) 无(无法) 高(高兴)公(公共) 元(一元…

Java编程技巧之样板代码

简介: 在日常编码的过程中,可以总结出很多“样板代码”,就像”活字印刷术中的“活字”一样。当我们编写新的代码时,需要用到这些“活字”,就把“样板代码”拷贝过来,修改替换一下就可以了,写起代…

CPU 被挖矿,Redis 竟是内鬼!

作者 | 轩辕之风O来源 | 编程技术宇宙却说这一日,Redis正如往常一般工作,不久便收到了一条SAVE命令。虽说这Redis常被用来当做缓存,数据只存在于内存中,却也能通过SAVE命令将内存中的数据保存到磁盘文件中以便持久化存储。只见Red…

vos3000落地网关对接教学_跨国合作:Serverless Components 在腾讯云的落地和实践

导语 | Serverless Components 是 Serverless Framework 推出的最新解决⽅案,具有基础设施编排能⼒,开发者通过使⽤ Serverless Components,可以灵活构建、组合和部署 Serverless 应⽤。本文是对腾讯云云函数团队前端负责人蔡卫峰在云社区沙龙…

Hologres揭秘:深度解析高效率分布式查询引擎

简介: 从阿里集团诞生到云上商业化,随着业务的发展和技术的演进,Hologres也在持续不断优化核心技术竞争力,为了让大家更加了解Hologres,我们计划持续推出Hologers底层技术原理揭秘系列,从高性能存储引擎到高…

电脑两边黑边怎么还原_Mac电脑录制的视频有黑边?如何解决

Mac电脑录制屏幕视频时两边有黑边,无论是将录制格式设置为1080p还是默认分辨率,最终生成的视频两边都有黑边,遇到这种情况如何解决呢?原因是 mac 录制出的视频分辨率比例是 16:10 ,比需要的 16:9 高一点。接下来给大家…

程序员有必要参加软考吗?大一可以考的编程证书还有哪些

软考的全称是:计算机技术与软件专业技术资格水平考试。通过考试获得证书的人员,表明其已具备相应等级的水平和能力,用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务。个人认为,程序员有没有必要参与软考最主要…

【知识连载】 如何用钉钉宜搭制定企业疫情防控数字化管理方案

简介: 【零起点入门系列教程】将会带给大家从业务视角出发由浅入深地学习用宜搭实现应用搭建。即便是没有任何代码基础的新手只要跟着系列课程,从0开始慢慢修炼,也能找到成功搭建应用的乐趣。今天第六讲,示例如何用钉钉宜搭搭建企…

mapreduce原理_Hbase Bulkload 原理面试必备

当需要大批量的向Hbase导入数据时,我们可以使用Hbase Bulkload的方式,这种方式是先生成Hbase的底层存储文件 HFile,然后直接将这些 HFile 移动到Hbase的存储目录下。它相比调用Hbase 的 put 接口添加数据,处理效率更快并且对Hbase…

StarLake:汇量科技云原生数据湖的探索和实践

简介: 快速了解汇量科技在云原生数据湖领域的探索和实践,详解 StarLake 的架构及业务应用案例。 作者:陈绪(汇量科技资深算法架构师,EnginePlus 2.0 产品负责人) 内容框架: 互联网业务视角看湖…

sql语句在navicat中可以查询到所有数据但是在idea程序中不行_数据迁移测试实施方案...

点击关注,我们共同每天进步一点点!最近经历了一场大型的数据迁移测试,因为以前对数据迁移测试研究甚少,所以对测试实施方案的制定非常的棘手,在网上也查询了很多,发现相关资料很少,并且大部分都…

报告:69% 的企业表示云技术有助于他们的疫情恢复

根据 DigitalOcean 最近的报告,在疫情高峰期间云使用增加的企业中,86%的企业表示云使用量在 2021 年继续增加,这表明数字加速和云采用没有放缓迹象。随着 2022 年的临近,对于各种规模的企业来说,这场疫情仍是头等大事&…

PyFlink 教程(三):PyFlink DataStream API - state timer

简介: 介绍如何在 Python DataStream API 中使用 state & timer 功能。 一、背景 Flink 1.13 已于近期正式发布,超过 200 名贡献者参与了 Flink 1.13 的开发,提交了超过 1000 个 commits,完成了若干重要功能。其中&#xff…

长跑 11 年,腾讯开源的变与不变

作者 | 贾凯强出品 | CSDN云计算(ID:CSDNcloud)在中国,开源产业的发展就像是一个美丽的童话故事。90年代,开源如一无所有的灰姑娘,仰望着海外梦幻般的舞会,自己却很难融入其中;而世纪…

.net 批量更新_Revit二次开发——读取CAD文字实现更新模型的思路

更新模型与内地BIM项目中 设计院终版图纸一波流翻模的模式不同香港BIM项目的模式是:设计出图—BIM出碰撞报告—设计再改图—BIM再碰撞报告......反反复复....模型频繁更新 是BIM项目服务过程中不可避免的应对方法:1.晚上加班2.周末加班本文中 模型更新的…

php使用七牛直播,七牛上传文件,PHP版本

自从知道七牛以来,就一直在用七牛做图片外链,但是每次需要到七牛官网登录,然后再上传图片。感觉很麻烦,最近想做一个自己的上传到七牛的平台,开始的想法是用C#写一个windows客户端,在用swift写一个mac客户端…

汽车之家:基于 Flink + Iceberg 的湖仓一体架构实践

简介: 由汽车之家实时计算平台负责人邸星星在 4 月 17 日上海站 Meetup 分享的,基于 Flink Iceberg 的湖仓一体架构实践。 内容简要: 一、数据仓库架构升级的背景 二、基于 Iceberg 的湖仓一体架构实践 三、总结与收益 四、后续规划 一、数据…

基于 Scheduled SQL 对 VPC FlowLog 实现细粒度时间窗口分析

简介: 针对VPC FlowLog的五元组和捕获窗口信息,在分析时使用不同时间窗口精度,可能得到不一样的流量特征,本文介绍一种方法将原始采集日志的时间窗口做拆分,之后重新聚合为新的日志做分析,达到更细粒度的分…

实力登场!移动云技术内核2.0 四大全新升级!

“中国数字经济占GDP比重持续增长,5G网络建设已进入规模化部署阶段。随着5G网络的发展,企业的数字化改造需求越来越旺盛。企业日益增长的数字化改造需求对云基础设施提出了新的挑战:需要支持多种类型网络接入、支持公有云、混合云、专属云等多…

obsidian使用分享

ob对比其他软件 上文提到obsidian,这里对obsidian做一个简要的总结 优点:对比notion,语雀这些软件,内容存储在应用商的服务器上。它是存在本地的。 对比思源笔记。说一下思源笔记的不足。思源是块来控制的,回车就是一…