领域模型

领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

学会了面向对象的思想,却依然写不出好的面向对象的程序,下面我从“领域建模”这个单点要素,谈一下自己的体会,如何从需求分析到面向对象设计这样一个过程,以及互联网最近比较火的架构(微服务、中台)是怎么一步步演变而来的。以下我所说的可能都是错的,只是一家之见,欢迎大家在留言区多提意见和看法,互相共勉。

什么是领域模型

1、领域模型

领域模型(Domain Model),是完成从需求分析到面向对象设计的一座桥梁,领域模型是指对需求所涉及的领域的建模,所以也叫业务对象模型,是描述业务用例实现的对象模型。它是对业务角色和业务实体之间应该如何联系和协作以执行业务的一种抽象。业务对象模型从业务角色内部的观点定义了业务用例。该模型为产生预期效果确定了业务人员以及他们处理和使用的对象(“业务类和对象”)之间应该具有的静态和动态关系。它注重业务中承担的角色及其当前职责。这些模型类的对象组合在一起可以执行所有的业务用例 。

2、对象

当研究参与业务中不同用例的业务角色和业务实体时,可能会发现某些对象如此相似,以致于实际上是一个类,即使不同的业务用例没有相同的要求,类是这些不同的业务用例之间也可能相似到足以被视为一个相同现象的程度,如果是这种情况,应该将相似的类合并在一起,这时就产生了一个业务角色或业务实体,它拥有足以满足不同业务用例要求的关系、属性和操作。

3、模型

在业务对象模型中,业务角色代表雇员将担当的角色,而业务实体则代表雇员将处理的对象。一方面,可以使用业务对象模型来确定业务雇员将如何进行交互,以产生业务主角所期望的结果。

Model对于数据处理是最核心的东西,数据模型是数据组织和存储方法,模型的好坏,决定了数据库或者数仓能支撑企业业务多久。为什么大多数企业,数据库或者数仓都要重建,这不仅仅是业务拓展、发展迅速,很大一部分是因为模型建的很烂。

不同维度对领域模型的理解

领域建模, 从领域模型开始,我们就开始了面向对象的分析和设计过程,就是建立最重要的业务概念和它们之间关系,是真实世界各个事物的表示(现实世界的可视化抽象字典)而不是软件中各构件的表示。类,表示业务概念,通常只包含重要属性,甚至不包含操作;关联、泛化,表达概念之间的关系,可以说领域模型是描述业务领域(业务实体)的静态结构。

1、业务

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

(1)Domain Model是一个商业建模范畴概念,即使一个企业不开发软件,也具备其业务模型;

(2)所有同行企业,其业务模型必定有非常大的共性和内在的规律性。

(3)由行业内的各个企业的业务模型再向上抽象出整个行业的业务模型,这个模型称之为“领域模型”。

2、软件

领域模型是一种分析模型,在软件开发过程分析阶段用于分析如何满足系统功能性需求,属于软件开发范畴,在UML中主要使用类图来描述领域模型,帮助系统分析人员、用户认识现实业务的工具,描述的是业务中涉及到的实体及其相互之间的关系,它是需求分析的产物,与问题域相关。

(1)是需求分析人员与用户交流的有力工具,是彼此交流的语言;

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

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

领域模型的作用

软件的核心是解决领域问题的能力,这是软件存在的本质价值;软件开发团队必须掌握领域知识,才能开发出能够解决领域问题的有价值的软件,然而领域模型是对领域相关知识的选择性抽象和严格的组织,一个合适的模型能够帮助开发团队理解信息的涵义和聚焦于问题本身,同时和实现紧密联系。 

1、发掘重要的业务领域概念

(1)领域模型用于捕获系统语境中的一些重要领域对象类,一般是以类图表达的。
(2)业务模型是用于在系统开发中捕获业务处理和其中的业务对象。

2、建立业务领域概念之间的关系  ,即连关系找出领域对象之间的关系。

3、领域模型与软件设计核心的相互塑性 

领域模型与实现是紧密联系并相关的,这保证了对领域模型的讨论分析能够作用于最终产品--可以运行的软件;同时也可以根据领域模型来解释代码,对软件的维护和继续开发也很有帮助。

4、领域模型是团队所有成员所使用的语言的核心

