【DDD】学习笔记-什么是模型

从领域驱动的战略设计进入战术设计,简单说来,就是跨过系统视角的限界上下文边界进入它的内部,从分层架构的逻辑分层进入到每一层的内部。在思考内部的设计细节时,首先需要思考的问题就是:什么是模型(Model)?

什么是模型

还是来看看 Eric Evans 对模型的阐述:

为了创建真正能为用户活动所用的软件,开发团队必须运用一整套与这些活动有关的知识体系。所需知识的广度可能令人望而生畏,庞大而复杂的信息也可能超乎想象。模型正是解决此类信息超载问题的工具。模型这种知识形式对知识进行了选择性的简化和有意的结构化。适当的模型可以使人理解信息的意义,并专注于问题。

如何才能让“庞大而复杂的信息”变得更加简单,让分析人员的心智模型可以容纳这些复杂的信息呢?那就是利用抽象化繁为简,通过标准的结构来组织和传递信息,形成一致的可以进行推演的解决方案,这就是“模型”。模型反应了现实问题,表达了真实世界存在的概念,但它并不是现实问题与真实世界本身,而是分析人员对它们的一种加工与提炼。这就好比真实世界中的各种物质可以用化学元素来表达一般,例如流动的水是真实世界存在的物体,而“水(Water)”这个词则是该物体与之对应的概念,H_2O*H*2O 则是水的模型(同时,H_2O*H*2O 也是化学世界中的统一语言)。

模型往往会作为交流的有效工具,因而会要求用经济而直观的形式来表达,其中最常用的表现形式就是图形。例如轨道交通线网图:

enter image description here

说明:本图来自本地宝的北京城市轨道交通线网图。

该交通线网图体现了模型的许多特点。

  • 首先它是抽象的。与地图不同,它并非现实世界中轨道交通线网的缩影,图中的每条轨道其实都是理想化的几何图形,以线段为主,仅仅展现了轨道线的方位、走向和距离。
  • 其次它利用了可视化的元素。这些元素实际上都是传递信息的信号量,例如使用不同的颜色来区分线路,使用不同大小的形状与符号来区分普通站点与中转站。模型还传递了重要的模型要素,如线路、站点、站点数量、站点距离、中转站以及方向,因为对于乘客而言,仅需要这些要素即可获得有用的路径规划与指导信息。

针对现实世界的问题域建立抽象的模型形成解决方案,这个过程视软件复杂度而定,可能会非常漫长。这其间需要迭代的分析、设计和实现,逐步浮现出最终可行的方案,构建满足需求的软件。从问题域到解决方案域,或许有多种途径或手段,然而针对复杂问题域,通过建立抽象的模型来映射现实世界的多样性,就好似通过数学公式来求解一般,是实践证明可行的道路:

enter image description here

模型的重要性并不体现在它的表现形式,而在于它传递的知识。它是从需求到编码实现的知识翻译器,通过它对杂乱无章的问题进行梳理,消除无关逻辑乃至次要逻辑的噪音,然后再按照知识语义进行归纳与分类,并遵循设计标准与规范建立一个清晰表达业务需求的结构。这个梳理、归纳与分类的过程就是建模的过程,建立的结构即为模型。建模过程与软件开发生命周期的各种不同的活动(Activity)息息相关,它们之间的关系大体如下图所示:

enter image description here

建模活动用灰色的椭圆表示,它主要包括需求分析、软件架构、详细设计和编码与调试等活动,有时候,测试、集成与保障维护活动也会在一定程度上影响系统的建模。为了便于更好地理解建模过程,我将整个建模过程中主要开展的活动称之为“建模活动”,并统一归纳为分析活动、设计活动与实现活动。每一次建模活动都是对知识的一次提炼和转换,产出的成果就是各个建模活动的模型。

  • 分析活动:观察现实世界的业务需求,依据设计者的建模观点对业务知识进行提炼与转换,形成表达了业务规则、业务流程或业务关系的逻辑概念,建立分析模型
  • 设计活动:运用软件设计方法进一步提炼与转换分析模型中的逻辑概念,建立设计模型,使得模型在满足需求功能的同时满足更高的设计质量。
  • 实现活动:通过编码对设计模型中的概念进行提炼与转换,建立实现模型,构建可以运行的高质量软件,同时满足未来的需求变更与产品维护。

整个建模过程如下图所示:

enter image description here

不同的建模活动会建立不同的模型,上图表达的建模过程体现了这三种模型的递进关系。但是,这种递进关系并不意味着分析、设计与实现形成一种前后相连的串行过程,而应该是分析中蕴含了设计,设计中夹带了实现,甚至在实现中回溯到设计,从而形成一种迭代的螺旋上升的演进过程。不过,在建模的某一个瞬间,针对同一问题,分析、设计与实现这三个活动不能同时进行,这就好似开发过程中不能同时戴上重构与功能实现这两顶帽子一般,它们其实是相互影响、不断切换与递进的关系。一个完整的建模过程,就是模型驱动设计(Model-Driven-Design)

