UML 用例图:准则
在 Visual Studio 旗舰版中,可以绘制“用例图”来概括使用您的应用程序或系统的用户以及该应用程序或系统的用途。若要创建 UML 用例图,请在**“体系结构”菜单上,单击“新建关系图”**。
有关视频演示,请参见 Organizing Features into Use Cases(将功能组织到用例)。
用例图有助于讨论和传达以下内容:
您的系统或应用程序与人、组织或外部系统进行交互的几种方案。
它帮助参与者实现的目标。
系统的范围。
用例图不显示用例的详细信息:它只概括用例、参与者和系统之间的某些关系。 特别是,用例图不显示每个用例为实现目标所执行步骤的顺序。 可以在其他关系图和文档中描述这些详细信息,这些关系图和文档可与各用例相链接。 有关更多信息,请参见本主题中的详细描述用例。
您为用例提供的描述将使用与系统所用于的领域相关的一些词汇,如“销售”、“菜单”、“顾客”等。 明确定义这些词汇及其关系是非常重要的,您可以借助 UML 类图来进行定义。 有关更多信息,请参见 UML 类图:准则。
用例只处理系统的功能要求。 诸如业务规则、服务质量要求和实现约束等其他要求必须另外表示。 体系结构和内部细节也必须另外说明。 有关如何定义用户需求的更多信息,请参见用户需求建模。
本主题中使用的示例与顾客可在其上从本地餐馆订餐的网站有关。
“参与者”(1) 是与您的系统进行交互的一类人、组织、设备或外部软件组件。 例如,“顾客”、“餐馆”、“温度传感器”、“信用卡授权方”都是参与者。
“用例”(2) 表示一个或多个参与者为实现特定目标而执行的操作。 例如,“订餐”、“更新菜单”、“处理付款”都是用例。
在用例图中,用例与执行它们的参与者相关联 (3)。
“系统”(4) 是您开发的任何成果。 系统可以是小型软件组件,其中的参与者只是其他软件组件;系统也可以是完整的应用程序;系统还可以是部署在多台计算机和设备上的大型分布式应用程序套件。 例如,“订餐网站”、“送餐业务”、“网站版本 2”都是子系统。
用例图可以显示系统或其子系统支持的用例。
主题内容
绘制用例图的基本步骤
绘制参与者和用例
详细描述用例
结构化用例
使用子系统边界
绘制用例图的基本步骤
备注
如何:编辑 UML 模型和关系图中介绍了有关创建任何建模图的详细步骤。
创建新的用例图
在**“体系结构”菜单上,单击“新建关系图”**。
在**“模板”下,单击“UML 用例图”**。
命名该关系图。
在**“添加到建模项目”中,从您的解决方案中选择一个现有建模项目,或者选择“创建新的建模项目”,然后单击“确定”**。
绘制用例图
将**“子系统”**边界从工具箱拖到关系图中,它可以表示整个系统或其中的主要组件。
如果不希望描述系统或其组件支持哪些用例,用例图中可以不绘制系统边界。
根据需要,拖动系统的四角将其扩大。
对其适当地重命名。
将**“参与者”**从工具箱拖到关系图中(将其放在所有系统边界之外)。
参与者表示与您的系统进行交互的各类用户、组织和外部系统。
重命名这些参与者。 例如:“顾客”、“餐馆”、“信用卡机构”。
将**“用例”**从工具箱拖到适当的系统中。
用例表示参与者在系统的帮助下所执行的活动。
使用参与者自身能够理解的名称重命名这些用例。 不要使用与代码有关的名称。 例如:“订餐”、“付餐费”、“送餐”。
从主要的事务(如“订餐”)开始,直到后面较小的事务(如“点菜”)为止。
将每个用例放入支持它的系统或主要子系统(忽略任何只与用户有关的外观模式或组件模式)。
可以在系统边界外绘制用例,以表明系统(可能在特定版本中)不支持该用例。
单击工具箱上的**“关联”**,然后单击用例,再单击该用例的参与者。 以此方式将每个参与者与其用例相链接。
用**“包括”、“扩展”和“泛化”**关系结构化用例。 若要创建其中的每个链接,请依次单击工具、源用例和目标。 请参见下面的结构化用例一节。
详细描述用例。 请参见下面的详细描述用例一节。
绘制其他关系图,使其分别针对不同子系统或不同相关用例组。 一个建模项目中的所有关系图是同一模型的多种视图。
绘制参与者和用例
用例图的主要用途是显示与系统交互的用户以及这些用户借助系统实现的主要目标。
创建**“参与者”**来表示与您的系统或子系统进行交互的各类人员、组织、其他系统、软件或设备。
若要了解如何绘制参与者和其他元素,请参见如何:编辑 UML 模型和关系图。
对于每一组不同的目标,按其类型或角色标识参与者,即使具体的个人或实体可能是相同的。 例如,“餐馆”和“顾客”是不同的参与者,即使餐馆的雇员可能有时候也是顾客。
为每个参与者希望借助系统实现的每个目标创建**“用例”**。
- 以参与者能够理解的词语命名并描述用例,而不应使用实现中所用的术语。
使用**“关联”**链接参与者与用例。
参与者之间的继承
可以在参与者之间绘制**“泛化”**链接。 专用参与者(如示例中的“俱乐部顾客”)继承泛化参与者(如“顾客”)的用例。 箭头应指向更通用的参与者,如“顾客”。 创建链接时,首先指向更专用的参与者。
专用参与者可以有自己的额外用例,这些用例对于其他参与者是不可用的。
警告
不应造成会导致参与者泛化自身的泛化关系循环。循环可能会产生错误。
可选参与者图标
可以使用自定义图标而不是标准线条图来表示参与者。 例如,可以将其更改为类似于设备、餐馆、银行等的图标。
更改参与者的外观
右击参与者,然后单击**“属性”**。
将出现**“属性”**窗口。
将**“Image Path”**属性设置为图像文件的位置。
可以使用多种图像格式中的任何一种,包括 .gif、.jpg 和 .bmp。
使用包含在解决方案或项目源代码管理中的文件,以便在移动或复制解决方案时仍可用。
若要将此外观复制到其他用例图中,请复制该参与者并将其粘贴到其他关系图中。
- 图像的更改仅应用于特定关系图中的视图。 这不会应用于基础模型元素。 如果将参与者从 UML 模型资源管理器拖到另一个关系图中,该参与者将以标准线条图显示。
参与者与用例之间的重数
参与者与用例之间的关联可在每一端显示一个“重数”。
备注
如果用例图中某个关联两端的重数都为“1”,则隐藏该重数。
默认情况下,每个重数都为**“1”**。 在模型的严格释义中,以顾客订餐为例,重数为 1 表示一餐只有一名顾客预订并且每名顾客一次只订一餐。
您可以更改这些重数。
例如:
若要表明发生一次用例可有多名同类参与者参与,可将关联中参与者端的重数设置为**“1..*”**。
在图示中,一个或多个餐馆可参与实现同一订餐。
若要表明每名参与者可同时参与多次用例,可将关联中用例端的重数设置为**“*”**。
在图示中,每个餐馆可同时参与实现多个订餐。
设置关联的重数
右击关联,然后单击**“属性”**。
展开**“第一个角色”或“第二个角色”**。
“角色”表示关联一端的元素。
设置 Multiplicity 属性,可从下表中选择:
1,表明有且仅有此角色的一个实例参与每个链接。
1..*,表明此角色的一个或多个实例参与每个链接。
0..1,表明参与是可选的。
*,表明此角色的零个或多个实例参与该链接。
备注
很多团队不在用例图中提供重数信息,保留重数的默认值 1,而是在用例的其他描述中提供该信息。在这种情况下,用例图中的所有重数都将隐藏。
在多个关系图中使用一个参与者或用例
可以在多个关系图中显示相同的参与者或用例。 例如:
可以在不同关系图中描述同一参与者涉及的不同用例。
可以使用一个关系图来显示一个用例所关联的多个参与者和子系统,使用另一个关系图来显示如何将该用例结构化到被包括用例和扩展用例中。
在不同关系图中显示相同参与者或用例
在一个关系图中创建参与者或用例。
创建另一个用例图。
将参与者或用例从**“模型资源管理器”**拖到新关系图中。
备注
如果放入新关系图的是已关联的参与者和用例,则它们之间的关联将自动显示在新关系图中。
详细描述用例
用例表示:
参与者使用系统要实现的目标,如“购买餐饮”;以及
一个或多个方案,即为实现目标而执行的一系列步骤,如:{“订餐”、“付款”、“送餐”}。 除了成功方案以外,还可能有若干异常或失败方案,如“信用卡被拒”。
对用例的描述可以有不同的详细程度。 在设计的早期阶段,仅在用例图上标示名称就足够了。 稍后就可以编写更加详细的方案描述。
在 Visual Studio 旗舰版 中,可以采用多种方法描述用例,这些方法可以分开使用,也可以一起使用:
将用例链接到项目中的另一个或几个关系图。
活动图有助于解释包含循环、分支和并行线程的较复杂流程。 活动图还可以显示流程各部分之间的数据流。 有关更多信息,请参见UML 活动图:准则。
序列图有助于解释不同参与者之间复杂的交互序列。 序列图还可用于显示系统内发生的对每个用例的响应。 有关更多信息,请参见UML 序列图:准则。
将用例链接到用于详细描述用例的 OneNote 页面、节或段落。
将用例链接到 Word 文档,在该文档中使用文本、屏幕截图等来描述该用例的方案。 有关更多信息,请参见用户需求建模。
将用例链接到同一解决方案中的关系图或文件
绘制关系图(如序列图或活动图)来演示用例的方案。
返回到用例图。
将关系图或文件从解决方案资源管理器拖到用例图的空白部分。
使用**“依赖项”**从项目连接到用例。
链接到诸如 Word 文档或 PowerPoint 演示文稿等解决方案文件
编写一个文档,在该文档中使用文本、屏幕截图等来描述用例的方案。
向解决方案中添加文档。
将该 Word 文档移入解决方案所在的 Windows 文件夹。
在解决方案资源管理器中,右击解决方案,指向**“添加”,然后单击“现有项”**。
导航到该 Word 文档,然后单击**“添加”**。
该 Word 文档将显示在解决方案资源管理器的解决方案文件夹中。
将该 Word 文档从解决方案资源管理器拖到用例图的空白部分。
随即显示新项目。
使用**“依赖项”**从项目连接到用例。
链接到共享文档、OneNote 元素或网页
获取共享元素的 URL。 例如,此 URL 可以是以“\\”开头的网络文件路径、网页、以“http://”开头的 Sharepoint URL,也可以是指向 OneNote 节、页面或以“onenote:”开头的段落的链接。
在工具箱中,单击**“项目”**,然后单击用例图。
选定新项目后,在**“Hyperlink”**属性中键入或贴入 URL。
备注
双击项目可打开与其链接的关系图或文档。
将用例链接到工作项
如果您的项目使用 Visual Studio Team Foundation Server 2010 并且您有团队资源管理器,则可以将每个用例链接到 Team Foundation 中的一个工作项。 若要了解如何建立这些链接,请参见链接模型元素和工作项。
这可用于:
在链接的工作项中描述用例。 特别是,如果您的项目使用 Visual Studio Formal Process Template,则可链接到用例工作项。 此工作项类型提供对用例的目标和方案进行描述的字段。
将测试用例链接到用例,以便可以获取实现用例的代码开发进度的报告。
将任务链接到用例,以便可以跟踪开发工作的进度。
结构化用例
应设法只用几个主要用例来描述系统的行为。 每个大型用例定义某个参与者实现的主要目标,如购买产品,如果是从供应商的角度出发,就是提供用于销售的产品。
明确这些目标之后,可以细化如何实现每个目标以及基本目标的变体。
应避免将用例分解得过细。 用例应基于用户对系统的体验,而不是系统内部的处理。 此外,您通常会发现,创建代码的早期工作版本比花费时间对用例进行精细的结构化更高效。
您可以在用例图中概括主要用例和细化用例之间的关系。 以下各节对此进行介绍:
用包括显示用例的细节
用泛化共享目标
用扩展分离变体用例
用包括显示用例的细节
使用**“包括”**关系可以表明一个用例用于描述另一个用例的一些细节。 在图示中,“订餐”包括“付款”、“选择菜单”和“点菜”。 每个被包括的细化用例是一个或多个参与者为了实现包括用例的整体目标可能必须执行的一个步骤。 箭头应指向细化的被包括用例。
警告
不应造成会导致用例包括自身的包括关系循环。循环可能会产生错误。
可以共享被包括用例。 在示例中,“订餐”和“订阅评论”用例都包括“付款”。
被包括用例的目标和方案应具有独立意义,以便可以包括在以后设计的用例中。
将用例分为包括部分和被包括部分对于实现以下目标很有用:
将用例描述结构化为不同的详细层次。
避免在不同用例中重复共享方案。
定义详细步骤的顺序
用例图不提供执行细化步骤必须遵循的顺序,也不告知其中的每一步骤是否始终是必需的。
若要明确步骤的顺序,可以使用**“项目”**将其他文档附加到包括用例。 在下面的示例中,“订餐”用例附加了一个活动图。 或者,可以使用包含步骤列表或一系列屏幕截图的文本文档。 有关更多信息,请参见详细描述用例。
使用活动图时请注意下面的命名约定:
整个活动的名称与包括用例的名称相同。
活动图中的操作与被包括用例有相同的名称。
有关更多信息,请参见UML 活动图:准则。
用泛化共享目标
“泛化”关系用于表明专用用例是实现由另一个通用用例表示的目标的一种特定方式。 箭头应指向更通用的用例。
例如,“付款”泛化“信用卡付款”和“现金付款”。
警告
不应造成会导致参与者泛化自身的泛化关系循环。循环可能会产生错误。
专用用例有助于展示系统实现相同目标的不同方法。
专用用例视为继承了通用用例的目标和参与者。 通用用例可以没有自己的方案;其专用化描述实现目标的不同方法。
通过两个或更多用例重构共同目标
创建新的通用用例,并为其命名。
创建一个**“泛化”**关系,其箭头指向新的通用用例。
单击工具箱中的**“泛化”**。
单击专用用例(示例中为“信用卡付款”)。
单击通用用例(示例中为“付款”)。
如果已描述专用用例的目标,则可将共同部分移入通用用例的描述。
可将在专用用例之间共享的参与者移到通用用例。
用扩展分离变体用例
“扩展”链接用于表明一个用例可以在特定情况下向另一个用例添加功能。 箭头应指向被扩展的主用例。
警告
不应造成会导致参与者泛化自身的扩展关系循环。循环可能会产生错误。
例如,典型网站的“登录”用例可以包括“注册新用户”,但仅限用户还没有帐户的情况。
将用例分为主要部分和扩展部分
创建新的扩展用例,并为其命名。
创建一个**“扩展”**关系,其箭头指向被扩展用例。
单击工具箱中的**“扩展”**。
单击扩展用例(示例中为“注册新用户”)。
单击被扩展用例(示例中为“登录”)。
备注
不要在关系图中创建扩展关系的循环。用例不能成为自身的扩展。
如果已创建被扩展用例的方案,可将相关步骤移入扩展方案。
扩展的描述(示例中为“注册新用户”)应包括在主用例方案中出现扩展的位置和条件的详细信息。 将其视为修改主用例的描述。
扩展用例表示本应属于主用例方案一部分的方案步骤。 主用例的上下文将始终读入扩展的方案和目标,因此它们可以不具有独立意义。
描述以下情况时分离扩展很有用:
存在仅参与扩展用例的额外参与者。 例如,需要管理员来批准顾客在网站上的注册。
单独的子系统将处理扩展用例。
此扩展将只在系统的特定版本中可用。 您可以在用例图中将每个版本显示为一个单独的子系统。
使用子系统边界
子系统边界用于表明哪些用例在系统的范围内。
绘制子系统边界
在工具箱中单击**“子系统”**,然后单击关系图。
子系统将显示在关系图中。
拖动子系统的四角以调整其大小。
将现有用例拖入或拖出子系统以调整该子系统内容。
- 或 -
若要直接在子系统中创建新用例,请在工具箱中单击**“用例”**,然后单击子系统内部。
备注
用例的“Subjects”属性指示包含它的子系统。
系统范围外的用例
将属于业务组成部分但不由您开发的系统来处理的用例包括在关系图中通常是很有用的。 这有助于开发人员了解其工作背景。 例如,“送餐”可以显示为涉及参与者“餐馆”和“顾客”的用例,但在“订餐网站”的职责范围外。
多个子系统
可以创建多个子系统边界以表明不同用例是如何由不同的系统组件来处理的。 例如,“添加餐馆评价”可能在单独的论坛网站上处理。 请记住,用例图应处理用户可见的内容。 如果要描述系统内部的工作划分,应考虑使用组件图。
系统版本
可以使用不同的子系统边界来演示不同版本的系统。 例如,“付款”用例可能包括在“网站版本 2”中,但不在“版本 1”中。这表示系统可帮助顾客订餐, 但是,顾客必须直接付款给餐馆。
**“依赖项”**关系用于链接表示不同版本或变体的子系统。