【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)

news2024/11/15 23:47:40

一文带领你透视DDD领域驱动模型的本质和设计原理分析指南

  • 前提介绍
  • 传统的软件设计方案
    • 瀑布设计方法
    • 敏捷方法学
      • 敏捷方法学的问题和局限性
  • 构建领域知识
    • 认识和了解领域内容
      • 实体模型介绍分析
        • 飞行计划
          • 路线(route)
          • 路线(route)
        • 领域专家进行交流,相互交换知识
        • 挖掘出关键的领域概念
        • 创建领域模型
    • 面向人群
    • 主题方向
  • 推荐学习
    • 领域驱动设计——软件核心复杂性应对之道
    • 领域驱动设计建议

前提介绍

本章内容主要介绍了领域驱动设计的原则,这些原则应用后将有助于开发团队更好地对领域内复杂问题进行建模和实现。领域驱动设计融合了设计和开发实践,并演示了它们如何协同工作以创建更好的解决方案。好的设计可以加速开发过程,而开发过程中的反馈可以进一步优化设计。

传统的软件设计方案

传统的软件设计方案主要有两种模式:瀑布设计方法和敏捷设计方法,这两种大家应该都知道,那么为了都学习一下,所以我们暂时简单的介绍一下这两种方案。
在这里插入图片描述

瀑布设计方法

瀑布设计方法是软件设计的一种传统方法,这种方法存在单向流动的知识沟通,业务专家、分析人员和开发人员之间缺乏反馈信息交流,其中包含多个阶段。

  1. 业务专家提出需求
  2. 分析人员根据需求创建模型并传递给开发人员编码。

虽然该方法在过去被广泛采用并获得一定程度的成功应用,但它也有其缺点和局限性。

敏捷方法学

敏捷方法学,如极限编程(XP),是一种与瀑布方法不同的方法学。它们旨在应对预先难以确定所有需求,尤其是需求经常变化的情况。

在这种情况下,预先创建一个覆盖领域所有方面的完整模型是困难的。敏捷方法试图解决“分析瘫痪”问题,即团队成员因害怕做出设计决策而无所作为。

敏捷方法的倡导者认识到设计决策的重要性,但反对预先设计。相反,他们使用大量灵活的实现,通过由业务涉众持续参与的迭代开发和许多重构,开发团队更多地学习到了客户的领域知识,从而能够产出满足客户需要的软件。

敏捷方法学的问题和局限性

虽然敏捷方法提倡简单,但每个人都有自己的简单意义,因此存在问题和局限。此外,由于缺乏真正可见的设计原则,开发人员执行的持续重构可能会导致代码更难理解或改变。虽然瀑布方法可能导致过度工程,但对过度工程的担心可能会导致害怕做出深度、彻底的设计。

构建领域知识

以飞机飞行控制系统为例,我们可以看到领域知识是如何被构建的。在任何时刻,空中都会出现成千上万的飞机,每架飞机都按照自己的路径飞往目的地,显然要确保它们不会相撞。这时我们需要一个飞行监控系统,它能跟踪在指定区域内的所有航班,并判断这些飞机是否遵循了预定的航线。通过这个小的子集系统,我们就可以实现飞机在飞行中的全面监控。

认识和了解领域内容

在软件开发的视角下,我们应该从领域的理解入手。

在本例中,我们应该从空中交通监控开始。控制人员是领域内的专家,但他们并不是系统设计人员或者软件专家,因此不能期望他们会提供完整的问题域描述。

因此,我们需要通过与控制人员交流和分析数据来逐步了解该领域的内部结构,以此来设计和实现一个高效的空中交通监控系统。

实体模型介绍分析

控制人员和你都认同每个飞机都有一个起始机场目的机场,因此,我们已经确定了“飞机”、“起始机场”和“目的机场”这三个需要考虑的实体,如下图所示:
在这里插入图片描述

飞机从某地起飞又在另一地降落,但空中发生了什么?班机会按照什么路线航行?

事实上,我们更关心的是它在航行时所发生的事情,控制人员说会给每架飞机指派一个飞行计划,飞行计划会用来描述假定的整个空中旅行。当听到“飞行计划”时,你可能会在你脑海中想到这是一个飞机在空中必须遵守的路径。

飞行计划

路线(route)

路线(route)包含了飞机航行中的一个重要概念,那就是飞机在飞行时要做的事,它们必须遵照一条路线

很明显飞机的出发点和目标点也就是路线的开始和结束点,所以,不同于将飞机与出发点和目标点管理,看上去更自然的是将它与“路线”进行关联,然后路线再与适当的出发点和目的地关联。
在这里插入图片描述
当你与控制人员交流飞行器需要遵循的路线时,你会发现路线是由许多小的区间段组成的,这些区间段按照一定的顺序连接起来,形成了从起点到终点的一条曲线,这条曲线穿过了多个预定的方位点。