不仅仅是建模活动会对模型带来影响,设计者在面对业务需求时,关注的视角不同,抽象的设计思想不同,也会导致模型的不同,这就形成了从建模视角产生的模型分类。如果我们是以数据为核心,关注数据实体的样式和它们之间的关系,由此建立的模型就是“数据模型”。如果我们需要为系统外部的客户端提供服务,关注的是客户端发起的请求以及服务返回的响应,由此建立的模型就是“服务模型”。而领域驱动设计则强调以领域为中心,通过识别领域对象来表达业务系统的领域知识包括业务流程、业务规则和约束关系,由此建立的模型就是“领域模型”。这三种不同的模型,就是不同视角的模型驱动设计获得的结果。因此,整个模型驱动设计可以分为两个不同的维度来表现模型,即建模视角与建模活动。不同的建模视角驱动出不同的抽象模型,而不同的建模活动,也会获得不同抽象层次的模型。这两个维度表达的模型驱动设计如下图所示:

enter image description here

无论分析模型、设计模型还是实现模型,它们皆是对现实世界的抽象,只是抽象的层次和目的不同罢了。如何观察现实世界,又可能影响我们最终获得的模型。当我们将现实世界视为由数据组成的系统时,就可以建立一个由数据实体概念组成的软件世界,并驱动着获得以数据模型为核心的解决方案。当我们将现实世界隐喻为一个 Web 系统时,现实世界的任何事物都是暴露给 Web 系统的资源,这就获得了以服务资源模型为核心的解决方案。当我们将现实世界认为是提供服务行为的容器,并由此产生与消费者的协作,就获得了以服务行为模型为核心的解决方案。当我们将现实世界看做是由核心领域与子领域组合而成的问题域时,我们就将围绕着领域模型为核心,驱动并指导着我们的设计,形成以领域模型为核心的解决方案

Eric Evans 认为模型驱动设计是领域驱动设计中的一种模式。它并没有给出模型驱动设计的定义,只是提出“严格按照基础模型来编写代码,能够使代码更好地表达设计含义,并且使模型与实际的系统相契合。”但我认为,模型的范围要大于领域模型,设计过程也会因为建立模型的不同而各有不同的路径与方向。于是,数据视角产生数据模型驱动设计,服务视角产生服务模型驱动设计,领域视角则产生领域模型驱动设计。在模型驱动的设计过程中,我们获得的模型还将受到建模范式的影响,尤其针对设计与实现,建模范式就意味着设计思想与编程范式的不同,最后获得的模型可能会大相径庭。

因此,要理解和学习领域驱动设计,我们需要辨别各种模型的差异,理解建模范式对模型产生的影响,同样还要认识到:领域驱动设计不过是模型驱动设计中的一种罢了

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

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

相关文章

NETX90-多协议通讯芯片

随着作为信息物理系统核心技术的工业物联网的发展,Hilscher 基于 netX 51/52成功开发了新一代网络控制器netX90,其安全性是产品的核心价值。可实现更高性能的集成,并提高功率效率等级,凭借其较小的外形尺寸能够满足规格尺寸更小的…

C++ 实现单例模式

单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问点。 创建单一实例 怎么让某个类只能创建一个实例? 思路:将类的构造函数私有,然后提供一个静态方法访问对象。调用类内成员函数需要对象,但我们又无法…

css新手教程

css新手教程 课程:14、盒子模型及边框使用_哔哩哔哩_bilibili 一.什么是CSS 1.什么是CSS Cascading Style Sheet 层叠样式表。 CSS:表现(美化网页) 字体,颜色,边距,高度,宽度&am…

Linux信号详解~

目录 前言 一、初识信号 二、信号的概念 三、信号的发送与捕捉 3.1 信号的发送 3.1.1 kill 命令 3.1.2 kill 函数 3.1.3 raise函数 3.1.4 abort函数 3.2 信号的捕捉 3.2.1 signal函数 3.2.2 sigaction函数 3.2.3 图示 四、信号的产生 4.1 硬件异常产生信号 4.2 …

CMake Msys2 搭配vscode

(一)MSYS2介绍 MSYS2(Minimal SYStem 2)是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境,可以在Windows系统中编译和运行许多Linux应用程序和工具。 MSYS2基于MinGW-w64平台,提供了…

Linux---进程间通信 | 管道 | PIPE | MKFIFO | 共享内存 | 消息队列

