1.1 指南:包含关系
主题
∙
解释 ∙
执行包含 ∙
描述包含关系 ∙ 使用示例
1.1.1 解释
基本用例通过包含关系连接到包含用例。
包含用例总是抽象的。
它描述在执行基本用例的用例实例中插入的行为段。
基本用例可控制与包含用例的关系,并可依赖于执行包含用例所得的结果,但基本用例和包含用例都不能访问对方的属性。
从这种意义上讲,包含用例是被封装的,它代表可在各种不同基本用例中复用的行为。
您可以将包含关系用于:
∙
从基本用例中分解出这样的行为:它对于了解基本用例的主要目的并不是必需的,只有它的结果才比较重要。
∙ 分解出两个或更多个用例所共有的行为。
示例:
在 ATM 系统中,用例 Withdraw Cash (提款)、Deposit Cash (取
款)和 Transfer Funds (转账)都需要包含系统识别客户的方式。
可以将此行为抽取到一个名为 Identify Customer (识别客户)的
新包含用例中,这三个基本用例都包含此用例。
这些基本用例独立
于用于标识的方法,因此将此方法封装在包含用例中。
从基本用例
的角度来看,标识方法是否会读取银行磁卡或执行视网膜扫描并不
重要。
它们仅依赖于 Identify Customer 的结果,即客户的身份。
反之亦然,从 Identify Customer 用例的角度来看,基本用例如
何使用客户身份或者在执行包含用例之前基本用例中发生了什么
并不重要:标识方法都会完全相同。
在ATM 系统中,用例Withdraw Cash、Deposit Cash 和Transfer
Funds 中都包含用例Identify Customer。
一个基本用例可以有多个包含用例。
一个包含用例可以包含在若干基本用例中。
这并不表示这些基本用例之间存在任何关系。
甚至同一个包含用例和同一个基本用例之间可以有多个包含关系,前提是包含用例必须在基本用例中的不同位置插入。
而包含关系就定义了插入的位置。
添加的所有用例都可以是嵌套的,这意味着一个包含用例可以用作另一个包含用例的基本用例。
由于包含用例是抽象的,因此它不需要有与它相关的主角。
只有当包含用例中的行为明确地涉及到与主角的交互时,才需要与主角的通信关联关系。
1.1.2执行包含
包含用例的行为插入到基本用例中的一个位置。
当遵循基本用例说明的用例实例到达基本用例中定义了包含关系的位置,它就将改而遵循包含用例的说明。
一旦执行完包含用例,用例实例就将在基本用例中它先前停止的地方重新开始。
遵循基本用例(包含了包含用例)说明的用例实例。
包含关系是无条件的:如果用例实例到达基本用例中定义了包含关系的位置,就总会执行包含。
如果要表达条件,就需要将其作为基本用例的一部分来表达。
如果用例实例无论如何也不能到达定义了包含关系的位置,则不会执行包含。
用例实例#1 到达基本用例中定义了包含关系的位置,并执行包含。
用
例实例#2 没有到达该位置,因此包含不会作为该实例的一部分来执
行。
包含用例是一个连续的行为段,所有这些行为都包含在基本用例的一个位置中。
如果您需要将一些行为段分别插入不同位置,就应考虑使用扩展关系(请参见指南:扩展关系)或用例泛化关系(请参见指南:用例泛化关系)。
1.1.3描述包含关系
对于包含关系,您应在基本用例的行为序列中定义要插入包含用例的位置。
要定义该位置,可以引用基本用例事件流中的特定步骤或分支流。
示例:
在 ATM 系统中,用例 Withdraw Cash 包含用例 Identify
Customer。
从 Withdraw Cash 到 Identify Customer 的包含关系
可以如下描述:
Identify Customer 插入到 Withdraw Cash 事件流中的“1.1 用
例开始”部分和“1.2 询问金额”部分之间。
为清晰起见,您还应在描述基本用例事件流的文本中提及包含用例。
1.1.4使用示例
如果基本用例中有一个行为段,在那里您可以看到用例不依赖于执行方式,但依赖于功能的结果,那么您就可以将此行为抽取到一个包含用例中,以简化该基本用例。
包含用例可以包含在多个基本用例中,所以您可以在模型的多个用例中复用行为。
对于一个简单电话系统的两个用例,可考虑以下分步概述:
Place Call(打电话)
1.呼叫方拿起听筒。
2.系统发出拨号音。
3.呼叫方拨打一位数字。
4.系统结束拨号音。
5.呼叫方输入电话号码的其余数字。
6.系统对数字进行分析,确定接收方的网络地址。
7.系统确定是否可以在呼叫方与接收方之间建立虚拟通路。
8.系统为虚拟通路分配所有资源并建立连接。
9.系统让接收方的电话振铃。
10.等等。
Start System(启动系统)
1.接线员激活系统。
2.系统对所有构件执行诊断测试。
3.系统对与所有相邻系统的连接进行测试。
对于每个相邻系统,系统确定是否可以在
自身与该相邻系统之间建立一个虚拟通路。
系统为虚拟通路分配所有资源并建立
连接。
4.系统作出响应,表示它已准备好执行操作。
5.等等。
以上列出的蓝色文本极为相似。
在这两种情况下,尽管行为的目的极其不同,我们执行的却是相同的行为。
这种相似性是可以利用的,我们可以将共同的行为抽取到新的用例 Manage Virtual Circuits(管理虚拟通路)中。
当抽取出共同行为后,这两个用例就变成:
Place Call
1.呼叫方拿起听筒。
2.系统发出拨号音。
3.呼叫方拨打一位数字。
4.系统结束拨号音。
5.呼叫方输入电话号码的其余数字。
6.系统对数字进行分析,确定接收方的网络地址。
7.包含Manage Virtual Circuit 用例,在网络中建立连接。
8.系统让接收方的电话振铃。
9.等等。
Start System
1.接线员激活系统。
2.系统对所有构件执行诊断测试。
3.系统对与所有相邻系统的连接进行测试。
对于每个相邻系统(回路),包含Manage
Virtual Circuit,在网络中建立连接。
4.系统作出响应,表示它已准备好执行操作。
5.等等。
在用例图中,已创建的包含关系将如下所示:
用例Place Call 和Start System 都包含有抽象用例Manage Virtual
Circuit 的行为。