horizon client 无法识别域_「领域驱动设计DDD」事件风暴简介:实现域驱动设计的简便方法...

2c944c1d527e6020a8c6b7c314113bed.png

d427967e938c04aa4a418cc88c5b4cd5.png

事件风暴是一种快速,轻量级且未得到充分认可的群体建模技术,它对于加速开发团队而言非常强大,有趣且有用。作为Alberto Brandolini的心血结晶,它是Gamestorming和领域驱动设计(DDD)原则的综合学习实践。该技术不限于软件开发。您可以将其应用于几乎任何技术或业务领域,尤其是那些大型,复杂或两者兼而有之的领域。

事件风暴催化并加速小组学习,通常在几小时或几天内实现更传统的建模技术从未做过的事情 - 对软件必须运行的领域的共同理解。

要了解事件风暴,您首先需要了解两个关键术语。域事件是域专家感兴趣的任何事件。域专家对数据库,Web套接字或设计模式不感兴趣,但对业务领域感兴趣。域事件以不指定特定实现的方式捕获这些事实。

事件风暴如何运作

您运行一个辅助研讨会进行一个活动风暴会议。每个人都参与其中,并且协调人使团队保持专注和参与,指导进展到完整的域模型。该小组从域事件开始,向前和向后遍历模型以确保所有内容都被覆盖。然后,该组添加导致事件的命令或触发器,并考虑所有命令源,包括用户,外部系统甚至时间。

该组识别接受命令和完成事件的聚合,并开始将聚合分组到有界上下文中。在此过程中,识别关键测试场景用户和目标并将其合并到模型中。最后,添加有界上下文之间的关系以创建上下文映射。然后用代码对所得模型进行挑战,以验证组学习并验证模型。

虽然DDD社区的事件风暴正在增长,但在该专业之外几乎不为人知。这是一种耻辱,因为只有主持人必须是DDD从业者才能指导小组走向完整的模型。包括非技术产品所有者在内的每个人都可以参与对域的理解和建模。整个团队了解域越好,软件实施越有可能反映域,这是DDD的主要目的。

走得更快

如果你可以完成这个项目,你刚刚重新完成了,同一个团队,知道你现在知道什么,你能够更快地完成它吗?

是的,因为你已经学会了成功所需要的知识。小组学习速度慢是软件开发过程中的主要制约因素。正如Brandolini所说,“软件开发是一个学习过程;工作代码是一个副作用。”

域事件有助于构建域模型;它们起到了骨骼的作用。这不是设计,它是关于域的模型 - 一个视角。您使用域事件来推动建模,因为技术人员和领域专家都很容易理解。域事件几乎没有关于设计的说明,也没有关于实现的内容,这正是你想要的一个好的域模型。

一种不同的建模方法

更传统的DDD建模工作通常由小组或个人开发人员完成,有时在与产品所有者数据,对象或行为进行几次对话之后。不幸的是,这开始建模的程度太接近实现域,而不是局限于业务领域。如果您从数据建模开始,您的思考和对话将很快转移到模式,事务和其他与业务领域无关的事情。如果从行为建模开始,当您将行为分解为任务并将其链接到流程时,您会分心。

这些是实现概念,而不是业务领域概念。虽然有很多选择来表示数据和实现行为,但域事件没有其他选择。由于域事件表示域的事实,因此这些事件仅在基础业务发生更改时才会发生显着变化。因此,域事件是您模型的更稳定和更具弹性的脚手架

但是这种方法有一个更令人信服的理由:将初始讨论限制在域事件中会迫使每个人,特别是开发人员,专注于域的无处不在的语言。他们必须学习它,定义它,改进它,并在有关模型的对话中专门使用它。

虽然以域事件为中心的模型可能会自然地导致事件驱动的系统设计(EDA),例如事件源命令查询责任隔离(CQRS),但这是一种选择,而不是义务。实现模型的软件不必是事件驱动的,甚至不是面向对象的(尽管这些通常是很好的选择)。

加速小组学习