因为领域模型是团队在组织领域知识和辨别最感兴趣的原理时达成一致的方式,设计人员、开发人员和领域专家将共用的信息放在领域模型这种形式中,开发人员可以用领域模型来讨论程序,能够和领域专家在没有翻译的情况下交流,,可以使他们在合作时更高效。

 

如何领域建模

领域建模的方法就是从需求模型中找,具体来说就是从用例中找名词。对通用语言中名词、动词的使用需要认真考量,因为这些名词和动词会作为后面模型的指导命名,名词在一个限界上下文(bounded context)中不能存在二义性。当然找到名词之后,为了能够更加符合面向对象的要求和特点,我们还需要对这些名词进一步完善,这就是接下来的步骤:加属性、连关系!

1、找名词

按照领域专家的说法就是将用例中涉及到的名词仔细的找出来后,列成一个清单,方便进行进一步的筛选,删除掉不是领域对象的名词。哪些不是领域对象的名词?这个是和不同的业务领域强相关的,这个没有统一的标准,筛选的好坏跟经验与知识有很大的关系,其中一点,和用例模型有关联或有交互的即为领域对象。

按照软件开发的说法就是发现类和对象:尽可能多的找出概念类(识别方法:概念类分类列表、名词性短语)

(1)概念分类列表:人、事物、地点、组织、概念、事件、规则、抽象名词、交易项目、角色、设备、组织结构(对用例进行识别:实体、过程中的信息、角色的输入输出、操作设备等)

(2)名词分析法:识别问题域和用例描述中的名词和名词性短语作为候选的概念类和属性,从候选项中,摒弃多余的名词,确定最终的对象(注意是作为类还是属性,类可以是一种标识、状态和行为)

2、加属性

按照领域专家的说法就是根据用例,给每个名词添加场景所涉及到的属性。

按照软件开发的说法就是添加类的重要属性(类的语义完整性、类的作用、问题域相关特性等)

(1)语法:可见性 属性名:类型 多重性=默认值{特性表} 

       /  [可见性] 属性名 [:类型] [=初始值]

(2)属性类型是简单的数据类型为佳,如果是复杂概念,考虑是否单独作为一个概念类

(3)任何属性都不表示外键,即不应该用属性来联系概念类,区别于数据库设计中的外键

3、连关系

按照领域专家的说法就是找出领域对象之间的关系;

按照软件开发的说法就是建立类之间的关联(关联、继承、依赖)。

(1)关联:类之间的某种语义关系包括聚合,组合

(2)继承:一般到特殊

(3)依赖:表明一个元素(源元素)的定义或实现依赖另一个元素(被依赖元素)的定义或实现

领域驱动设计

 领域驱动设计(Domain-Driven Design,DDD)是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题。整个过程大概是这样的,设计团队、开发团队和领域专家一起通过“通用语言(Ubiquitous Language)”去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上建立模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。

1、CRUD系统

在传统模型中,对象是数据的载体,只有简单的getter/setter方法,没有行为。以数据为中心,以数据库范式模型(即实体关系(ER)模型,用实体加关系描述的数据模型描述企业业务架构)设计作驱动,分层架构在这种开发模式下,可以理解为是对数据移动、处理和实现的过程。这是一种贫血模型,这种模型开发出来的系统称为“CRUD系统”。

简单的业务系统采用这种贫血模型和过程化设计是没有问题的,但在业务逻辑复杂的系统中,业务逻辑、状态会散落到在大量方法中,开发时间指数增长,维护成本很高,原本的代码意图会渐渐不明确,我们将这种情况称为由贫血症引起的失忆症。

CRUD系统,数据量一旦上来就会面临性能的问题,通常的解决方案就是对数据库进行读写分离。让主数据库处理事务性的增、删、改操作,让从数据库处理查询操作,然后主从数据库之间进行同步。但是这只是从DB角度处理了读写分离,从业务或者系统层面上来说,读和写的逻辑仍然是存放在一起的,他们都是操作同一个实体对象,并没有从底层基础设施上做根本改变。

2、CQRS系统

简单的说,CQRS(Command Query Responsibility Segration)就是一个系统,从架构上把 CRUD 系统拆分为两部分:命令(Command)处理和查询(Query)处理。其中命令处理包括增、删、改。命令与查询两边可以用不同的架构实现,以实现CQ两端(即Command Side,简称C端;Query Side,简称Q端)的分别优化。两边所涉及到的实体对象也可以不同,从而继续演变成下面这样。