管道 管道是UNIX中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的数据流称为一个管道。 一个文件,可以被多个进程打开吗?可以,那如果一个进程打开文件,往文件里面写数据,另一个进程打开文…

MySQL 中 int(1) 和 int(10) 会影响存储的长度吗

一、MySQL 中 int(1) 和 int(10) 在MySQL数据库设计中,经常会遇到 int 类型的字段,并会习惯性的指定长度,比如: int(1) 和int(10),而一些新手可能会误解它们之间的关系,认为 int(10) 能够存储更多的数据。…

Android Camera2 API 后台服务

最近在搞CameraAPP需要将Camera2弄成一个后台服务,发现跟预览的Activity没多大变动只是加了Service,和一些简单的修改。之前的公司也用到Camera2,发现用到的时候还是蛮多的所以记录一下,代码在文章末尾 camera2的结构如下&#x…

Peter算法小课堂—Dijkstra最短路算法

大家好,我们人见人爱、花见花开、车见车爆胎的Peter Pan来啦,hia~hia~hia。今天,我们今天来学习毒瘤的最短路算法啦。啊这……什么是Dijkstra算法?长文警告⚠ 正经点啊 手算样例 大家思考一下,你在手算样例的时候&am…

企业申请sectigo ip https证书

Sectigo(原名Comodo,在整合https证书业务后改名为Sectigo)是一家知名的数字证书提供商,拥有多种类型的数字证书,例如单域名https证书、多域名https证书、通配符https证书、IP https证书和代码签名证书等满足各类用户的…

【自然语言处理】P3 spaCy 与 NLTK(分词、词形还原与词干提取)以及 Porter 和 Snowball

目录 准备工作spaCyNLTK 文本分词spaCyNLTK 词形还原spaCyNLTK 词干提取PorterSnowball stemmers 在自然语言处理(NLP)中,文本分词是将文本拆分为单词或词组的过程,这是理解文本含义和结构的基础。Python中两个流行库——spaCy和N…

ThreadLocal父子线程传递上下文参数

自定义ThreadLocal继承InheritableThreadLocal并且实现childValue方法, 可以在子线程中也使用到主线程设置在ThreadLocal中的数据,如下所示: /*** 使用自定义MyInheritableThreadLocal实现了InheritableThreadLocal重写了childValue的目的* …

2024022期传足14场胜负前瞻

2024022期赛事由英超4场,德甲2场、意甲4场、西甲4场组成。售止时间为2月4日(周日)19点00分,敬请留意: 本期中深盘较多,1.5以下赔率3场,1.5-2.0赔率7场,其他场次是平半盘、平盘。本期…

TCP 协议的相关特性

1. TCP格式 TCP特性:有连接,全双关,面向字节流,可靠传输。(TCP安身立命的本钱,初心就是解决“可靠传输”问题) 其实TCP的特征有很多这里我就简单的介绍几个。 2. 确认应答 其实用来确保可靠性&…

mysql的hash排序和例子

哈希索引(hash index),基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每⼀⾏数据,存储引擎都会对所有的索引列计算⼀个哈希码(hash code), 哈希码是⼀个较⼩的值,并且不同键值的⾏计算出来的哈希码也不⼀样。哈希索引将…

Java并发基础:CountDownLatch全面解析!

内容概要 CountDownLatch的优点在于能够简洁高效地协调多个线程的执行顺序,确保一组线程都完成后才触发其他线程的执行,适用于资源加载、任务初始化等场景。它提供了清晰的等待/通知机制,易于理解和使用,是提升多线程程序性能和可…

HttpSession

HTTP概述 HTTP无状态协议和服务器端状态管理 HttpSession 一个用户有且最多有一个 HttpSession,并且不会被其他用户访问到。HttpSession 对象在用户第一次访问网站时自动被创建,你可以通过调用 HttpServeltRequest 的 getSession() 方法获得该对象。 …

mybatis基础操作(一)

mybatis介绍 mybatis为半自动的ORM框架 ORM:对象关系映射,将java中的一个对象与数据表中的一行记录一一对应。支持自定义sql,存储过程。 对原有jdbc进行封装,几乎消除所有jdbc代码,让开发者只需关注sql本身。 支持xml和注解配…

如何在 Mac 上重置网络设置

如何在 Mac 上重置网络设置 Mac 几乎在所有时间都非常可靠,但有时您在连接到互联网时可能会遇到困难或浏览速度缓慢。 互联网可能在您的其他设备上正常工作,这可能很烦人。 通常,问题的原因是什么并不明显,甚至根本不存在。 如果…

面试数据结构与算法总结分类+leetcode题目目录【基础版】

🧡🧡🧡算法题目总结: 这里为大家总结数据结构与算法的题库目录,如果已经解释过的题目会标注链接更新,方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的,同时这也是面试…