Lecture 5 系统建模
模型是从某个特定视角对系统的一个抽象,也就是提取最显著特征之后的简化,并不是系统的另一种等价表示。比如,这个笔记就是对这门课的一个抽象。建模可以比较清楚的看到系统的功能、优缺点,还有助于更好的讨论设计方案、文档等。
一般比较常见的视角有:
- 外部视角(external),关注上下文或环境,比如系统是否要使用第三方 API
- 交互视角(interaction),关注系统与环境或用户,以及构件之间的交互(方式)
- 结构化视角(structural),关注系统组织结构或系统所处理的数据的结构,
- 行为视角(behavior),关注系统的动态行为、系统如何响应事件,比如异常怎么处理
UML(Unified Modelling Language,统一建模语言)面向对象建模的标准语言。UML 当中有多种图的模型,但是只需要其中 5 个就可以描述系统的基本特性:
- 活动图(activity diagram)
- 用况图(use case diagram)
- 顺序图(sequence diagram)
- 类图(class diagram)
- 状态图(state diagram)
系统建模:外部视角 external perspective
上下文模型 context model
在系统开发的初期(编写规格说明书)的时候,就要确定系统的边界,也就是确定系统应该包含什么、不应该包含什么。然后,用简单的 block 图,或者空的类图,粗略表述一下系统与环境之间的关联(因为 UML 当中没有专门针对上下文模型的图)。
用 UML 画上下文模型
用一个矩形方块表示一个系统(可以是本身也可以是外部的),然后用一条实线把内部外部系统连接起来
如图,表示了一个精神病住院治疗系统(Mentcare)及其环境中其他系统的上下文模型。
术语:构造型 stereotype
构造型是三种 UML 扩展方式之一。
在图表中,构造型跟元素紧挨着,用 <<xxx>>
的形式表述,用于描述这个元素是什么类型的,如:<<system>>
,<<use>>
,<<include>>
,<<import>>
等。
上述示例图当中每一个方块表示的都是一个系统,所以都是 <<system>>
。
业务流程模型 business process model
刚才用 UML 画出来的上下文模型,只是体现了系统之间有关系,但是没有具体体现,到底是什么关系,比如,系统 A 给系统 B 提供什么数据?用网络还是什么方式提供?
业务流程模型,顾名思义,对业务流程进行建模。也就是描述,这个系统怎样参与到业务当中去。
在 UML 当中可以使用 活动图 表示业务流程模型,因为活动图可以描述一个过程。业务流程模型也可以用 业务流程模型和标记法(Business Process Model and Notation,BPMN) 表示。
活动图 activity diagrams
活动图显示了过程中的一个活动,以及从一个活动到另一个活动的控制流(flow),用 activity nodes 与 activity edges 描述(就跟状态机似的)。
图例
- 圆角矩形:表示一个「活动」,也就是必须执行的子过程
- 直角矩形:表示一个元素或对象
- 菱形:表示一个「决策」,类似于
if
语句,条件在旁边用[xxx]
[yyy]
表示 - 黑色实心圆:表示初始节点,也就是工作流的开始
- 黑色实心圆外边套个圈圈:表示结束节点
- 很粗的实线(或又长又窄的条条):也是一种控制节点,表示并行活动的开始(分离,split or fork)或结束(汇合,join)
- 箭头:从开始走到结束,表示执行的顺序
示例:活动图描述 Mentcare 系统如何对精神病患者强制拘留住院
系统建模:交互视角 interaction perspective
系统当中可以有多种类型的交互,比如用户交互(输入输出),比如这个系统与环境中其它系统的交互,再比如系统内部不同构件之间的交互…
用况(use case)
用况是一个任务,可以与系统外部的交互。外部的主体通常是人类,也可以是其它系统。
用况图相当于用况的一个简单概览。而如果想要详细的描述,可以用表格的方式:
用况 | 用户故事管理系统:更新用户故事 |
---|---|
参与角色 actors | 产品负责人 |
描述 descriptions | 负责人登陆进去管理系统,对用户故事进行修改,然后检查是否合法,检查完毕后保存。更新好之后,可以选择是否刷新界面显示 |
数据 data | 系统当中存储的一个用户故事 |
触发激励 stimulus | 负责人的命令 |
响应 response | 确认用户故事已经被更新、通过合法性检查并保存 |
注解 comments | 必须是负责人才有这个权限 |
用况图
关系
用况图是用户与系统交互的最简表示形式,展现了用户和与他相关的用况之间的关系。
用况与用况之间,可以有包含(include)和扩展(extend)关系。
$A \xrightarrow{\text{<
$A \xleftarrow{\text{<
于是刚才那个表格可以这样表示出来
还有一种关系叫做泛化(generalization)。$A \rightarrow B$ 大概含义就是 $A \in B$。比如,经理也是一种员工。利用泛化,可以对用况图进行简化:
图例
- 小人表示一个角色。注意这个角色可以是人,也可以是物体(比如其它系统)
- 实线方框表示一个系统的边界
- 椭圆表示用况
- 横线与
<<xxx>>
合在一起表示一种关系
顺序图
顺序图可以直观的看出来 actor 与系统以及系统各个构件之间的,按照时间排序的交互。
图例
- 标着 sd 的框,由于 sd 是 sequence diagram 的缩写,顾名思义,是框起来整个图
- 标着 alt 的框,alternate,表示分支。条件用
[xxx]
表示。课件画的不对,中间应该是用虚线分隔,而不是实线。 - $\boxed{\text{:类名}}$ 与 $\boxed{\text{对象名:类名}}$ 很好理解
- $\times$ 表示销毁:在
new
-delete
的顺序图描述当中可以看到 - line-arrowhead 表示异步消息:sender 发出消息后,继续干自己的事情
- solid-arrowhead 表示同步消息:sender 会等待 receiver 的回应,类似函数调用
- 反向的 dashed-arrowhead 表示返回的消息:(貌似也是异步的)
- 一个圆加上箭头表示 found message:未知 sender 或 sender 未画出
- 一个箭头加上一个圆圈表示 lost message:没有发送到 receiver 或 receiver 未画出
不好描述。但是看几个顺序图例子就应该能懂的差不多了。
上图橙色圆圈的递归调用,可以理解为重新回到整个蓝色长条的起点
系统建模:结构视角 structural perspective
结构模型,既可以是用来描述系统设计结构的静态结构的模型,也可以是用来描述系统运行时的组织的动态的模型(因为有交互所以动态)。讨论和设计系统结构的时候,系统模型就很有用。
类图 Class diagram
类图可以用来描述系统静态结构的模型。
这个比前面简单些了。
泛化 Generalization
实线连接,空心三角箭头
实现 Realization
就是「类」实现「接口」。接口在类图当中用 <<interface>>
注明。使用虚线链接的空心三角箭头。
Composition & Aggregation & Association
聚集在中间。
从左到右,越来越宽泛。
Association 是最宽泛的,只是表示两个东西有联系。也有的地方把 Association 叫做「相识 acquaintance」。
聚集(aggregation),可以理解为「part of」。
composition 表示「whole/part」的关系。如果其中一个移除掉了,那么对应的另一个也要移除掉。
课件写的太烂了,不是很好理解,所以我咨询了 Chat GPT。以下是它给出的回答:
Q: 如何理解 uml 类图当中的:association、aggregation、composition?
A: 在 UML 类图中,三个最常用的关系是关联(Association)、聚合(Aggregation)和组合(Composition),它们表示类之间的不同类型关系。
关联(Association) 关联是一种表示对象之间的连接关系的关系类型。它描述了两个或多个对象之间的关系,它们可以相互交互,但彼此之间没有拥有关系。关联可以是双向的,也可以是单向的。在 UML 类图中,关联通常用一条带箭头的线表示,箭头指向关系的终点。例如,一个订单对象和一个客户对象之间的关联可能是一个双向的关联。
聚合(Aggregation) 聚合是一种表示 “整体 - 部分” 关系的关系类型。它描述了一个对象由多个组成部分组成,但这些组成部分可以从整体中分离出来并存在于其它地方。在 UML 类图中,聚合通常用一条带 空心菱形 的线表示,菱形指向整体。例如,一个车库对象可以包含多个汽车对象,但是汽车可以存在于其他地方,如公路上或停车场。
组合(Composition) 组合是一种表示 “整体 - 部分” 关系的关系类型,它比聚合更强,因为部分不能从整体中分离出来。组合表示一个对象由其组成部分组成,并且没有部分,该对象将不再存在。在 UML 类图中,组合通常用一条带 实心菱形 的线表示,菱形指向整体。例如,一幅画由多个独立的形状组成,但是形状不能被从画中分离出来。
高赞博客 的解释
- 关联,类 A 使用类 B 作为成员。
- 聚合,“has-a”的关系。
- 组合,“contains-a”的关系。
包图 Package diagram
包(package)就像是命名空间(namespace)。
注意 containment 和 import 是两个不同的东西: - containment 有包含的意思。$A -\oplus B$ 表示 $A$ 是 $B$ 的一部分。并不等于 import。 - import 的意思是,实现一个包,依赖于另一个包,跟 python 差不多。
部署图 Deployment diagram
用于体现系统当中物理元素、逻辑元素与资源之间的关系。