路线(route)

路线可以被看做是由一系列连续的方位点组成的,而以前你可能将起点和终点看作是路线的结束点,但现在你只把它们看作是整个路线中的两个方位点。尽管这种看法可能与控制人员的看法存在很大的不同,但这是必要的抽象,对于后续的工作来说是很有帮助的。这些发现为路线的计划提供了新的思路,具体的变化如下图所示:
在这里插入图片描述
这图中展示了另一个元素,即路线中的每个方位点实际上是在空间中的一个三维点,即具有经度、纬度和高度三个维度坐标。但当你与控制人员谈论路线时,你会发现他们并不是按照这种方式来思考的。实际上,他们将路线视为飞机航班在地球上的映射。因此,每个方位点只是地球表面上的一个点,可以用经度和纬度来表示。因此,正确的图应该是:

在这里插入图片描述

主要的步骤流程如下所示:

在这里插入图片描述

领域专家进行交流,相互交换知识

你提出问题,他们回答,从而从空中交通领域中挖掘出基础概念。这些概念可能看起来不完美,没有组织,但它们却是理解领域的基础。学习领域知识时,你应该尽可能多地向专家学习。通过正确提问和信息处理,你和专家会开始勾勒出领域的骨架模型。这种模型可能不完整,也不能保证是正确的,但它可以作为了解领域基础概念的起点

挖掘出关键的领域概念

在软件设计中,软件架构师或开发人员需要和领域专家进行长时间的讨论。他们需要获取领域专家的知识,并将其转换为有用的形式。他们可能需要建立早期的原型,以验证系统是否按照预期工作。在交流和反馈的过程中,他们可能会发现模型或方法中的问题,并希望对其进行改进。这种交流不再是单向的,而是有着反馈的双向过程。这有助于我们更好地建立模型,从而获得更清晰、更准确的对模型的理解。领域专家掌握很多专业技能,但他们通常以特殊的方式组织和使用这些知识,这可能对将它们实现到软件系统中带来困难。

创建领域模型

通过与领域专家的交流,软件设计人员的分析思维会帮助挖掘出关键的领域概念,并创建可用于将来讨论的结构。作为软件专家和领域专家,我们一起创建领域模型,该模型反映了这两个领域的交集。虽然这个过程很耗费时间,但它必须这样做,因为软件的主要目的是解决真实领域中的业务问题,所以必须与领域完美结合。


面向人群

无论你是企业架构师、团队领导者、项目经理还是高级软件开发人员,本文章都可以帮助你正确理解领域驱动设计,并同时实现你的业务目标和技术目标。

重点决策人群:团队领导者、技术架构师、项目经理和业务架构师。

主题方向

Java、.NET、SOA、Agile、Ruby 和 Architecture。

推荐学习

《领域驱动设计——软件核心复杂性应对之道》(Addison-Wesley 2004,已由清华大学出版社翻译出版)。

领域驱动设计——软件核心复杂性应对之道

它提供了一个建模和设计技术的系统,成功的团队应用这一系统可以组装有业务需求的复杂软件系统,并使系统在增大时仍然保持敏捷。

Domain Language 是一个咨询小组,它指导和训练团队实施领域驱动设计,帮助他们使自己的开发工作对业务而言更有生产力和更有价值。

领域驱动设计建议

  1. 亲力亲为,模型需要代码支持。
  2. 专注于具体场景,将抽象思维应用到具体案例中。
  3. 不要试图对所有事情都进行领域驱动设计。可以画一张范围表,然后决定哪些应该进行领域驱动设计,哪些不需要。不必担心边界之外的事情。
  4. 不断进行实验,期望能够发现错误。模型的创造过程需要不断尝试和改进。

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

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

相关文章

一台服务器最大能支持多少条 TCP 连接

一、一台服务器最大能打开的文件数 1、限制参数 我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是: fs.file-max (系统级别参数)&a…

npm发布自己的包

按照上面流程操作

基于Echarts构建停车场数据可视化大屏

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

XSS—存储型xss

xss >跨站脚本攻击>前端代码注入>用户输入的数据会被当做前端代码执行。 原理:使用者提交的XSS代码被存储到服务器上的数据库里或页面或某个上传文件里,导致用户访问页面展示的内容时直接触发xss代码。 输入内容后直接在下方回显,回…

【Python 随练】今天是哪一天?

题目: 输入某年某月某日,判断这一天是这一年的第几天? 简介: 在本篇博客中,我们将使用Python代码解决一个日期相关的问题:如何确定某一天是给定年份的第几天。我们将提供问题的解析,并给出一…

领导看了给你加薪!python +ddt+excel 一招鲜,接口自动化测试轻松搞定,测试报告惊艳四座!

“ 接口自动化测试是指通过编写代码或使用工具,模拟用户发送请求,验证接口是否符合设计规范和功能需求的过程。” 如何用 python ddtexcel 实现接口自动化测试 接口自动化测试可以提高测试效率和质量,节省测试成本和时间,保证测试…

