用例和用例图
用例
用例是文本形式的情节描述,广泛应用于需求的发现和记录工作中。
用例图
而用例图是指由参与者(Actor)、用例(Use Case)以及它们之间的关系构成的用于描述系统功能的视图,是被称为参与者的外部用户所能观察到的系统功能的模型图。
用例图是UML中较为重要和常用的一种图,由开发人员与用户经过多次商讨而共同完成,呈现了一些参与者和一些用例,以及它们之间的关系,主要用于对系统、子系统或类的功能行为进行建模。本章主要介绍用例图的概念、参与者和用例等一些基本概念及表示方法,以及用例图建模技术及应用技巧。
用例图的构成
系统(System)
系统是用例图的一个重要组成部分,用于执行特定功能。它不单指一个软件系统,而是为用户执行某类功能的一个或多个软件构件。如图书馆管理系统、学生选课系统、信息发布系统等都属于系统。
系统在用例图中用一个长方框表示,系统的名称被写在方框上面或方框内。方框内包含了该系统中用符号标识的用例,如下图所示:
参与者(Actor)
参与者是系统外的一个实体,它代表了与系统交互的用户、设备或另一个系统。 参与者是系统服务的对象,通过向系统输入信息或系统为参与者提供信息来进行交互,以实现系统功能。在确定系统的用例时,首要问题就是识别参与者。
在用例图中,参与者由固定的图形表示,并在参与者下面列出参与者的角色名。当为用例图中参与者命名时,给作为系统用户的参与者提供一个最能描述其功能的合适名称是非常重要的。当为参与者命名时要避免为代表人的参与者起一个实际的人名,而应该以其使用系统时的角色为参与者命名。例如下图表示的参与者,老师表示所有以老师身份使用系统的人,而并不单指某个人。
用例(User Case)
用例可以是一组连续的操作,也可以是一个特定功能的模块。系统由一个或多个用例构成,参与者与系统的关系主要表现在参与者与系统用例的关系。用例是一个叙述型的文档,用来描述参与者使用系统完成的事件。
在UML中,用例用一个椭圆来表示,用例的名称可以写在椭圆的内部,也可以写在椭圆的外部,但通常情况下是将其名称写在椭圆内部,如下图所示。
识别用例最好的方法就是从分析系统的参与者开始,对于已经识别的参与者,通过考虑每个参与者是如何使用系统的,以及系统对事件的响应来识别用例。使用这种策略的过程可能会发现新的参与者,这对完善整个系统的模型是有很大帮助的。用例模型的建立是一个迭代过程。
关系(Relation)
这里讲的关系是参与者与用例间的关系,即关联关系。用例图就是描述系统和参与者关系的,而用例和参与者都是独立的事物,关系就是它们之间的关联或通信。这种通信是双向的,参与者肯定要与某个或多个用例交互,用例也肯定会有参与者与之交互,否则参与者或用例将会成为多余。
| 关系类型 | 说明 | 表示符号 |
|---|---|---|
| 关联 | 参与者与用例间的关系。 | |
| 泛化 | 参与者间或用例间的关系,类似于继承关系,可以重载。 | |
| 包含 | 用例与用例的关系,将复杂的用例分解成小的步骤用例。 | |
| 扩展 | 用例间的关系。 |
关联关系(Association)
参与者与用例之间通信,任何一方都可以发送和接收消息,没有箭头,将参与者与用例相连,指向消息接收方。
泛化关系(Inheritance)
泛化是一种表示UML中项目的继承关系的技术。泛化可以应用于参与者和用例中来表示其子项从父项继承的功能,而且泛化还表示了父项的每个子项都有略微不同的功能或目的,以确保自己的唯一性。泛化可以用于用例,也可以用于参与者。
就是通常理解的继承关系,子用例和父用例相似,但是表现为更特别的行为。子用例继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的,在实际应用中很少使用泛化关系,箭头指向父用例。
包含关系(Include)
一个用例可以简单地包含其他用例具有的行为,并把它所包含的用例行为作为自身行为的一部分。这种情况下,新用例不是初始用例的一个特殊例子,并且不能被初始用例所代替。包含关系把几个用例的公共步骤分离成一个单独的被包含用例。
就比如做一件复杂的任务,需要做一下任务的细分。那么就可能出现如下图:
在为系统建模时,使用包含关系是十分明智的。因为它有助于在将来实现系统时,确定哪里可以重用某些功能,在编写代码时就可实现代码的重用,从而从长远意义上缩短系统的开发周期。
扩展关系(Extend)
扩展关系是指用例功能的延伸,相当于为基础用例提供一个附加功能。将基用例中一段相对独立并且可选的动作,用扩展(Extension)用例加以封装,再让它从基用例中声明的扩展点(Extension Point)上进行扩展,从而使基用例行为更简练和目标更集中。扩展用例为基用例添加新的行为。扩展用例可以访问基用例的属性,因此它能根据基用例中扩展点的当前状态来判断是否执行自己。但是扩展用例对基用例不可见。 对于一个扩展用例,可以在基用例上有几个扩展点。
包含(include)、扩展(extend)、泛化(Inheritance) 的区别
注:这里的泛化有些地方用的是Generalization,但我更建议用Inheritance,因为他在这里的用法就是继承
- 泛化侧重表示子用例间的互斥性;
- 包含侧重表示被包含用例对Actor提供服务的间接性;
- 扩展侧重表示扩展用例的触发不定性;
按发生条件分
- 无条件发生:肯定发生的;
- 有条件发生:未必发生,发生与否取决于系统状态;
泛化与包含用例属于无条件发生的用例,而扩展属于有条件发生的用例
例提供服务的方式
- 直接
- 间接
泛化中的子用例提供的是直接服务,而包含中的被包含用例提供的是间接服务,扩展用例提供的也是直接服务,但扩展用例的发生是有条件的
用例图系统举例
自动柜员机
医院接待系统
旅游团登机
总结
用例图是一种将用例和软件工具相结合的图形表示方式,它由参与者发起,主要显示了一组用例、参与者以及它们之间的关系。