领域驱动设计总结——如何发掘深层次模型

简介: 本文为领域驱动设计系列总结的第四篇,主要对领域驱动设计概念做个介绍,本系列领域驱动设计总结主要是在Eric Evans 所编写的《领域驱动设计》 一书的基础上进行归纳和总结。本文主要介绍在领域驱动设计中如何发掘深层次模型。

本文为领域驱动设计系列总结的第四篇,主要对领域驱动设计概念做个介绍,本系列领域驱动设计总结主要是在Eric Evans 所编写的《领域驱动设计》 一书的基础上进行归纳和总结。本文主要介绍在领域驱动设计中如何发掘深层次模型。

通过前面介绍的知识,我们已经可以创建具体的领域模型,并且维护模型和实现之间的对应关系。但这还不够,真正的挑战是找到深层次的模型,我们的最终目的是开发出能够捕捉到领域深层含义的模型。

一 什么是深层次模型?

深层次模型就是能够穿过领域表象,清楚地表达出领域专家们的主要关注点以及最相关的知识的模型。

1.1 持续重构

我们知道重构就是在不改变软件功能的前提下重新设计它。在领域驱动设计中,重构不仅可以改善代码设计,也可以在使我们加深对领域的理解。通过持续重构,消化知识,加深对领域的理解,从而慢慢积累逐渐汇聚成深层模型,这些改进即使脱离不开常规的概念框架,也可以逐渐加深我们对模型理解,最终使得我们发现深层模型。

1.2将隐式概念转变为显式概念

深层建模的第一步就是要设法在模型中表达出领域的基本概念。随后,在不断消化知识和重构的过程中,实现模型的精化。但是实际上这个过程是从我们识别出某个重要概念并且在模型和设计中把它显式地表达出来的那个时刻开始的。

若开发人员识别出设计中隐含的某个概念或是在讨论中受到启发而发现一个概念时,就会对领域模型和相应的代码带来很大的改变。

1.2.1 概念发掘

我们可以通过以下几种方式进行概念发掘:

  • 1. 倾听领域专家语言,发现一些可表达复杂业务逻辑的术语。
  • 2. 检查自身不足之处,通过挖掘一些深层次的概念。
  • 3. 思考模型中矛盾之处,思考对立的两种看法是如何同时应用于同一个外部现实的。
  • 4. 查阅书籍,查阅相关领域的专业书籍,了解相关领域专业知识。
  • 5. 不断尝试新的思路,找到一个看起来足够清晰且实用的概念。

1.2.2 为不太明显的概念建模

  1. 显示的约束,如果约束的存在掩盖了对象的基本职责,或者如果约束在领域中非常突出但在模型中却不明显,那么就可以将其提取到一个显式的对象中,甚至可以把它建模为一个对象和关系的集合。
  2. 封装过程,将经常被使用的过程,单独封装为一个对象,在模型及代码中显示的表达出来。
  3. SPECIFICATION(规格),将领域中的规则单独提取出来,方便灵活组合使用。

二 柔性设计

2.1 什么是柔性设计

柔性设计(supple design)就是让人们乐于使用,而且易于做出修改的设计。柔性设计是对深层建模的补充。柔性设计能够揭示深层次的底层模型,并把它潜在的部分明确地展现出来。客户开发人员可以灵活地使用一个最小化的、松散耦合的概念集合,并用这些概念来表示领域中的众多场景。设计元素非常自然地组合到一起,其结果也是健壮的,可以被清晰地刻画出来,而且也是可以预知的。

2.2 实现柔性设计的方式

  1. 1. 释意接口(INTENTION-REVEALING INTERFACES),在给类和它的操作命名时, 要描述它们的效果和目的,而不要表露它们是通过何种方式实现的 。
  2. 2. 无副作用模式(SIDE-EFFECT-FREE FUNCTION)尽可能把程序的逻辑放到函数中,因为函数是只返回结果而不产生明显副作用的操作。
  3. 3. 断言(ASSERTION),使用断言把副作用明确地表示出来。
  4. 4. 概念轮廓(CONCEPTUAL CONTOUR),在连续的重构过程中观察发生变化和保证稳定的规律性,并寻找能够解释这些变化模式的底层概念轮廓。使模型与领域中那些一致的方面相匹配。
  5. 5. 独立的类(STANDALONE CLASS)可以将模型一直精炼下去,直到每个剩下的概念关系都表示出概念的基本含义为止。尽量将依赖关系的个数可以减小到零,得到一个完全独立的类。
  6. 6. 闭合操作(CLOSURE OF OPERATION),参数和返回值应该是相同的类型,并且实现者最好也是相同的类型,形成闭合操作,更常用于VALUE OBJECT的操作。
  7. 7. 声明式设计。

