常用UML图及PlantUML代码画图:整体概述及用例图
整体概述
目的:通过使用UML使得在软件开发之前,对整个软件设计有更好的可读性,可理解性,从而降低开发风险。同时,也能方便各个开发人员之间的交流。
概念:统一建模语言(Unified Model Language, UML),是由一整套图表组成的标准化建模语言。
软件:Visio、Visual Paradigm
插件:PlantUML
分类
按展示角度分类
在UML系统开发中有三个主要的模型:
功能模型:从用户的角度展示系统的功能,包括用例图。
对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
动态模型:展现系统的内部行为。包括序列图,活动图,状态图。
按功能分类
UML图分为结构图和行为图。
结构图:分为类图、轮廓图、组件图、组合结构图、对象图、部署图、包图。
行为图:分为活动图、用例图、状态机图和交互图。
交互图:分为序列图、时序图、通讯图、交互概览图。
用例图
用例图是指由参与者(Actor)、用例(Use Case),边界以及它们之间的关系构成的用于描述系统功能的视图。是系统的蓝图。
通俗些的描述,用例图是用来显示一组用例、参与者以及它们之间关系的图。它描述了用户希望如何使用一个系统。通过用例图可以知道谁是系统相关的用户,他们希望系统提供哪些服务,以及他们需要为系统提供什么样的服务。
主要作用
- 用来描述要开发的系统的功能需求和系统的使用场景
- 促进开发过程中各个阶段工作的进展
- 用来验证与确认系统需求
概念
参与者(Actor)
参与者也叫角色,它表示了系统的用户的集合。参与者指的不是具体用户本身,而是它在系统中所扮演的角色。如,一个用户在淘宝可以同时是买家和卖家两种角色。
注意:这里的用户并不特指人,如果我们开发的是公共 API 项目,那么这个时候,API 的调用者就是我们的用户。
用例(Use Case)
用例是对一组动作的描述,系统通过执行这些动作将对用例的参与者产生可以看到的结果。用来描述参与者可以感受到的系统服务或者功能。在 UML 中,用例通常用一个椭圆形符号来表示。
使用用例进行系统需求分析的特点:
- 用例是从系统的使用者角度来描述系统中的信息,即在系统的外部所能看到的系统的功能,而不考虑系统内部对该功能的具体实现
-
用例描述了可见需求,对应一个具体的用户目标。使用用例可以用来划分系统与外部实体的界限
-
用例通常由某个参与者来执行
-
用例把执行结果返回给参与者
-
用例在功能上具有完整性。它从参与者接受输入,再将产生的结果输出给参与者
当需要对用例进行详细说明时,可以需要编写用例描述:
用例之间的关系
关联关系(Association)
表示参与者与用例之间的交互,通信途径,任何已放都可发送或接受消息。使用普通箭头的实心线,箭头指向消息接收方。
代码示例
```plantuml
:用户: as user
(取款) as uc1
user -right-> uc1
```
包含关系(Include)
包含关系指的是两个用例之间,其中一个用例(基本用例)的行为包含了另外一个用例(包含用例)。
在 UML 图中,包含关系用带箭头的虚线表示,并且线上标有<<include>>,箭头的方向是从基本用例到包含用例。
代码示例
```plantuml
@startuml
:买家: as user
(加入购物车) as addList
(获取商品库存) as getRest
(获取用户购物车数量) as getListNum
user -right-> addList
addList ..> getRest: <<include>>
addList ..> getListNum: <<include>>
@enduml
```
扩展关系(Extend)
扩展关系是对基本用例的扩展,基本用例是一个完整的用例,即使没有子用例参与,也可以完成一个完整的功能。扩展的基本用例中存在一个扩展点,只有扩展点被激活时,子用例才会被执行。扩展关系是从扩展用例到基本用例的关系,它说明扩展用例如何插入到基本用例中。
扩展用例的使用场景:
表明用例的某一部分是可选行为
表明只在特定条件下才执行的分支
表明可能有一组行为,其中的一个或多个行为可以在基本用例中的扩展点处插入。所插入的行为和顺序取决于在执行基本用例时与主角进行的交互。
在 UML 图中,使用带箭头的虚线表示,并且虚线上标有 <<extend>>。
代码示例
```plantuml
@startuml
:买家: as user
(购买商品) as buyProduct
(打折) as discount
user -right-> buyProduct
buyProduct .right.> discount: <<extend>>
@enduml
```
泛化关系(Generalization)
泛化关系指的是一般(父用例)与特殊(子用例)的关系。当多个用例共同拥有一种类似的结构和行为时,可以将它们的共性抽象为父用例,其他的用例作为泛化关系中的子用例。
代码示例
```plantuml
@startuml
left to right direction
' 将默认方向从上到下改为从左到右
:买家: as user
(查找商品) as searchProduct
(精确搜索) as exactlySearch
(模糊搜索) as fuzzySearch
user --> searchProduct
searchProduct <|-- exactlySearch
searchProduct <|-- fuzzySearch
@enduml
```
分组关系
在一些用例图中,用例的数目可能很多,这时就需要把这些用例组织起来。这种情况在一个系统包含很多子系统时就会出现。另一种可能就是,当你按顺序和用户会谈,收集系统需求时,每个需求必须用一个单独的用例来表达,这时就需要某种方式来对这些需求进行分类。
最直接的方法就是把相关的用例放在一个包中组织起来。一组用例可以放在一个文件夹中。
总结
综上所述,用例之间存在着一定的关系,这些关系既有联系又有区别,在扩展关系中,基本用例是一个完整的用例,即是可以独立存在的用例。一个基本用例执行时,可以执行,也可以不执行扩展部分。
在包含关系中,基本用例可能时,也可能不是一个完整的用例。在执行基本用例时,一定会执行包含用例(inclusion use case)部分。
如果需要重复处理两个或多个用例时,可以考虑使用包含关系,实现一个基本用例对另一个用例的引用。
当处理正常行为的变型而且只是偶尔描述时,可以考虑只用泛化关系;当描述正常行为的变型而且希望采用更多的控制方式时,可以在基本用例中设置扩展点,使用扩展关系。