使用PyTorch执行特征提取和微调的迁移学习来进行图像分类

使用PyTorch执行特征提取和微调的迁移学习来进行图像分类 1. 效果图2 项目结构3 什么是迁移学习4 如何使用PyTorch进行迁移学习?5 花朵数据集源码train_feature_extraction.pyfine_tune.pyinference.py 参考 这篇博客将介绍如何使用PyTorch深度学习库执行图像分类的…

U盘重装系统Win10详细步骤和方法

当前超多的用户都在使用Win10系统,有些用户想使用U盘来重装一下Win10系统,但不知道具体怎么操作,其实操作起来难度不会很大,可以按照以下小编给大家分享的U盘重装系统Win10详细步骤和方法,就能轻松顺利完成U盘重装系统…

Jetson TX2 NX的GPIO引脚使用方式

Jetson TX2 NX是一款高性能的嵌入式AI计算平台,其中引脚的设计和使用对于开发人员来说非常重要。在本文中,我们将会介绍Jetson TX2 NX的引脚并说明其功能和使用方式。 官方文档官方文档 引脚概述 Jetson TX2 NX具有许多不同类型的引脚,包…

C++ 类的构造函数和析构函数

目录 类的构造函数和析构函数构造函数声明构造函数定义构造函数使用构造函数默认构造函数 析构函数析构函数的声明析构函数的定义 改进Stock类(加入构造函数和析构函数) 类的构造函数和析构函数 构造函数 常规的初始化语法不适用类的初始化 例如: int a 10;//整…

Deepin20.9 安装Mysql

文章目录 mysql下载查看 mysql 状态卸载卸载mysql:清理残留数据检查是否删除完毕 mysql Deepin 安装 下载 从网上下载 https://dev.mysql.com/get/mysql-apt-config_0.8.23-1_all.deb 安装 mysql-apt-config 下载文件名: mysql-apt-config_0.8.23-1_all.deb …

PoseiSwap IDO 即将开启,一览 $POSE 经济模型

以太坊创始人 Vitalik Buterin 曾在今年以太坊黑山大会上,进行了以“以太坊的三个技术挑战:扩容、隐私和用户安全”为主题的演讲,阐明了具有隐私性、可扩展性和安全性的且易访问的区块链生态将是行业发展趋势,或许重复造轮子正在变…

【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

前言 大家好,我是秋意零。 上一篇中介绍了,Pod 的服务对象,从而对 Pod 有了更深的理解; 今天的主题是 Pod 健康检查和恢复机制,我们将结束 Pod 的内容。 最近搞了一个扣扣群,旨在技术交流、博客互助&am…

图像中提取文本

将从此图像中提取文本。我使用得是 PyCharm,您随意编辑器或IDE 1、下载所需得库和exe文件: tesseract-ocr 可执行exe文件下载后,安装时无需指定安装目录。 http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3…

代码随想录二刷day25 | 回溯 之 216.组合总和III 17.电话号码的字母组合

216.组合总和III 题目链接 解题思路: 选取过程如图: 图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。 递归三部曲 确定递归函数参数 和77. 组合 一样,依然需要一维数组path…

走进人工智能|深度学习 算法的创世纪

前言: 深度学习通过训练深层神经网络模型,可以自动学习和提取数据的特征,包括更准确的图像识别、自然语言处理、医学诊断等方面的应用。 文章目录 序言背景算法的创世纪技术支持应用领域程序员如何学总结 序言 深度学习是一种机器学习方法&a…

easyui05(datagrid数据新增)

一.对话框&#xff1a;Dialog 加载页面 <div id"myDialog" style"display:none"></div> 二.editGoods.jsp 表单 myForm <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <tit…

2023年互联网Java面试复习大纲:ZK+Redis+MySQL+Java基础+架构

多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考核算法题这个流程下来的。有些公司可能还会问几个实际的场景类的问题&#xff0c;这个环节阿里是必问的&#xff0c;这种问题通常是没有正确答案的&#xff0c;就看个人的理解&#xff0c;个人的积累了…

Vue练手项目之仿京东到家主页

目录 概述1.效果展示2.使用原始HtmlCSS实现3.使用Vue.js进行组件化3.1 Header部分组件实现3.1.1图标的展示3.1.2 定义Vue调试的名称3.1.3 使用scoped隔离组件间的css影响 3.2 附近店铺部分实现3.3 底部导航栏组件的实现3.4 将组件组成一个整体页面 4.代码地址 概述 本人是一个…

【微信小程序开发】第 9 课 - 小程序的协同工作和发布

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、协同工作 1.1、了解权限管理需求 1.2、了解项目成员的组织结构 1.3、小程序的开发流程 2、小程序成员管理 2.1、成员管…