2.3 如何进行柔性设计?

1. 分割子领域

我们无法一下子就能处理好整个设计,而需要一步一步地进行。我们从系统的某些方面可以看出适合用哪种方法处理,那么就把它们提取出来加以处理。重点突击某个部分,使设计的一个部分真正变得灵活起来,这比分散精力泛泛地处理整个系统要有用得多。

2. 尽可能利用已有的形式

我们不能把从头创建一个严密的概念框架当作一项日常的工作来做。在项目的生命周期中,我们有时会发现并精炼出这样一个框架。但更常见的情况是,可以对你的领域或其他领域中那些建立已久的概念系统加以修改和利用。柔性设计可以极大地提升软件处理变更和复杂性的能力。柔性设计在很大程度上取决于详细的建模和设计决策。柔性设计的影响可能远远超越某个特定的建模和设计问题。我们将把它作为一种工具,用来精炼领域模型,以便使大型和复杂的项目更易于掌握。

三 应用分析模式与设计模型

分析模式

深层模型和柔性设计并非唾手可得。要想取得进展,必须学习大量领域知识并进行充分的讨论,还需要经历大量的尝试和失败。但有时我们可以直接借鉴前人积累的经验。可以尝试使用《分析模式》一书中列举的各种模式,来借鉴获取深层模型和柔性设计。

设计模式

为了在领域驱动设计中充分利用设计模式,我们必须同时从两个角度看待它们:从代码的角度来看它们是技术设计模式,从模型的角度来看它们就是概念模式。比如我们可以使用STRATEGY模式对不同的业务策略进行封装和设计,使用COMPOSITE模式来对嵌套容器的关联性业务进行建模等等。

把设计模式用作领域模式的唯一要求是这些模式能够描述关于概念领域的一些事情,而不仅仅是作为解决技术问题的技术解决方案。


以上介绍的柔性设计总体结构如下:


下面再将柔性设计与领域模型结构关联起来:


相关文章
|
JavaScript
vant/vue——在van-tab中写入内容使其中间部分进行滚动
在van-tab中写入内容使其中间部分进行滚动
860 0
|
XML SQL Java
Mybatis之转义符的使用姿势
在 mybatis 的 xml 文件中直接写 sql 比较方便简洁,但是需要注意的是,在 xml 文件中,经常会遇到一些需要转义的场景,比如查询 id < xxx的数据,这个小于号就不能直接写在 sql 中,接下来我们将看一下,mybatis 中的有哪些转义符,可以怎么处理转义问题
1014 0
Mybatis之转义符的使用姿势
|
消息中间件 安全 NoSQL
2023春招面试专题:高并发解决方案(三)
2023春招面试专题:高并发解决方案
256 0
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
319 2
|
数据安全/隐私保护 Python Windows
三种方法,Python轻松提取PDF中全部图片
三种方法,Python轻松提取PDF中全部图片
491 3
|
11月前
|
安全 Java 测试技术
springboot之SpringBoot单元测试
本文介绍了Spring和Spring Boot项目的单元测试方法,包括使用`@RunWith(SpringJUnit4ClassRunner.class)`、`@WebAppConfiguration`等注解配置测试环境,利用`MockMvc`进行HTTP请求模拟测试,以及如何结合Spring Security进行安全相关的单元测试。Spring Boot中则推荐使用`@SpringBootTest`注解简化测试配置。
415 4
|
开发工具 图形学 Android开发
从零开始的unity3d入门教程(一)----环境配置
该文章是《从零开始的Unity3D入门教程》系列的第一篇,详细介绍了Unity3D的环境配置过程,包括注册Unity账户、下载安装Unity Hub和Unity编辑器、配置许可证、创建Unity项目、下载安装Visual Studio 2022以及将Unity与Visual Studio相关联等步骤。
从零开始的unity3d入门教程(一)----环境配置
|
存储 机器学习/深度学习 设计模式
笔记 - 《领域驱动设计:软件复杂性应对之道》
笔记 - 《领域驱动设计:软件复杂性应对之道》
|
机器学习/深度学习 算法 数据可视化
K-means聚类算法:原理、实例与代码分析
K-means聚类算法:原理、实例与代码分析
3673 0
|
存储 Windows
Cheat Engine基本使用方法
Cheat Engine基本使用方法
1577 2