本文主要内容来自 SpriCoder的博客,更换了更清晰的图片并对原文的疏漏做了补充和修正。
用例文档的格式情况
需求分析基础
为什么要需求分析
- 需求不是属于用户的,是应该是需求人员提出来的
需求分析的任务
- 建立分析模型,达成开发者和用户对需求信息的共同理解:分析将复杂的系统分解为简单的部分以及它们之间的联系,确定本质特征,抛弃次要特征。
- 依据共同的理解,发挥创造性,创建软件系统解决方案:分析可以将一个问题分解为独立的、更简单的和易于管理的子问题来帮助寻找解决方案
需求分析的模型与建模
模型
- "模型是对事物的抽象,帮助人们在创建一个事物之前可以有更好的理解"[Blaha2005]
- 为了更好地理解需求获取所得到的复杂信息,需要集中关注问题的计算特性(数据、功能、规则等),建立相关的软件模型
建模
- 建立模型的过程被称为建模。"它是对系统进行思考和推理的一种方式。建模的目标是建立系统的一个表示,这个表示以精确一致的方式描述系统,使得系统的使用更加容易"[Fishwick1994]。
- UML 的规范,每一个细节,含义也需要遵从规范的,箭头,实线虚线。
- 抽象(Abstraction)分解(Decomposition / Partitioning)建模最为常用的两种手段
需求分析模型的特点及常见的需求分析模型
- 需求分析模型是专门用来描述软件解决方案的模型技术。因为软件解决方案介于用户描述与软件内部构造之间,所以需求分析模型也是介于用户概念和软件内部实体之间的模型形式。
- 常见的需求分析模型
结构化分析
结构化方法的历史
- 结构化方法是针对 1960’s 到 1980’s 软件开发界所面临的问题提出一系列分析、设计和编码的技术方法。那个时代:
- 大多数商业编程都在 Cobol 和 Fortran 中完成,然后在 C 和 BASIC 中完成
- 关于“好的”设计和编程技术的指导很少
- 没有记录需求和设计的标准技术
- 关键是软件的复杂度的急剧上升
Multiple Structured Methods emerged 多种结构化分析方法的出现
- 结构化编程:in circa 1967 with Edsger W.Dijkstra
- 结构化设计:around 1975 with Larry Constantine and Ed Yourdon
- 结构化分析:in circa 1978 with Tom DeMarco, Yourdon, Gane & Sarson, McMenamin & Palmer
- 信息专家:in circa 1990 with James Martin
结构化分析思想
- 自顶向下分解
- 各种图
- 数据流图
- 实体关系图
- 状态转移图
数据流图 (Flow Oriented Model)
- 数据流图将系统看做是过程的集合,其中一些由人来执行,另一些由软件系统来执行。
- 过程的执行就是对数据的处理:它接收输入,进行数据转换,输出结果。
- 数据流图主要是展示了数据在通过系统如何进行了变化。
- 可能需要和软件系统外的实体尤其是人进行交互
- 数据的变化包括:
- 被转换、被存储、或者被分布
Flow Modeling Notation(数据流图基本元素)
外部实体
- 数据的产生或者消耗者
- 示例:一个人,一个设备,一个传感器
- 另一个例子:基于计算机的系统
- 数据必须是从一个地方来到另一个地方去
- 外部实体是待构建软件系统之外的人、组织、设备或者其他软件系统,它们不受系统控制,开发者不能以任何方式操纵它们。
过程 Process
- 将数据从输入转换到输出:示例:计算税金,确定面积,格式报告,显示图形必须始终以某种方式处理数据以实现系统功能
- 过程是指施加于数据的动作或者行为,它使得数据发生变化,包括被转换、被存储或者被分布。
数据流 Data Flow
- 数据在整个系统流动,从输入流动到输出
- 数据流是数据的运动,它是系统与其环境之间或者系统内两个过程之间的通信形式。
数据存储 Data Stores
- 数据经常被存储起来等之后使用
- 数据存储是软件系统需要在内部手机、保存,以供日后使用的数据集合。
数据流图的语法规则
- 过程是对数据的处理,必须有输入,也必须有输出,输入数据集应该和输出数据集存在差异
- 数据流是必须和过程产生关联的,它要么是过程的数据输入,要么是过程的数据输出
- 所有的对象都应该有一个可以唯一标识自己的名称。过程使用动词,外部实体、数据流、数据存储使用名词
数据流图的分层结构
- 数据流图分为如上三种图:上下文图、0 层图和 N 层图
上下文图
- 上下文图是 DFD 的最高层次的图,是系统功能的最高抽象。上下文将整个系统看做一个过程,这个过程实现系统的所有功能。
- 因此,上下文图往往也脱离 DFD 的层次结构单独使用,用来描述系统的上下文环境和定义系统边界。
0 层图
- 回顾描述并使用语法分析来确定“操作”
- 确定外部实体(数据的生产者和消费者)
- 0 层图通常被用作整个系统的功能概图。
- 为了概述整个系统的功能,建立 0 层图时需要分析需求获取的信息,归纳出系统的主要功能
- 将系统的主要功能描述为几个比较高层的抽象过程,并在 0 层图中加以标书
- 有部分重要的数据存储会在 0 层图中得到表述
- 0 层图示例
1 层图
- 写一篇叙述性文章来描述这个转变(数据的转变)
- 分析以确定下一级转换
- “平衡”流量以保持数据流量的连续性
- 1 层图实例
N 层图
- 父过程:被分解的过程
- 子图:分解后产生的揭示更多细节的图
- 原始 DFD 图:所有过程无法再次分解的图。
- 子图的接口流:父过程的输入输出,往往从空白的区域引出。
- 子图中过程的编号需要用父过程中的编号作为前缀。
- 注意:低于 0 层图的子图上通常不显示外部实体
数据流图的分层
- 输入、处理、输出
- 分层将细节逐步细化
过程分解的平衡原则
实体关系图(ERD) - 数据的建模
- 独立于处理检查数据对象
- 关注数据域(数据说明)
- 指示数据对象如何相互关联
- 能够弥补过程建模在数据说明方面的缺陷,是描述数据的定义、结构和关系等特性的技术。
实体关系图的组成元素
传统实体(Typical Objects)
实体是需要在系统中收集和存储的现实世界事物的类别描述。
- 实体并不是孤立存在的,相互交互相互影响
- 参与关系的每个实体都针对关系拥有最大基数和最小基数
- 最大基数:对关系中任意的其他实体实例,该实体可能参与关系的最大数量。最大基数为 1,表示为 One,否则为 Many
- 最小基数:对关系中任意的其他实体实例,该实体可能参与关系的最小数量。实体在关系中的最小基数被标记为 Optional,最小基数为 1 时,实体在关系中的最小基数被标记为 mandatory
- 实体的例子
- external entities:printer, user, sensor
- things:reports, displays, signals
- occurrences or events:interrupt, alarm
- roles:manager, engineer, salesperson
- organizational units:devision, team
- places:manufacturing floor
- structures:employee record
Data Objects and Attributes 属性
- 数据对象包含一组作为对象的方面、质量、特征或描述符的属性
- 属性可以对尸体进行描述的特征。
Relationship 关系
- 连通性
- 系统必须记住的事实,不能或不能计算或推导出来
- 关系的几个实例可以存在
- 实体可以以多种方式关联
建立实体关系图的步骤
- 第 1 级-对所有数据对象(实体)及其相互之间的“连接”建模
- 第 2 级-对所有实体和关系建模
- 第 3 级-对所有实体、关系和属性建模,以提供进一步的深度
ERD 的图形表示
键(Key)
- 实体的一个或者多个属性能够唯一确定和标示每个实例,这些属性或者属性组合就被称为实体的标示符,或者键(Key)
实体关系图实例
面向对象分析
面向对象分析的简单过程
需求与用例
- 传统上,这些要求是在客户和开发人员之间的合同文件中规定的:很难满足所有的需求。
- 1992 年,Jacobson 提出了用例方法:它们来自于传统的开发方法,并适应 OOAD。
用例(重要)
- 用例最初由[Jacobson1992] 在 Objectory 方法中提出的,它将用例定义为"在系统(或者子系统或者类)和外部对象的交互当中所执行的行为序列的描述,包括各种不同的序列和错误的序列,它们能够联合提供一种有价值的服务"[Rumbaugh2004]。
- [Cockburn2001]认为用例描述了在不同条件下系统对某一用户的请求的响应。根据用户的请求和请求时的系统条件,系统将执行不同的行为序列, 每一个行为序列被称为一个场景。一个用例是多个场景的集合。
目标、交互与行为序列
案例
- 连锁超市管理系统的收银员为了完成一次销售任务,会使用软件系统处理销售过程,那么就可以建立一个用例“销售处理”。考虑实际销售时的不同条件,会发生不同的行为:
- 在一切顺利时是一种正常行为流程;
- 购买多个同样商品时可以逐一输入每个商品,也可以分别输入商品号与数量;
- 销售过程中可能会发现某个商品无法识别;
- 有可能一个商品被纳入销售清单后用户又提出退回......
- 上述的每一个行为都是一个场景。所有的行为联合起来就构成了场景的集合——用例,它的目标与价值是完成销售任务。
- 除了上述基本操作以外,还应该考虑用户大量的操作。
- 用例是需求的一种组织,一种表达。
用例图
- 用例:椭圆
- 参与者:小人
- 关系:简单的就是一条直线
- 系统边界:是一个框
用例图组成成分
参与者
- 参与者是用户或其他系统对要开发的系统所扮演的角色。
- 用例图中的单个参与者可以表示多个用户(或系统)。
- 单个用户(或系统)也可以扮演多个角色。
- 参与者不需要是人,例如,需要来自当前系统的某些信息的外部系统也是参与者。
用例(需要语境)
- 以用例的形式表达需求。
- 用例表示有助于构建、关联和理解基本需求的典型场景集。
- 场景是对系统在实践中如何使用的描述:用户与计算机系统之间的典型交互
- 一般会用动宾短语,加上 actor 作为主语就是句子了。
系统边界
- 强调重点是什么是要详细的,什么不是。
- 系统边界隐式存在于没有显式表示的系统边界的图中
- 参与者总是在边界之外,用例总是在边界之内。
- 系统边界是指一个系统所包含的系统成分与系统外事务的分界线。
关系
- 有关
- 泛化关系,指向的是被泛化的。
- 包含关系
- 继承关系
- 如果能清晰 include 和 extends 可以画,不明白可以直接连线和不画。
- multiplicity:多样性。
用例图的建立的步骤
- 目标分析与解决方向的确定
- 寻找参与者
- 寻找用例
- 细化用例
目标分析
- 问题目标的解决方案
- *** 连锁商店是一家刚刚发展起来的小型连锁商店,其前身是一家独立的小百货门面店。
- 首先是随着商店规模的扩大,顾客量大幅增长,手工作业销售迟缓,顾客购物排队现象严重,导致流失客源。
- 其次是商店的商品品种增多,无法准确掌握库存,商品积压、缺货和报废的现象上升明显。
- 再次是商店面临的竞争比以前更大,希望在降低成本,吸引顾客,增强竞争力的同时,保持盈利水平。
- 业务需求
- BR1:在系统使用 6 个月后,商品积压、缺货和报废的现象要减少 50%
- BR2:在系统使用 3 个月后,销售人员工作效率提高 50%
- BR3:在系统使用 6 个月后,运营成本要降低 15%
- 范围:人力成本和库存成本
- 度量:检查平均员工数量和平均每 10,000 元销售额的库存成本
- BR4:在系统使用 6 个月后,销售额度要提高 20%
- 最好情况:40%
- 最可能情况:20%
- 最坏情况:10%
- 系统功能
- SF1:分析商品库存,发现可能的商品积压、缺货和报废现象
- SF2:根据市场变化调整销售的商品
- SF3:制定促销手段,处理积压商品
- SF4:与生产厂家联合进行商品促销
- SF5:制定促销手段进行销售竞争
- SF6:掌握员工变动和授权情况
- SF7:处理商品入库与出库
- SF8:发展会员,提高顾客回头率
- SF9:允许积分兑换商品和赠送吸引会员的礼品,提高会员满意度
- SF10:帮助收银员处理销售与退货任务
寻找参与者与用例
- 每个用户的任务(目标)都是一个独立用例
- 案例中的参与者的目标
- 总经理的目标有:
- 产品调整(增删改产品信息)
- 特价策略制定(增删改特价策略)
- 赠送策略制定(增删改赠送策略)
- 库存分析;(分析可能的商品积压)
- 客户经理的目标有:
- 会员管理;(会员发展、礼品赠送)
- 库存管理;(商品入库、出库和库存分析)
- 收银员的目标有:
- 销售处理(销售)
- 退货;(退货)
- 管理员的目标有:
- 用户管理(增删改用户信息)
- 总经理的目标有:
细化用例
- 如果用例的粒度不合适就需要进行细化和调整。
- 判断标准是:用例描述了为应对一个业务事件,由一个用户发起,并在一个连续时间段内完成,可以增加业务价值的任务。
- 产品具体的细化
- 特价策略制定、赠送策略制定两个用例的业务目的、发起源和过程基本相同,仅仅是业务数据不同,所以可以合并为一个用例销售策略制定。
- 会员管理用例有两个明显不同的业务事件,可以被细化为发展会员和礼品赠送 2 个更细粒度的用例。
- 客户经理的库存管理用例也有三个不同的业务目标:出库、入库和库存分析,所以也应该细化为三个用例商品出库、商品入库和库存分析,其中库存分析用例与总经理的库存分析用例相同。
常见错误
- 不要将用例细化为没有独立业务价值的单个操作
- 例如,不要将用户管理细化为增加、修改和删除三个更小的用例,因为它们要联合起来才能体现出业务价值。
- 不要将同一个业务目标细化为不同用例
- 例如特价策略制定和赠送策略制定。
- 不要将没有业务价值(而是技术实现需要)的内容作为用例
- 常见的错误有登录(应该描述为安全性质量需求)、"数据验证/输入/输出数据检查"(应该描述为数据需求或者业务规则)、“连接数据库”(属性软件内部实现而不是需求)、网络传输等。
- 不要将单个步骤细化为用例
- 不要将片面的一个方面细化为用例
完整实例
1 |
|
1 |
|
用例文档模板
- 用例标识:至少在本文档中标识应当是唯一,最好是在整个项目中的文档标识是唯一的
- 触发事件:
- 前置条件:系统应该满足的条件,但是不是达到这个条件就除法
- 后置条件:用例处理完的状态
- 扩展流程:不按照我们预估的顺序走,不是错误的。
- 也包含一些异常说明
用例模板实例
- UC1 是 ID,前置条件是应该被完成的
- 流程是被标识数字,并且数字应该是唯一的。
- 上面的 8 和 9 合并(无和系统的交互)
- 2a:非法输入一定要明确的提示(a 标识扩展,然后之后写出扩展流程的具体流程)
- 特殊需求应当保证确定有需求才写,符合规格要求
用例文档的部分问题
- 顾客为什么不是参与者:顾客没有直接和我们交互,因为是通过收银员进行交互
- 上传下载为什么不是用例:是系统之间的交互,并不是系统和系统外的交互
- 系统可不可以分为服务器和客户端两个系统:
- 表达用例的时候还是在表达需求,这时是没有服务器端和客户端的概念的,这时我们的实现细节
UML 中用例图的作用
- 用例图在整个 UML 中是有很重要的作用,是其他用例的基础
概念类图(Conceptual Class Diagram)
- 概念类图又被称为“领域模型”(Domain Model)
- 类图是面向对象分析方法的核心:类图描述类(对象)和这些类(对象)之间的关系
- 概念类图和设计类图的不同点:关注系统与外界的交互,而不是软件系统的内部构造机制
- 类型、方法、可见性等复杂的软件构造细节不会在概念类图中
- 类图只有类和类名,没有包含方法。
- 用例不是概念类,同一个用例可能产生多个概念类
概念类图的注意事项
- 注意:与设计类图有所不同,分析类图关注现实世界问题域,而不是软件系统的内部构造机制;
- 类型、方法、可见性等复杂的软件构造细节不会在概念类图中,不允许出现与现实无关的内容
概念类图基本元素
- 对象
- 标识符:对象自治、对象请求写作
- 状态:存储数据,如密码、名称
- 行为:利用数据做什么
- 类:对象集合的抽象
- 链接(link)(dependency)
- 对象之间的互相协作的关系
- 描述了对象之间的物理或业务联系
- 关联
- 对象之间链接的抽象
- 聚合与组合
- 继承:泛化关系
关联与依赖
- 两个分析类通常以某种方式相互关联
- 在 UML 中,这些关系称为关联
- 关联可以通过指示多样性来重新定义(数据建模中使用术语基数)
- 如果类之间存在关联,则类的实例之间存在链接(依赖项)
- 上图中注意基数和箭头的形状
- 会使用到的四种关系线:
- 聚合关系不必可以使用,但是组合关系要适当的使用
- 继承关系、组合关系、聚合关系、普通关联
继承
- 将域对象类组织到层次结构中
- 层次结构顶部的类反映了所有类的公共特性
- 对象类从一个或多个超级类继承其属性和服务。必要时可将其专门化
- 使用空心箭头
建立概念类图的步骤(重要)
- 对每个用例文本描述,尤其是场景描述,建立局部的概念类图
- 根据用例的文本描述,识别候选类
- 筛选候选类,确定概念类
- 识别关联
- 识别重要属性
- 将所有用例产生的局部概念类图进行合并,建立软件系统的整体概念类图
- 自己注:先画关联关系,再添加类的属性
候选类识别
- 发现软件系统与外界交互时可能涉及的对象与类,它们就是候选类。
- 行为分析、名词分析、CRC 等很多种方法都可以用来分析用例文本描述
- 名词分析:提取出用例描述中的名词作为候选类
筛选候选类,确定概念类
- 确定概念类的准则:该对象的状态与行为是否全部必要
- 依据系统的需求
- 该类的对象实例的状态与行为是否完全必要
- 如果是只允许打印两次,则要为何打印的状态。
- 候选类向概念类的转换:如果候选类的对象实例
- (状态+行为)既需要维持一定的状态,又需要依据状态表现一定的行为
- 确定为一个概念类
- (仅状态)如只需要维护状态,不需要表现行为
- 确定是不是其他概念类的属性
- (仅行为)不需要维护状态,却需要表现行为
- 首先要重新审视需求是否有遗漏,因为没有状态支持的对象无法表现行为
- 如果确定没有需求的遗漏,就需要剔除该候选类,并将行为转交给具备状态支持能力的其他概念类
- (无状态行为)既不需要维护状态,又不需要表现行为:废弃
- (状态+行为)既需要维持一定的状态,又需要依据状态表现一定的行为
识别关联
- 分析用例文本描述,发现概念类之间的协作,需要协作的类之间需要建立关联。
- 分析和补充问题域内的关系,例如概念类之间的整体部分关系和明显的语义联系:对问题域关系的补充要适可而止,不要把关系搞得过度复杂化。
- 去除冗余关联和导出关联。
识别重要属性
- 这些属性往往是实现类协作时必要的信息,是协作的条件、输入、结果或者过程记录。
- 通过分析用例的描述,并与用户交流,补充问题域信息,可以发现重要的属性信息。
- 在分析每个单独的用例(场景)描述时,为各个概念类发现的重要属性可能不多,甚至有些概念类没有任何重要属性。但是,系统通常有多个用例和很多场景,会建立多个局部的概念类图,只有在合并所有局部概念类图之后, 各个概念类的重要属性才能得到全面的体现。
概念类图生成的步骤(总结)
- 识别候选类(名词分析法)
- 确定概念类(看是否满足既有状态又有行为)
- 既需要维持一定的状态,又需要依据状态表现一定的行为:确定为一个概念类
- 如只需要维护状态,不需要表现行为:其他概念类的属性
- 不需要维护状态,却需要表现行为:首先重新审视需求是否有遗漏,因为没有状态支持的对象无法表现行为;如果确定没有需求的遗漏,就需要剔除该候选类,并将行为转交给具备状态支持能力的其他概念类
- 既不需要维护状态,又不需要表现行为:应该被完全剔除
- 识别关联(文本中提取出"名词+动词+名词"的结构):第一标准是满足需求的要求,第二标准是现实状况
- 识别重要属性:协作的必要信息,通过分析用例的描述,补充问题域信息发现。
实例
1 |
|
用例模型和对象模型之间的鸿沟
- 用例模型和对象模型之间是存在比较大的差距的。
顺序图(交互图)
- 行为模型显示了对象之间的交互,以产生一些特定的系统行为,这些行为被指定为一个用例
- UML 中的序列图(或协作图)用于建模对象之间的交互
- 分析阶段,主要是利用系统顺序图,表达系统和外部参与者之间的交互行为:务必要严格谨慎的界定系统
顺序图的图例
- 下划线表示对象,没有下划线表示类(上图中的名字)
- 区分不同的箭头: 箭头们无论是从系统到外部还是从外部到系统都是一样的
系统顺序图
- 同步消息是实线,三角箭头。
- 返回消息应该是虚线
- Opt 是可选项
- loop 是循环
- alt 多选一
- 画外部和内部之间的交互应当仔细辨别系统和系统(也就是系统边界)
- 不同框的含义:
- alt 一定要选(多选一):注意,每一种可选分支之间要用虚线分割,而且在表示执行态的圆柱上面要写监护条件,放在[]里面。
- opt 一定要选(选择 0 或者 1)
- loop:表示循环,在旁边使用[]书写循环条件
- 步骤:
- 确定上下文环境
- 根据用例描述找到交互对象
- 按照用例描述中的流程顺序逐步添加消息
状态图
The behavioral model indicates how software will respond to external events or stimuli.
状态图的基本概念
- 状态:一组可观察的情况,描述了一个系统在给定时间的行为
- 状态转换:从一个状态到另一个状态的转换
- 事件:使系统表现出某种可预测的行为形式的事件
- 行为:由于过渡而发生的过程
状态图的示例
- 上图非常重要,请务必认真确定
创建状态图的步骤
- 确定上下文环境
- 状态图是立足于状态快照进行行为描述的,因此建立状态图时首先要搞清楚状态的主体,确定状态的上下文环境。常见的状态主体有:类、用例、多个用例和整个系统。
- 状态应该是相对较多,比较复杂的。
- 识别状态
- 状态主体会表现出一些稳定的状态,它们需要被识别出来,并且标记出其中的初始状态和结束状态集。在有些情况下,可能会不存在确定的初始状态和结束状态。
- 建立状态转换
- 根据需求所描述的系统行为,建立各个稳定状态之间可能存在的转换。
- 补充详细信息,完善状态图
- 添加转换的触发事件、转换行为和监护条件等详细信息。
示例:销售处理用例状态图
- 明确状态图的主体:用例 UC1 销售处理。
- 识别用例 UC1 销售处理可能存在的稳定状态:
- 空闲状态(开始状态):收银员已经登录和获得授权,但并没有请求开始销售工作的状态;
- 销售开始状态:开始一个新销售事务,系统开始执行一个销售任务的状态;
- VIP 顾客信息显示状态:输入了客户编号,系统显示该 VIP 顾客信息的状态;
- 商品信息显示状态:刚刚输入了一个物品项,显示该物品(和赠品)描述信息的状态;
- 列表显示状态:以列表方式显示所有已输入物品项(和赠品)信息的状态;
- 错误提示状态:输入信息错误的状态;
- 账单处理状态:输入结束,系统显示账单信息,收银员进行结帐处理的状态。
- 销售结束状态:更新信息,打印收据的状态。
状态转换表(辅助完成状态图绘制)
- 用来分析状态之间的关系
例题
使用需求方法细化和明确需求
- 为什么要细化
- 用户需求的描述的模糊性和系统设计所需要的严谨性之间的矛盾
- 如何细化
- 需求分析建模
- 发现其中的遗漏、冲突、冗余和错误
- 迭代(获取、分析、获取、分析。。。)
系统顺序图有助于发现交互性的缺失
概念类图有助于发现
- 部分信息的使用不准确
- 例如步骤 2 中输入的是商品标识,而不是商品,第 5 步显示的已输入商品列表信息和总价。
- 部分信息不明确
- 例如会员信息、商品信息、商品列表信息、赠品信息、更新的数据、收据等等各自的详细内容并没有描述。
- 遗漏了重要内容
- 例如总价的计算需要使用商品特价策略和总额特价策略,赠品的计算需要使用商品赠送策略和总额赠送策略。
状态图有助于发现页面的跳转
建立系统需求
- 8 种规格说明
- 不同的分析方法适合不同的规格说明
by mode 功能需求分类
by user class
by object
by feature
by stimulus
- 根据刺激和不同的相应
by functional hierarchy
multiple organization
其他注意
- alt 是多选一,必选,将两个部分划分开。