工作坊 | 领域驱动设计中的事件建模

这两日,我参加了Implementing Domain Driven Disign一书作者Vaughn Vernon组织的IDDD Workshop。培训中,Vernon带领我们针对Domain Event进行了一次建模工作坊。

在领域驱动设计中,Domain Event变得越来越重要。在Implementing Domain Driven Disign这本书中,Vaughn Vernon甚至将Domain Event上升到了一等公民的地位。

那么,Domain Event到底是什么?Domain Event即领域事件,是指领域中发生的事实(facts)。当满足某个条件时,某个发起者就会触发事件产生。因而在对事件建模时,我们可以关注统一语言中如下的关键词汇:

  • “当…”
  • “如果发生…”
  • “当…的时候,请通知我”
  • “发生…时”

事件为事实(fact)”这一描述让我对“事件”本身有了更准确的认识。它让我想起两篇发表在InfoQ上的文章。一篇文章为《Datomic的架构》。文中提到:“信息是一组事实(facts),事实是指一些已经发生的事情。鉴于任何人都无法改变过去,这也意味着数据库将累积这些事实,而非原地进行更新。虽然过去可以遗忘,但却是不能改变的。”同理推之,若事件即事实,那么它也是不可改变的。对于这些历史发生的“事实”,我们需要“立此存照”——于是,这就引出了Event Store或者Event Sourcing。我会在后续的文章深入分析Event Store与Event Sourcing。

另一篇文章是徐昊的《运用四色建模法进行领域分析》。文中表达了类似的思想:“任何的业务事件都会以某种数据的形式留下足迹。我们对于事件的追溯可以通过对数据的追溯来完成。……你无法回到从前去看看到底发生了什么,但是却可以在单据的基础上,一定程度的还原当时事情发生的场景。当我们把这些数据的足迹按照时间顺序排列起来,我们几乎可以清晰的推测出这个在过往的一段时间内到底发生了那些事情。”

在四色建模分析法中,徐昊认为应该将“时标性对象(moment-interval)”作为建模的起点。我在这里并不是要介绍四色建模法,这个话题留待以后再讲。我试图阐释的观点在于,如果事件与时间相关,那么在对事件进行建模时,就可以针对业务场景确定一条时间线,并通过分析业务状态的各种变迁,得到我们希望获得的事件模型。这正是这个工作坊的切入点。

整个事件建模的活动可以分为四个步骤:

  1. 选定某个自己熟悉的领域,然后针对时间线去寻找那些用过去时态表现的事件;找到这些事件后,用黄色即时贴写出事件名称,形式如:OrderFilled。
  2. 针对每个事件,对触发事件的Command对象进行建模,并用绿色即时贴写出Command的名称。对Command对象进行建模并非单纯地为了寻找Command对象,而是为了更深一步地验证之前建模的事件模型。在思考触发事件的对象时,我们可能会发现一些遗漏又或者多余的事件。
  3. 判断这些事件应该属于哪个聚合对象,找到它们,然后写在紫色即时贴上。
  4. 对这些识别出来的Event、Command、Aggregate进行分类,判断它们到底属于哪个Bounded Context,并用红色即时贴标出。

这种Workshop不仅只针对培训,它更应该运用到团队进行领域驱动设计的过程中。这也正是我一直在提倡的所谓“可视化设计”。可视化设计并非一个噱头,更不是为了美观好看,而是希望以直观简单的形式展现设计思路,尤其需要让整个团队成员都能以协作互动的形式参与到这个设计过程中。群策群力,头脑风暴,如此方能获得更好的设计方案,并以这种团队行为的方式完成知识的共享与传递。其实,“架构”究竟是什么,不就是一种软件设计的知识吗?设计架构,重要在于交流,在于知识传递,而不仅仅是严谨完整的解决方案文档。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2014-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

学好 Python 的 11 个优秀资源

Python是目前最流行、最易学最强大的编程语言之一(学习Python的五大理由),无论你是新手还是老鸟,无论是用于机器学习还是web开发(Pinterest就...

3214
来自专栏云资讯小编的专栏

一个应用的云化之路

本文是 OStorage(奥思数据)创始人、知名 OpenStack 布道师李明宇在2016年腾讯“云+未来”峰会 Cloud Native 专场有关《一个应用...

2440
来自专栏腾讯移动品质中心TMQ的专栏

【探索式测试基础系列】生活协奏曲

前文讲过,探索式测试能为平常的生活带来浪漫因子,在浪漫一段时间后,新奇感消失,但效果仍在,探索式测试与日常测试真正融为一体,深刻作用于产品质量保证,共同演奏出协...

2727
来自专栏非著名程序员

腾讯发布 2017 年度代码报告

? 昨天腾讯发布了 2017 年度代码报告。整份报告对腾讯去年整个 2017 年度的研发数据进行了统计,涵盖代码、开发者、语言等基础数据。根据报告显示: 腾讯...

4199
来自专栏生信技能树

幸运的你,可以看到一个网页工具是如何开发成功的

一直都知道自己不擅长写代码,也实在是没有学过或者刻意锻炼过软件项目开发相关知识。但是对生物信息学来说,这些都是低频需求,除非是疯狂的热爱,一般我不会建议大家过多...

3629
来自专栏菩提树下的杨过

ROR学习笔记(2):Asp.Net开发者看ROR

ROR集成了诸多"先进"的理念,比如mvc,模板替换,orm,实体验证,ajax,数据库迁移,session的多种保存机制...等等,也许在今天看来,这些东西都...

1678
来自专栏ThoughtWorks

重构的七宗罪 | TW洞见

今日洞见 文章作者/配图来自ThoughtWorks:禚娴静。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网...

3195
来自专栏大数据挖掘DT机器学习

R&Python玩家诉求词云分析

作者:Fish http://www.gamedas.com 一、数据爬虫 在实际工作中,数据的来源不能局限于自家的数据库或者成型的后台,在做某些市场分析或是竞...

3216
来自专栏web前端教室

【结构】前端开发要不要学习算法、数据结构?它有什么用?感觉工作中用不到呀

前端开发的日常工作更多的是围绕着需求和业务逻辑来展开,用js操作的也是json和dom会比较多一些,那么在这样的日常工作中,如何体现出“扎实的数据结构和算法”的...

1558
来自专栏华章科技

毁掉你代码的35个不良习惯

近日web开发专家Christian Maioli总结了导致程序猿效率低下,代码像意大利面条一样难以维护的35条恶习(归为代码组织、团队工作、写代码、测试与维护...

751

扫码关注云+社区