(1)CQRS两种实现方式

A、CQ两端数据库共享,只是在上层代码上分离。这样做的好处是可以让我们的代码读写分离,更容易维护,而且不存在CQ两端的数据一致性问题,因为是共享一个数据库的。

B、CQ两端不仅代码分离,数据库也分离,然后Q端数据由C端同步过来。同步方式有两种:同步或异步,如果需要CQ两端的强一致性,则需要用同步;如果能接受CQ两端数据的最终一致性,则可以使用异步。C端可以采用Event Sourcing(简称ES)模式,所有C端的最新数据全部用Domain Event表达即可;而要查询显示用的数据,则从Q端的ReadDB(关系型数据库)查询即可。

(2)DDD的应用

CQRS是一种思想很简单清晰的设计模式,虽然在思想上简单,但是实现上相对来说复杂些,也涉及到DDD的一些概念了,他通过在业务上分离操作和查询来使得系统具有更好的可扩展性及性能,使得能够对系统的不同部分进行扩展和优化。在CQRS中,所有的涉及到对数据库(DB)的操作都是通过发送Command,然后特定的Command触发对应事件来完成操作,也可以做成异步的,主要看业务上的需求了。

当我们在分析某一领域时,一直在尝试如何将信息转化为领域模型,但并非所有的点我们都能用Model来涵盖。对象应当有属性、状态和行为,但有时领域中有一些行为是无法映射到具体的对象中的,我们也不能强行将其放入在某一个模型对象中,而将其单独作为一个方法又没有地方,此时就需要服务,这时候“微服务”诞生了。

微服务架构只是具体的实现方式,但是他并没有给出如何对复杂系统进行分解的具体方法论,而DDD强调领域模型和微服务设计的一体性正好就是解决方案,用DDD(领域驱动设计) 的思想去指导微服务的实践,先有领域模型然后才有微服务,而不是脱离领域模型来谈微服务设计。

中台的本质是领域模型,微服务是领域模型的系统落地,DDD是一种软件设计思想,它可以同时指导中台领域建模和微服务架构设计,这就是DDD、微服务和中台的铁三角关系。

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

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

相关文章

重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用

原文:https://istio.io/blog/2020/wasm-announce/作者:CRAIG BOX, MANDAR JOG, JOHN PLEVYAK, LOUIS RYAN, PIOTR SIKORA (GOOGLE), YUVAL KOHAVI, SCOTT WEISS (SOLO.IO)译者:陆培尔编者按Istio的架构在1.5版本中发生了翻天覆地的变化&#…

2019年第十届蓝桥杯国赛B组试题E-路径计数-dfs(坑题)

【问题描述】 从一个 5 x 5 的方格矩阵的左上角出发,沿着方格的边走,满足以下条件的路线有多少种? 总长度不超过 12; 最后回到左上角; 路线不自交; 不走出 5 x 5 的方格矩阵范围之外。如下图所示&#xff…

.NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(下)...

