用例图 UML从入门到放弃系列之三

news2024/11/17 14:26:30

1.说明

        关于用例图,这篇文章我将直接照搬罗伯特.C.马丁老爷子在《敏捷开发》一书种的第17章,并配上自己的理解,因为这一章写的实在是太精彩了,希望能够分享给大家,共勉。以下是老爷子的原文中文翻译以及豆芽的个人解读。

2.怎么看待用例

        用例的思路非常好,却被过度复杂化了。我总是看到一些开发团队围坐在一起,讨论用例该如何写。一般来说,这种团队更多的是在关注形式而非内容。他们在前置条件、后置条件、主参与者、辅助参与者以及一堆根本不重要的事情上争论不休。(豆芽解读:看到没有,老爷子一直是一个非常注重实践,任何复杂而无用的理论都应该丢到垃圾桶)。    

         使用用例真正的窍门就是保持用例简单。不要担心用例的格式;简单把它们写在空白纸、字处理器的空白页或空白的索引卡片上就行了。不要担心所有的细节。细节只有到了很后期才有用。不必为记录所有的用例而烦恼,因为那是一项不可能完成的任务。关于用例,有一点要牢记:明天,它们将会变化。不管你多么努力地记录它们,不管你在记录细节方面多么地一丝不苟,不管你考虑地多么全面,不管你在研究和分析需求上投入了多少精力:明天,它们都要变化。如果有些东西明天会变化,那么就不必在今天就记录下它的细节。事实上,你要做的就是把细节的记录推迟到最后一刻。可以请把用例看作是即时需求。(豆芽解读:敏捷开发面对的是变化,也就是需求的变化,用例同样无法固化,所以不要妄图用任何形式固化它。)

3.怎么写用例

        请注意本节的标题。我们是要写用例,而不是要画它们。用例不是图示。用例是从一个特定视角进行编写的关于行为需求的文本描述。

        “等等!”你喊道,“我知道UML中有用例图,我见过。”

        不错,UML中确实有用例图。不过从这些图中你根本看不出任何有关用例的内容。它们根本不包含任何关于行为需求的信息,而这正是用例该记录的内容。UML中的用例图记录的完全是其他一些东西。(豆芽解读:老爷子的这段话我个人感觉比较极端,虽然说用例图没有比文本描述要强上多少,但是老爷子说用例图完全没有用,我觉得还是过于极端了。主要他想表达的是用例图确实无法表示用例的实现细节,对测试和编码来说确实用处不大,但是对需求分析和系统设计而言还是具备一定的指导意义的。)

4.用例图有什么用

        我们下面来看看老爷子所说的用例图是不是那么没用。用例图至少有以下四个应用场景,即需求分析、 系统设计、 测试、 文档编写。我们先看下一个用例通过用例图和文本描述分别是什么样的。例如,下面是销售终端系统的一个典型用例,卖出商品的用例。

文本表示:

  1. 收银员在扫描仪上划过商品,扫描仪读取UPC码。
  2. 商品的价格、描述以及当前价格总数出现在朝向顾客的显示器上。价格和描述也出现在收银员的屏幕上。
  3. 价格和描述打印在收银条上。
  4. 系统发出可以听到的“确认”声以通知收银员UPC码正确读取。

用例图表示:

        额,这确如老爷子所说,我竟然不知道如果绘制以上文本描述的用例图。因为如果我用更详细的图示表示的话会发现文字还是更加直观且完整。

        用文本表示用例已经完成表示了用例的基本流程。不需要任何更复杂的东西。事实上,如果用例不是一会儿就要实现,那么即使是上面这几个简单的步骤可能也过于详细了。如果用例不需要在几天或者一周内就要实现,我们是不希望记录这种细节的。如果不记录下用例的细节,如何对它进行估算呢?你可以去问利益相关者有关细节的内容,不必把它记录下来。这会为你提供进行粗略估算所需要的信息。既然要去询问利益相关者一些细节方面的内容,为什么不把它们记录下来呢?因为明天,细节将会变化。难道变化不会影响到估算吗?会影响,不过对大量的用例来说,这些影响会相互抵消。过早记录下细节是完全不划算的。如果我们现在不记录用例的细节,那要记录什么呢?如果不写下一些东西,我们又如何得知存用例呢?记下用例的名称即可。在电子表格或者文档中保持用例名字的代码清单。更好的做法是,把用例的名称写在索引卡片上,保存在一起,等临近实现时再填入细节。

5.怎么画用例图

        虽然以上的大量篇幅看起来都在劝退各位不要使用用例图,但是我们还是需要教会大家怎么画用例图,因为当你评价一个事物前,首先要了解它,我说的。

        用例图中包括四种元素:参与者、用例、它们之间的关系、系统边界。关于参与者与用例的解析,详见下表:

系统边界,主要描述需要系统实现的功能集合,一般使用矩形框将系统边界标注出来。

各元素之前的关系如下

6.总结

你对用例的态度一定要保持这种简洁性。如果陷入用例复杂性的黑暗面,就会被它牢牢控制。运用原力,保持用例的简单化。

引用

《敏捷开发》——罗伯特.C.马丁

如何画用例图(UML) (baidu.com)

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

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

相关文章

迁移学习--预训练微调

目录 1、迁移学习作用 2、迁移学习的途径 3、相关的领域 4、在计算机视觉中的应用 5、迁移学习的办法 预训练模型 微调 6、总结 1、迁移学习作用 定义:能在一个任务学习一个模型,然后用来解决相关的别的任务,这样我们在一个地方花…

鸿运主动安全云平台任意文件下载漏洞

一、漏洞描述 深圳市强鸿电子有限公司鸿运主动安全云平台存在任意文件下载漏洞,攻击者可通过此漏洞下载敏感文件信息,获取数据库账号密码,从而为下一步攻击做准备。 二、网络空间搜索引擎查询 fofa查询 body"./open/webApi.html"…

