领域场景分析的6W模型

简介: 领域场景分析的6W模型

在软件构造过程中,我们必须正确地理解领域。一种生动的方式是通过“场景”来展现领域逻辑。领域专家或业务分析师从领域中提炼出“场景”,就好像是从抽象的三维球体中,切割出具体可见的一片。然后以这一片场景为舞台,上演各种角色之间的悲欢离合。每个角色的行为皆在业务流程的指引下展开活动,并受到业务规则的约束。当我们在描述场景时,就好像在讲故事,又好似在拍电影。


组成场景的要素常常被称之为6W模型,即描写场景的过程必须包含Who,What,Why,Where,When与hoW这六个要素。6W模型如下图所示:

image.png

通过场景分析领域需求时,我们需要首先识别参与该场景的用户角色。我们可以为其建立用户画像(Persona),通过分析该用户的特征与属性辨别该角色在整个场景中参与的活动。这意味着我们需要明确业务功能(what),思考这一功能给该角色能够带来什么样的业务价值(why)。注意,这里所谓的“角色”是参差多态的,同一个用户在不同场景可能是完全不同的角色。例如在电商系统中,倘若执行的是下订单功能,则角色就是买家;针对该订单发表评论,参与的角色就变成了评论者。

在6W模型中,我将领域功能划分为三个层次,即业务价值、业务功能和业务实现,我将其称之为“职责的层次”。定义为“职责(Responsibility)”,才能够更好地体现它与角色之间的关系,即“角色履行了职责”。业务价值体现了职责存在的目的,即解释了该领域需求的Why。只有提供了该职责,这个场景对于参与角色才是有价值的。为了满足业务价值,我们可以进一步剖析为了实现该价值需要哪些支撑功能,这些业务功能对应6W模型中的What。进一步,我们对功能深入分析,就可以分析获得具体的业务实现。业务实现关注于如何去实现该业务价值,因而对应于hoW。

在电商系统中购买商品时,对于买家而言,下订单这一职责是具有业务价值的。通过领域分析,结合职责的层次概念,我们就可以得到如下的职责分层结构:

  • 下订单
  • 验证订单是否有效
  • 验证订单是否为空
  • 验证订单信息是否完整
  • 验证订单当前状态是否处于“待提交”状态
  • 验证订单提交者是否为合法用户
  • 验证商品库存量是否大于等于订单中的数量
  • 基于业务规则计算订单总价、优惠与配送费
  • 获取用户信息
  • 获取当前促销规则
  • 计算订单总价
  • 计算订单优惠
  • 计算商品配送费
  • 提交订单
  • 将订单项插入到数据表中
  • 将订单插入到数据表中
  • 更新订单状态为“待付款”
  • 更新购物车
  • 删除购物车中对应的商品
  • 发送通知
  • 给买家发送电子邮件,通知订单提交成功,等待付款


当我们获得这样的职责层次结构之后,就可以帮助我们更加细致地针对领域进行建模。在利用场景进行建模时,还要充分考虑场景的边界,即6W模型中的Where。例如在“下订单”的案例中,验证商品库存量的业务实现需要调用库存提供的接口,而该功能实则属于下订单场景的边界之外。领域驱动设计引入了限界上下文(Bounded Context)来解决这一问题。

针对问题域提炼领域知识是一个空泛的概念,业务场景分析的6W模型给出了具有指导意义的约束,要求我们提炼的领域知识必须具备模型的六个要素。这就好比两位侃侃而谈的交谈者,因为有了确定的主题与话题边界,一场本来是漫无目的野鹤闲云似的闲聊就变成了一次深度交流的专题高端对话。6W模型也是对领域逻辑的一种检验,如果提炼出来的领域逻辑缺乏部分要素,就有可能忽略一些重要的领域概念、规则与约束。这种缺失会对后续的领域建模直接产生影响。正本清源,按照领域场景分析的6W模型去分析领域逻辑,提炼领域知识,可以从一开始在一定程度上保证领域模型的完整性。