接下来介绍使用代理方法的方式,也就是说把 ErrorController 整段逻辑直接定义在注册的地方,使用一个匿名委托来处理,这里的逻辑与之前的逻辑是相同的app.UseExceptionHandler(errApp > {errApp.Run(async context >{// 在 Features 里面…

【朝夕技术专刊】Core3.1WebApi_Filter-Authorize详解

欢迎大家阅读《朝夕Net社区技术专刊》第6期我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦!前言:本部分文档将详细给…

以正确的方式下载和配置 ASP.NET Core 官方源码

我们可以在Github上面直接查看ASP.NETCore 3.x的源代码,但是我们也可以把源代码下载下来进行查看。而下载源代码进行查看有很多好处:任意的导航源代码内置了一个示例项目直接调试源代码下载源代码想下载并配置好源码,你需要:最新版…

h5应用 vue 钉钉_uniapp开发一个小视频应用(一)

“uni-app 是一个使用 Vue.js 开发所有前端应用的框架,是一种终极的跨平台解决方案,这里的平台,主要指的是App平台(android、ios)、小程序平台、H5平台。开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝…

Blazor入门

NOW现在行动!Blazor是一个基于C#, Razor和 HTML的新的Web UI框架。它通过WebAssembly运行在浏览器中。有利于使用C#而不是JavaScript构建交互式的Web UI。这篇文章演示了如何使用Blazor构建SPA应用。Blazor简化了可在任…

C#桌面开发的未来WebWindow

WebWindowWebWindow是跨平台的库。Web Window的当前实验实现可在以下平台上运行:Windows – 需要基于Chromium的EdgeLinux – 使用WebKitMac – 需要Safari源码https://github.com/SteveSandersonMS/WebWindow.gitZeje Fork的分支:https://github.com/ze…

C#小游戏—钢铁侠VS太空侵略者

身为漫威迷,最近又把《钢铁侠》和《复仇者联盟》系列又重温了一遍,真的是印证了那句话:“读书百遍,其意自现”。看电影一个道理,每看一遍,都有不懂的感受~ 不知道大伙是不是也有同样的感受,对于…

受检异常 非受检异常_这样设计 Java 异常更优雅,赶紧学

来源:Lrwinlrwinx.github.io/2016/04/28/如何优雅的设计java异常/导语异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据自己的开发经验来谈一谈我是如何对异常进行处理的。由于本文只作一些经验之…

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

23 | 静态文件中间件:前后端分离开发合并部署骚操作我们先来看一下静态文件中间件有哪些能力1、支持指定相对路径2、支持目录的浏览3、支持设置默认文档4、支持多目录映射源码链接:https://github.com/witskeeper/geektime/tree/master/samples/StaticFi…

src获取同级目录中的图片_一个简单的Python爬虫实例:百度贴吧页面下载图片

本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。1. 概述本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片。下载图片的步骤如下:获取网页html文本内容;分析html中图片的html标签特征,用正…

十问十答 Apache 许可证

Apache 许可证由 Apache Software Foundation(ASF)发行,是一个由强大社区支持的流行的被广泛部署的许可证。Apache 许可证允许你自由地使用、修改和分发任何 Apache 许可的产品,前提是遵循 Apache 许可的条款。01Apache 许可证的条…

(一)基于企业现金流预测的投资决策-项目介绍

项目背景 某企业想提高现金流的利用率,以便产生更大的投资收益。遇到的问题是:何如在保证更多的资金流向高收益投资的同时,不出现资金短缺的问题。 确定可用于投资的金额 Step1 预测未来的收入、支出和余额 潜在逻辑: 现金流 = 收入 - 支出当月余额(资金存量)= 上月余…

应用程序使用统计信息 – .NET CORE(C#) WPF界面设计

本文首发地址:https://dotnet9.com/10546.html关键功能点抽屉式菜单圆形进度条Demo演示:1. 新建项目使用 VS 2019 的 .NET Core 3.1 WPF 项目模板,创建名为 “MobileAppUsageDashboardCore” 的项目,NuGet 引入 MaterialDesign 的…

iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu

在流行的虚拟架构体系中,最重要的技术当然要数libvirt和QEMU了。包括Linux虚拟化技术中KVM和xen都使用了QEMU。关于Xen和KVM进行虚拟化,以及在Window下使用Vmware,VirtualBox和hyper-v构建虚拟机,可能大家都有过很多的尝试。今天我…

在Ocelot中使用自定义的中间件(一)

Ocelot是ASP.NET Core下的API网关的一种实现,在微服务架构领域发挥了非常重要的作用。本文不会从整个微服务架构的角度来介绍Ocelot,而是介绍一下最近在学习过程中遇到的一个问题,以及如何使用中间件(Middleware)来解决…

多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程

简介:记一次TCP全队列溢出问题排查过程1. 前言本文排查的问题是经典的TCP队列溢出问题,因TCP队列问题在操作系统层面没有明显的指标异常,容易被忽略,故把排查过程分享给大家。2. 问题描述A服务调用B服务接口超时,B服务…

[蓝桥杯2015决赛]完美正方形-dfs

题目描述 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形。 历史上,人们花了很久才找到了若干完美正方形。 比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 14 15 16 17 18 21 22 23 24 26 27 28 …

销量预测设计

目录一、算法计算逻辑举个直观的例子销量预测二、项目背景三、算法与业务的关系四、关于业务人员对未来外部变量“打标签”:五、关于预测颗粒度:六、关于预测准确率和影响准确率的因素:一、算法计算逻辑 销量预测算法建模要用到的数据&#…