想想你完成的最后一个项目。开发人员必须做些什么才能理解域模型并构建系统?在发挥故事的过程中,开发人员可能会在域专家解决方案架构师测试用户其他团队成员之间穿梭。虽然这个过程可能会导致所有团队成员对整个域的共同理解,但这不太可能。转移的领域知识过于稀疏,过于分离,过于孤立,而且过于分散,无法在任何单个开发人员的脑海中产生完整的模型,更不用说整个团队理解的常见模型。

相反,这些对话可以在事件风暴会话期间发生。通常这些对话是按顺序发生的,但是在事件发生时,它们都会立即发生。通过这种方式,您可以解决域中任何部分的任何冲突或不连续性,同时所涉及的每个人都在场并参与其中。

DDD的最大障碍是开发人员倾向于专注于他们非常了解的事物 - 软件开发概念 - 而不是业务领域。当非技术人员(例如产品所有者或用户拥护者)与开发人员会面并开始用编程术语而不是商业术语描述系统时,可以看到这种情况的一个症状。如果开发人员不了解域,则无法正确建模。

何时何地使用事件风暴

使用事件风暴最明显的时间是在项目开始时,因此团队可以从对域模型的共同理解开始。使用事件风暴的另一个高回报时间是项目结束的一部分,用于捕获和分享团队在构建软件过程中学到的知识。这很重要,因为没有任何一个开发人员可能因为偶然的发现,修改以及对其他区域的有限暴露而了解整个域。使用较小规模的事件风暴也是有利的,例如当您考虑改变某些事物,开始新故事或制定不同的场景或替代方案时。

尝试一下

事件风暴旨在创建和分享对域模型的共同理解;它不是设计文档,流程图,UML图,部署计划,体系结构图或与实现相关的任何其他内容的替代品。可以将其视为低保真,临时信息辐射器,用于与其他人共享和确认域模型。

尝试一下暴力事件,你将获得多种好处。使用协作组学习,您将实现快速的域驱动建模,而无需每个人都必须成为DDD专家,您的团队和术语将与业务领域专家的一致。这个过程非正式且价格低廉 - 您只需要纸张,便签和笔,您就可以很好地加快团队的工作效率。


请关注公众号:【首席架构师智库】

讨论:请加入知识星球【首席架构师圈】或者小号【jiagoushi_pro】或者QQ群【11107777】

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

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

相关文章

第十篇 数据类型总结

第十篇 数据类型总结 ## 1 按可变类型or不可变类型 可变数据类型不可变数据类型列表数字字典字符串集合元组## 2 按有序or无序 有序无序字符串字典列表集合元组/数字不存在有序或无序一说## 3 按访问类型(查) 直接访问顺序访问(序列类型&…

OpenCV cvtColor()函数

cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。 void cv::cvtColor(cv::InputArray s…

python读取csv某些行_【Python】Python 读取csv的某行或某列数据

站长用Python写了一个可以提取csv任一列的代码,欢迎使用。 Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格:就可以存储为csv文件,文件内容是: No.,Name,Ag…

logback slf4j_强制Tomcat通过SLF4J / Logback登录

logback slf4j因此,您将JAR可执行Web应用程序与Tomcat捆绑在一起 (请务必先阅读其中一个)。 但是,一开始就有这些烦人的Tomcat日志,它们独立于我们的应用程序日志且不可自定义: Nov 24, 2012 11:44:02 PM …

APP测试点总结

1 功能测试 根据产品需求文档编写测试用例  软件设计文档编写测试用例2 兼容性测试 适配性测试手机不同分辨率支持,客户端支持的分辨率等  手机不同版本的支持  手机不同厂家系统的支持  手机不同尺寸的支持安装,卸载测试生成的apk文件在真机上可…

threshold()

一、threshold()函数 1.1 threshold()函数各参数详解 double threshold(InputArray src,OutputArray dst,double thresh,double maxval,int type) 第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。 第…

如何提升python编程能力_Python编程小白如何提升自己的编程能力

1.不使用分号 使用分号在Python中是可选的,对比其他面向对象语言,你不需要在每一条语句后面使用分号。 这看起来很简单,似乎也节省不了多少时间;但一旦你的代码量扩展到数千号,这些分号就变得分心且没有必要键入。 2.找一个称手的…

javascript时间戳和日期字符串相互转换代码

一、日期字符串转时间戳 // 获取当前时间戳(以s为单位)// 第一种方式var timestamps new Date();timestamps timestamps / 1000;// 第二种方式var timestamp Date.parse(new Date());timestamp timestamp / 1000;// 第三种方式var date new Date("2014-07-10 10:21:1…

如何使用Spring设置安全的REST API

众所周知, Spring Boot是一个工具包,可以快速轻松地开发功能强大的Web服务。 它非常模块化,可以与其他框架和工具很好地配合使用。 在本教程中,我将向您展示通过使用Speedment作为ORM对现有SQL数据库设置RESTful API多么容易。 背…

OpenCV imread()函数

imread(const string& filename, int flags1) 例如: //读入图像单通道,即灰度图 ScrImage imread("C:\\Users\\Desktop\\opencv_1.jpg", 0);imread函数从文件中加载图像并返回该图像。如果该图像不能被读取&#x…

layui横向时间线_炒股一生只买一种股票:股价K线形成这样后,必然有一波拉升...

在上升趋势中做多; 在下跌趋势中做空; 在震荡区间顶部做空、底部做多。大趋势像是遛狗的主人,他走的比较慢;狗就像中短期的走势,活蹦乱跳,有时候跑过头,又会回来找主人一下,然后再去东闻闻、西嗅嗅。最后你…

最小二乘

1.最小二乘的背景 这种东东的来源,比较容易找到而且比较靠谱的途径自然是wiki百科了,以下部分的内容来自wiki百科: 1801年,意大利天文学家朱赛普皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运…

团队冲刺计划第八天

1、 所有工作的预期时间:96h 目前已经花的时间:78h 还剩余的时间:18h 2、任务看板 3、冲刺会议照片: 4、燃尽图: 转载于:https://www.cnblogs.com/532BEST/p/10871189.html

[Linux]Linux下经常会用到的简单实例(持续更新)

1、查找某些进程并结束他们: ps -elf | grep 进程关键字 | awk {print $4}| xargs kill -9 解析: ps -elf 的 -e 代表列出所有进程,-l 代表长格式,-f 代表完整的格式 grep的工作方式是这样的,它在一个或多个文件中搜索…

elupload获取文件名与路径_Uipath获取文件名,路径,扩展名等操作

Uipath获取文件名,路径,扩展名等操作东京IT青年前线​www.rpatokyo.com使用Assign Activity,声明一个字符串变量为str获取文件路径代码System.IO.Path.GetDirectoryName(“C:UsersAdministratorDesktop备课二回目css基础.pptx”)运行&#xf…

servlet3.0新特性_查看Servlet 3.0的新增功能

servlet3.0新特性随着JEE6规范上市,在企业应用程序领域中如何开发应用程序方面发生了一些重大变化。 在本文中,我将介绍有关Web应用程序开发的一些更改。 首先,请告别web.xml部署描述符(至少是其中的一部分)。 好吧&am…

Android(2)-----Fragment //(第七周后的知识)

1、Fragmentandroid.app.Fragment版本://v4版本是为了由3.0向下兼容到1.6,改那个Fragment文件里的import android.support.v4.app.Fragment;换成 import android.app.Fragment;!!!!!&#xff01…

延迟加载是一种代码气味

您见过那些具有许多属性的巨大物体吗? 这些域对象由于不希望从数据库检索太多信息而在其中使用延迟加载? 我敢打赌你有这种令人怀疑的快乐。 今天,我想与大家分享我对它们的印象- 使用延迟加载应该被视为一种代码味道! 让我解释…

c#时间函数

我们可以通过使用DataTime这个类来获取当前的时间。通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04)、时间(12:12:12)、日期时间(2008-09-04 12&…

gbk编码在线转换工具_TOOLFK工具-在线汉字/字母/人民币/简繁体转换工具

本文要推荐的[TOOLFK]在线汉字/字母/人民币/简繁体转换工具,提供简繁体在线转换、人民币大写转换、字母大小写互转、汉字转拼音在线日常使用工具。網站名稱:ToolFk網站鏈結:https://www.toolfk.com/工具链接:https://www.toolfk.com/tool-onl…