排序算法-插入排序法(InsertSort)

排序算法-插入排序法(InsertSort) 1、说明 插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素排序好,再将第三个元素插入适当的位置,也就是说这三个元素仍然是已排序好的,接着将第…

bootz启动 Linux内核过程总结

一. bootz启动Linux uboot 启动 Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。 前面几篇文章分析 bootz命令启动 Linux内核的过程中涉及的几个重要函数。 bootz启动 Linux内核过程中涉及的全局变量images_凌肖战的博客-CSDN博…

3d tiles规范boundingVolume属性学习

3d tiles的瓦片(Tiles)包含一些属性,其中第一项是boundingVolume;下面学习boundingVolume; boundingVolume,这个翻译为边界范围框,如果直译为边界体积可能有问题,其实就是包围盒的意…

Matlab提取colormap

文章目录 简介Matlab代码 简介 使用Maltab依据截取的图片信息,提取colormap,供保存使用 Matlab代码 提取函数 function colormap_outExtract_Colormap(inputfig, colormapsize)% Creat a colormap array from the input figure. % The figure is a c…

虹科科技 | 探索CAN通信世界:PCAN-Explorer 6软件的功能与应用

CAN(Controller Area Network)总线是一种广泛应用于汽车和工业领域的通信协议,用于实时数据传输和设备之间的通信。而虹科的PCAN-Explorer 6软件是一款功能强大的CAN总线分析工具,为开发人员提供了丰富的功能和灵活性。本文将重点…

刷题用到的非常有用的函数c++(持续更新)

阅读导航 字符串处理类一、stoi()(将字符串转换为整数类型)二、to_string()(将整数类型转换为字符串类型)三、stringstream函数(将一个字符串按照指定的分隔符进行分词) 字符串处理类 一、stoi()&#xff…

ChatGPT AIGC 高效办公自动化案例

根据业务员姓名查找对应月份的科目成绩。 我们让ChatGPT AIGC来完成Excel公式。 Prompt:有一个表格A列为姓名,B列为语文,C列为数学,请根据J2单元格的姓名 ,查找出对应的数学成绩,请写出函数来完成 将生成的vlookup函数公式=VLOOKUP(J2, A:C, 3, FALSE)复制到表格中进行验…

[开源]基于流程编排的自动化测试工具,插件驱动,测试无限可能

一、开源项目简介 流程编排,插件驱动,测试无限可能 一款基于流程编排的自动化测试工具 二、开源协议 使用Apache-2.0开源协议 三、界面展示 四、功能概述 在软件开发旅程中,测试流程的管理和执行常常是复杂且耗时的挑战。传统测试工具主…

c++ 类的特殊成员函数:移动构造函数(五)

1. 简介 移动构造函数是C11中的新特性,它允许对象通过移动而不是复制来传递和初始化。移动构造函数通常用于提高性能,因为它避免了不必要的复制操作,特别是当处理大型对象或使用动态内存分配时。 2. 来源 当拷贝构造函数出现函数返回值 &a…

kafka广播消费组停机后未删除优化

背景 kafka广播消息的时候为了保证groupId不重复,再创建的时间采用前缀时间戳的形式,这样可以保证每次启动的时候是创建的新的,但是 会出现一个问题:就是每次停机或者重启都会新建一个应用实例,关闭应用后并不会删除…

如何调整 Kubernetes StatefulSet 卷的大小

Kubernetes StatefulSet用于在集群内部署有状态应用程序。StatefulSet 中的每个 Pod 都可以访问即使在重新调度后仍坚持使用的本地持久卷。这使得 Pod 能够维护与其集合中的邻居不同的单独状态。 不幸的是,这些卷有一个很大的限制:Kubernetes 没有提供从 StatefulSet 对象调整…

排序算法-冒泡排序法(BubbleSort)

排序算法-冒泡排序法(BubbleSort) 1、说明 冒泡排序法又称为交换排序法,是从观察水中的气泡变化构思而成的,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个…

排序算法-选择排序法(SelectionSort)

排序算法-选择排序法(SelectionSort) 1、说明 选择排序法也是枚举法的应用,就是反复从未排序的数列中取出最小的元素,加入另一个数列中,最后的结果即为已排序的数列。选择排序法可使用两种方式排序,即在所…

基于nodejs+vue驾校预约管理系统

通过科技手段提高自身的优势;对于驾校预约管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了驾校预约管理系统, 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,驾校预约管理系统&am…

【Rust】包和模块,文档注释,Rust格式化输出

文章目录 包和模块包 CrateRust 的标准目录结构 模块 Module用路径引用模块使用super引用模块使用self引用模块结构体和枚举的可见性 使用 use 引入模块及受限可见性基本引入方式绝对路径引入模块相对路径引入模块中的函数 避免同名引用 注释和文档文档注释包和模块级别的注释注…

conda: error: argument COMMAND: invalid choice: ‘activate‘

参考:https://github.com/conda/conda/issues/13022 输入后重启terminal即可

Spring Boot 开发环境热部署

Spring Boot 项目无法像前端项目那样,修改源代码后刷新网页就能即时看到效果,需要先暂停运行,再重新启动,最后刷新网页。 为了避免这一麻烦的操作,我们可以设置热部署,启动服务后不论怎么修改源码&#xf…

NodeJs中使用JSONP和Cors实现跨域

跨域是为了解决浏览器请求域名,协议,端口不同的接口,相同的接口是不需要实现跨域的。 1.使用JSONP格式实现跨域 实现步骤 动态创建一个script标签 src指向接口的地址 定义一个函数和后端调用的函数名一样 实现代码 -- 在nodejs中使用http内…