第8章 · 播客 第8集
系统分析与设计方法 · 交互图、状态图与活动图
🎙️ 本集播客:第8集:顺序图的两个轴、通信图的重心、定时图的四个变化讲清三种交互图的分工,状态图的五种组成与「一个初态多个终态」,活动图的判定泳道对象流信号,以及活动图和状态图的那条血缘界线。 语音由微软 Edge 神经网络语音预生成(女声·晓伊,男声·云希)。点击下方任意对话可直接从该句开始播,当前句朗读时下一句已预先加载,无缝衔接。
明
阿明
动态建模三件套,从哪张图开始?
雅
小雅
先给交互图定位:交互图是表示各组对象如何依某种行为进行协作的模型,通常可以使用一个交互图来表示和说明一个用例的行为。UML 中包括 3 种不同形式的交互图:强调对象交互行为顺序的顺序图;强调对象协作的通信图,在 UML 1.X 版本中称为协作图;强调消息的具体时间的定时图。原文还补了一句:它们之间没有什么本质不同,只是排版不尽相同而已。「只是排版不同」这句可以做判断题。
明
阿明
顺序图先来。
雅
小雅
顺序图用来描述对象之间动态的交互关系,着重体现对象间消息传递的时间顺序。它允许直观地表示出对象的生存期,在生存期内对象可以对输入消息做出响应,并且可以发送信息。顺序图存在两个轴:水平轴表示不同的对象;垂直轴表示时间,表示对象及类的生命周期。哪个轴是时间?垂直轴。这个也考。
雅
小雅
对象间的通信通过在对象的生命线间画消息来表示,消息的箭头指明消息的类型。顺序图中的消息可以是信号、操作调用或类似于 C++ 中的 RPC,也就是远程过程调用,和 Java 中的 RMI,也就是远程方法调用。当收到消息时,接收对象立即开始执行活动,即对象被激活了,通过在对象生命线上显示一个细长矩形框来表示激活。消息可以用消息名及参数来标识,也可带有顺序号;还可带有条件表达式,表示分支或决定是否发送消息,如果用于表示分支,则每个分支是相互排斥的,即在某一时刻仅可发送分支中的一个消息。
明
阿明
细长矩形框表示激活,分支相互排斥。通信图呢?
雅
小雅
通信图用于描述相互合作的对象间的交互关系和链接关系。虽然顺序图和通信图都用来描述对象间的交互关系,但侧重点不一样:顺序图着重体现交互的时间顺序,通信图则着重体现交互对象间的静态链接关系。这道对比是必考题,一句话——顺序图看时间、通信图看链接。
明
阿明
先别往下走,我复述一遍三种交互图你听听对不对:顺序图强调交互的时间顺序,通信图强调对象协作,旧名协作图,定时图强调消息的具体时间。
雅
小雅
一字不差。再追一问检验一下:如果一个系统要按毫秒级刻度展示「门开三十秒后自动关」,你会选哪张图?
明
阿明
定时图,因为它有时间刻度,而且它本质是特殊形式的顺序图。
雅
小雅
满分。这种「给场景选图」的题在考试里越来越常见,你刚才的推理路径——先看强调什么、再看时间约束——就是标准解法。
明
阿明
定时图是 UML 2.0 的新东西吧?
雅
小雅
对。如果要表示的交互具有很强的时间特性,例如现实生活中的电子工程、实时控制等系统,在 UML 1.X 中是无法有效地表示出来的,而在 UML 2.0 中引入了一种新的交互图来解决这类问题,这就是着重表示定时约束的定时图。根据 UML 的定义,定时图实际上是一种特殊形式的顺序图,即一种变化,它与顺序图的区别主要有四点:坐标轴交换了位置,改为从左到右来表示时间的推移;用生命线的凹下凸起来表示状态的变化,每个水平位置代表一种不同的状态,状态的顺序可以有意义、也可以没有意义;生命线可以跟在一根线后面,在这根线上显示一些不同的状态值;可以显示一个度量时间值的标尺,用刻度来表示时间间隔。
雅
小雅
原文用电子门禁系统举了个完整例子:一开始读卡器是启用的等用户来刷卡、处理器是空闲的、门是关的;用户刷卡时读卡器进入等待校验状态,并发一个消息给处理器,处理器进入校验状态;校验通过就发送禁用消息给读卡器,使读卡器进入禁用状态,门的状态变成开;门开了 30 秒钟之后,根据时间刻度得知,处理器将再次关上门,并发送启用消息给读卡器,读卡器重新进入启用状态,处理器回到空闲状态。定时图包含的图元并不多,主要包括生命线、状态、状态变迁、消息、时间刻度。
明
阿明
这个 30 秒关门就是时间刻度的价值。三种交互图齐了,状态图呢?
雅
小雅
状态图用来描述一个特定对象的所有可能状态及其引起状态转移的事件。大多数面向对象技术都用状态图表示单个对象在其生命周期中的行为,一个状态图包括一系列的状态及状态之间的转移。
雅
小雅
状态图的组成五件套:状态,又称为中间状态,用圆角矩形框表示;初始状态,又称为初态,用一个黑色的实心圆圈表示,在一张状态图中只能够有一个初始状态;结束状态,又称为终态,在黑色的实心圆圈外面套上一个空心圆,在一张状态图中可能有多个结束状态;状态转移,用箭头说明状态的转移情况,并用文字说明引发这个状态变化的相应事件。数一数:初态一个、终态可以有多个,这个不对称是经典考点。另外,一个状态也可能被细分为多个子状态,如果将这些子状态都描绘出来,那这个状态就是复合状态。
明
阿明
「初始状态只能有一个,结束状态可能有多个」,这条我背了。状态图什么场合用?
雅
小雅
先举个原文的实例帮你想画面:数码冲印店的订单状态图。订单从初始状态出发,经过一系列中间状态,比如待处理、处理中、已完成,某些路径走到终态,也可能因取消走到另一个终态——这就是「一个初态、多个终态」的活例子。每个箭头上标注引发转移的事件,比如「客户付款」「质检不合格」。
雅
小雅
原文有限定:状态图适合用于表述在不同用例之间的对象行为,但并不适合用于表述包括若干用例协作的对象行为。通常不会需要对系统中的每一个类绘制相应的状态图,而通常会在业务流程、控制对象、用户界面的设计方面使用状态图。两个考点藏在这段:一是「不适合表述若干用例协作的对象行为」,二是典型应用场合是业务流程、控制对象、用户界面。
明
阿明
最后一张,活动图。它跟状态图什么血缘?
雅
小雅
血缘很直白:活动图是由状态图变化而来的,它们各自用于不同的目的。活动图的应用非常广泛,它既可用来描述操作,也就是类的方法的行为,也可以描述用例和对象内部的工作过程。活动图依据对象状态的变化来捕获动作,也就是将要执行的工作或活动,与动作的结果。两者最要紧的 behavioral 差别:活动图中一个活动结束后将立即进入下一个活动,而在状态图中状态的变迁可能需要事件的触发。
明
阿明
活动图不用等事件,活动完自动走下一个。它有哪些专属元素?
雅
小雅
基本活动图与状态图类似,包括初始状态、终止状态,以及中间的活动状态,每个活动之间也就是一种状态的变迁。在此之上引入了两个概念:判定,说明基于某些表达式的选择性路径,在 UML 中使用菱形表示;分支与组合,由于活动图建模时经常会遇到并发流,因此在 UML 中引入了粗线来表示分支和组合。注意区分:菱形是判定、粗线是并发分支与组合,别把两个符号混用。
雅
小雅
然后是带泳道的活动图。基本活动图虽然能够描述系统发生了什么,但没有说明该项活动由谁来完成,针对面向对象编程而言,这就意味着活动图没有描述出各个活动由哪个类来完成。要想解决这个问题,可以通过泳道来解决,它将活动图的逻辑描述与顺序图、协作图的责任描述结合起来。一句话记泳道:泳道回答「谁来做」。
雅
小雅
还有两个可选元素。对象流:在活动图中可以出现对象,对象可以作为活动的输入或输出,对象与活动间的输入输出关系由虚线箭头来表示,如果仅表示对象受到某一活动的影响,则可用不带箭头的虚线来连接对象与活动。信号:在活动图中可以表示信号的发送与接收,分别用发送和接收标识来表示,发送和接收标识也可与对象相连,用于表示消息的发送者和接收者。
明
阿明
虚线箭头是输入输出关系,不带箭头的虚线是仅受影响,这个方向别记反。
雅
小雅
对。把 UML 这几集的图再总串一遍方便你定位:静态六图看类图、对象图、包图、构件图、部署图、制品图;动态交互三图,顺序图看时间顺序、通信图看静态链接、定时图看定时约束;行为两图,状态图描述单个对象所有可能状态及转移事件,活动图由状态图变化而来、活动结束立即进入下一个活动;物理两图,构件图讲逻辑依赖、部署图讲物理拓扑。一共 14 种图就都在这张地图上了。
明
阿明
按「静态、交互、行为、物理」四个抽屉放,一下就清楚了。
雅
小雅
本集必背:交互图三种,顺序图强调时间顺序、通信图强调协作且旧称协作图、定时图强调消息具体时间,三者无本质不同只是排版不同;顺序图水平轴是对象、垂直轴是时间,细长矩形表示激活,消息分支相互排斥;定时图是 UML 2.0 引入的、特殊形式的顺序图,坐标轴交换、从左到右表示时间,图元有生命线、状态、状态变迁、消息、时间刻度;状态图初态一个、终态可以有多个,子状态画出来叫复合状态,适合表述不同用例之间的对象行为、不适合若干用例协作的行为,典型场合是业务流程、控制对象、用户界面;活动图由状态图变化而来,活动结束立即进入下一个活动,菱形是判定、粗线是并发分支与组合,泳道回答谁来做,对象流用虚线箭头,信号有发送和接收标识。
明
阿明
14 种图全通关了。
雅
小雅
下一集离开 UML,讲两块容易被忽视的内容:用户界面设计的三个黄金法则(练习题第 9 题)和设计四步,以及工作流设计——十大术语、WFMC 参考模型的六个模块,还有那组近连接与远连接的辨析也在后面等着。