本文链接: http://zhangyi.xyz/6w-model-based-on-scenario/

相关文章
通过python-docx给word文档中的指定位置添加表格
1.读取一个已有的word文档。docx格式。 2.在该word文档中,通过一个给定的文字。找到该位置。在该位置的下方添加一个表格。例如在图中“BUG情况表”的下方插入一个表格
3408 1
通过python-docx给word文档中的指定位置添加表格
|
自然语言处理 前端开发 Java
Go语言学习路线 - 1.方向篇:明确Go语言的成长方向
目前,后端开发语言的就业方向主要分为两块:业务系统开发 与 基础平台开发 。Go语言自然也不会例外。
576 0
|
资源调度
JUC并发编程之同步器(Semaphore、CountDownLatch、CyclicBarrier、Exchanger、CompletableFuture)附带相关面试题
1.Semaphore(资源调度) 2.CountDownLatch(子线程优先) 3.CyclicBarrier(栅栏) 4.Exchanger(公共交换区) 5.CompletableFuture(异步编程)
418 0
|
算法 安全 编译器
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
867 0
|
12月前
|
数据采集 数据挖掘 数据安全/隐私保护
4步教你用rvest抓取网页并保存为CSV文件
本文介绍如何使用R语言的`rvest`包抓取网页数据并保存为CSV文件,以界面新闻网站为例。通过设置代理IP(如亿牛云)、User-Agent和Cookie,增强访问稳定性和安全性。代码涵盖环境配置、数据抓取、解析及保存步骤,确保高效、稳定地获取网页数据。适用于数据分析和统计分析场景。
275 8
4步教你用rvest抓取网页并保存为CSV文件
|
Android开发
解決Android报错:Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
解決Android报错:Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
472 1
|
编解码 缓存 网络安全
安婕儿-飞天使 常见问题
本文档提供了关于使用安婕儿辅助工具时遇到的各种常见问题及其解决方案,包括辅助工具无法使用、登录网络连接失败、插件损坏或无法注册、窗口数据获取失败、界面显示异常、中文输入乱码、游戏窗口异常放大缩小、启动卡死、游戏黑屏、辅助功能不正常运行等问题的处理方法。同时,文中还特别提到了解决方案中涉及的系统设置调整、杀毒软件设置、系统组件注册等技术细节,旨在帮助用户顺利解决使用过程中遇到的问题。此外,文档末尾提供了官方下载链接及网盘更新链接集合,方便用户获取最新版本的辅助工具。
|
存储 数据库
如何在数据库中存储小数:FLOAT、DECIMAL还是BIGINT?
【8月更文挑战第7天】在数据库中存储小数时,需谨慎选择数据类型:FLOAT、DECIMAL 或 BIGINT。FLOAT 存储空间小,适于非关键性小数如温度;但精度有限,可能产生误差。DECIMAL 能精确表示小数,适合货币金额等需要高度准确性的场景,不过占用空间较大。BIGINT 用于整数,若存储小数需额外转换处理。根据精度需求及应用场景选择合适类型至关重要。
849 2
|
数据采集 人工智能 前端开发
我写个HarmonyOS Next版本的微信聊天03-完结篇
我写个HarmonyOS Next版本的微信聊天03-完结篇
260 0
我写个HarmonyOS Next版本的微信聊天03-完结篇
|
传感器 数据可视化 JavaScript
物联网架构:感知层、网络层和应用层
【5月更文挑战第30天】物联网(IoT)由感知层、网络层和应用层构成。感知层利用传感器(如DHT11)收集环境数据;网络层通过ESP8266等设备将数据传输至云端;应用层提供用户服务,如Node-RED实现数据可视化。示例代码展示了Arduino读取温湿度,ESP8266连接Wi-Fi及Node-RED数据可视化流程。物联网架构为数据处理与服务提供全面支持,预示其在各领域广阔的应用前景。
4873 2