我们要如何描述一个系统呢? 可以从不同的角度观察,好比瞎子摸象,你摸到甚麽部位,系统就像那一个局部,那就惨了,因此,建议不要局限於方法论,应该从各种视角去观察系统。
图一. 系统观察的视角(Viewpoints)
从上一篇知道 DFD 是从资料的流动与处理的角度观察系统的功能,Yourdon随後提出的个案是以事件为出发点描述系统,而领域驱动设计则是以事件加上实体(物件)角度出发,并且都加强了一些内容描述与整合,下面就来介绍相关的作法。
领域驱动设计以下简称DDD。
事件风暴(Event Storming)是高阶需求讨论的一种手法,由 Alberto Brandolini 於2013年提出,它举办的方式类似IBM的Joint application design(JAD)、SCRUM的冲刺计划会议(Sprint planning meeting),是一种敏捷(Agile)的手法,想法是尽早让使用者参与专案,以免像传统的瀑布型开发方式,到了系统开发末期,一翻两瞪眼,使用者说『这不是我要的』,就前功尽弃了。一般作法就是邀请重要的利害关系人,包括领域专家、使用者、专案开发成员一起讨论愿景与需求,通常是先发散(Diverge)再收敛(Converge),先由所有人脑力激荡,天马行空的提出各种想法,然後,再由主持人将想法合并归类,事件风暴的作法是以事件为导向,整理出事件的触发者、包含的实体及相关的讯息,包括参与的角色与权限等。
相关的手法可参考JAD、SCRUM,以下只列举几点说明:
图二. SCRUM 白板,图片来源:dreamstim
JAD订定九项关键步骤(Key Steps),可以参考,每个步骤应该有哪些产出,不过,DDD在此阶段最重要的产出应该是:
领域范围(Bounded Context):有人直翻为【限界上下文】,界定整体系统的范围,并划分各个子系统的界线,如下图。
图三. 领域范围(Bounded Context),图片来源:Using domain analysis to model microservices
接着对每个领域范围作进一步的分析,找出范围内所有的事件,并清楚定义触发者(Command)、Actor/User及处理流程,再从流程中提取实体(物件),进而聚合(Aggegate)。
事件的触发者有很多种:
维基百科有非常棒的定义,最後整理成图四,复杂一点可能变成图五,围绕整个办公室。
图四. 事件风暴的产出,图片来源:Model Event Storming Results in Context Mapper
图五. 事件风暴的产出奇观,图片来源:Make Collaboration Better with Event Storming
最後将事件风暴的产出整理成表格,或像DFD的Context Diagram,就是一份很完整的高阶系统规划书。
图七. 领域范围(Bounded Context) + 实体(Entity),图片来源:How the Domain-Driven-Design is the ideal architecture to develop IoT Services?
透过以上的活动,我们就可以得到一个系统的全貌,接下来由上向下(Top Down)展开,逐步细致化,就可以完成整个系统的设计与开发。
<<: 前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day23 上传会员照片
以前在写应用程序的时候因为不懂、方便、随性等各种原因,所以就在根目录建立资料夹,把照片影片都往里面丢...
addEventListener 事件监听 JavaScript 是一个事件驱动 (Event-dr...
先前将主机已经注册上去了 那接下来就是进到『Task Definitions』开始来建立服务 点选『...
Nertal network(NN)的概念其实很早就发明出来了,但直到1986年backpropag...
新增删除操作 # 载入pandas import pandas as pd if __name__ ...