链接复制成功!
绘制消息线和激活块
约束与限制
根据建模规范限制,建模的连线不能独立存在于图中,两端必须是连接在元素上的,因此不允许消息线直接拖拽至画布上。且绘制顺序图时,必须保证图的类型为顺序图,否则可能导致无法绘制对应消息线。参考常见问题如何查看和修改模型图类型。
自消息线分为同步自消息线和异步自消息线,工具当前仅支持同步自消息线。
消息线介绍
顺序图用消息线描绘元素之间的工作流或者活动。软件模型中,消息线可以用来代表源端或目标端元素的操作或者属性。您可以根据需求绘制消息线,绘制消息线后,也可以提升或降低消息线层级。
介绍参考元素介绍中消息线和激活块分类。
建模规范
- 同步消息线(Message)/异步消息线(Async Message)
这两类消息线都是指令/任务型消息,一般用来表达发送方向接收方传递指令或调用任务,这些任务通常是有执行时间的。目标生命线在执行任务的这段时间处于激活状态,会在生命线上生成对应的激活块。
对应的代码模型。
同步消息线与异步消息线的区别是相对于消息发送方而言的,同步消息线的发送方会等待指令/任务执行完成,在指令/任务执行过程中它也是处于激活状态,所以发送方的生命线上会有对应激活块。而异步消息线的发送方不会等待指令/任务完成,在消息线发送之后它就处于非激活状态了。
“输入账号密码登录”是同步消息,“顾客”生命线在发送完之后处于等待状态,直到“通知登录结果”消息传来,它都是处于激活状态。
“输入账号密码登录”是异步消息,“顾客”生命线在发送完之后不再等待,在“通知登录结果”传来的这段时间内,它都是处于非激活状态。
- 返回消息线(Reply Message)
返回消息线是针对同步/异步消息线的结果响应,它本身不是指令/任务型的,即它不会触发目标生命线的任务调用或者指令执行。
对应到代码模型,返回消息线一般表示的是方法/函数中的renturn语句,或者是接口请求中的数据返回。
从上面模型图和代码中可以看到,同步消息线是对verify方法的调用,属于指令/任务型的消息,而返回消息线是verify方法中的结果返回,它不直接调用或者触发LoginPage中方法的执行。
- 自消息线(Self Message)
自消息线是目标生命线发向自己的指令/任务型消息,它会在原有激活块上生成二级或更高层级激活块。对应到软件模型,自消息线一般表示对象调用自身的方法/函数。
对应的代码模型。
- 创建对象消息线(Create Message)/ 销毁对象消息线(Delete Message)
顾名思义,创建对象消息线会动态创建目标对象,该目标对象可能是一个临时对象,也可能是一个动态创建的永久对象。对应软件模型,当一个对象不是在系统运行初期就存在,而是在运行过程中由其余对象创建出来的,则该对象的创建过程适合用创建对象消息线来表示。
销毁对象消息线会动态销毁目标对象,目标对象可能是由创建对象消息线临时生成的,也可能是系统运行初期就存在的对象。对应软件模型,当要进行资源回收时,通常需要销毁目标对象,此时可以用销毁对象消息线来表示资源回收过程。
对应的代码模型。
- 激活块(Activation)
激活块表示的是目标对象(生命线)处于激活状态的时间段,它是由消息线触发生成的。顺序图中一共有六类消息线,其中有五类消息线(Message、Async Message、Self Message、Create Message、Delete Message)是指令/任务型消息,可以在目标生命线上生成激活块(创建对象消息线对应的指令是创建目标对象),而返回消息线(Reply Message)一般是对其余消息线的结果响应。
激活块上可以挂载二级甚至更多层级的激活块,表示的是对应层级消息的子任务激活状态。
- 绘制消息线。
- 编辑消息线。选中连线按F2键/回车键/右键单击消息线选择“编辑”,可以编辑消息线名称。
- 移动消息线。消息线有两种移动方式:平移和跨线移动。
- 平移是指对选定消息线在垂直方向上移动,该消息线相对于其余消息线的位置不变,但该消息线及其下方其余消息线均会同步移动,平移的消息线不能越过该消息线上方的其余消息线,平移操作可能会触发生命线高度变化。平移的目的一般是调整消息线之间的间距,或者为插入新消息线留空间。
- 跨线移动是指调整选定消息线在生命线上的位置,该消息线相对于其余消息线的位置会变化,但不会影响其余消息线的位置(其余消息线不移动)。跨移的消息线可以移动到生命线上任意位置,由于消息线的顺序发生变化,一般会导致激活块的状态发生改变。跨线移动的目的一般是为了纠错,某个消息线原先的位置画错了,通过跨线移动对其进行调整。
选中消息线,按住Ctrl按键,再利用鼠标左键按住消息线在垂直方向上移动。
- 平移是指对选定消息线在垂直方向上移动,该消息线相对于其余消息线的位置不变,但该消息线及其下方其余消息线均会同步移动,平移的消息线不能越过该消息线上方的其余消息线,平移操作可能会触发生命线高度变化。平移的目的一般是调整消息线之间的间距,或者为插入新消息线留空间。
- 变更消息线类型/连接端。对于已连接的消息线,工具提供了变更消息线类型以及变更连接端的能力。
- 右键单击消息线,选择“类型&构造型”,修改消息线类型。
- 右键单击消息线,选择“类型&构造型”,修改消息线类型。
- 绑定方法/接口。如果生命线是定义方法或者实现接口的元素,则对于指向该生命线的消息线,可以绑定目标元素上定义的方法或者接口。
在类图中的Student元素定义方法Study
选中顺序图消息线,右键 > 绑定/解绑接口。
选择Student元素定义的方法Study。
单击绑定,方法同步更新到消息线上。
同样可以绑定接口元素。
模型示例
- 以老师安排学生大扫除为例解释下顺序图中激活块的概念(映射到计算机系统/软件模型,激活块代表的是对应部件或者软件对象处于激活状态的时间段)。
如上所示,老师安排劳动委员组织学生对教室进行大扫除活动,老师先给劳动委员下达了大扫除的任务指示,并要求在大扫除结束后向他汇报成果。假设老师在大扫除期间没有其余事情可做,下达任务后一直等待任务完成,那么在老师这条生命线上会有一个贯穿任务始终的激活块,表示老师在这个时间段内处于活跃状态(全程关注大扫除这个任务);而劳动委员负责大扫除任务的子任务安排(任务调度),他的活跃状态与老师几乎一致(安排任务、验收结果以及汇报成果)。
学生A和学生B在这个过程中负责不同的子任务,由于子任务之间存在先后顺序(必须先扫地再拖地),所以在图中呈现的是上下顺序。对于学生A来讲,他在接到任务、扫地及任务结束验收期间是处于活跃状态的,而此时学生B还未被安排任务,此时的他是未激活的(所代表的生命线在对应时间段内没有激活块)。同理,对于学生B来讲,从他接到任务、拖地到任务结束验收期间他处于激活状态,而此时学生A由于完成了子任务且没有其余任务,他就是处于未激活状态。
附载在激活块上的小方块,实际也是激活块,它表示的是子任务。比如学生B在接到拖地任务后,就执行了洗拖把和拖地这两个子任务,两个子激活块代表的是学生B在这两个子任务上的活跃时间段。
综上,激活块代表的是目标对象由于执行任务(进入激活状态)到结束任务(恢复未激活状态)的时间段,它的高度并不完全等同于任务时间长短,只是用来表示任务执行顺序以及目标对象激活状态。
- 消息线3对应GoodsManager中的queryByName调用,由于调用DataService中的queryByName是异步操作,所以消息线3是异步消息线。
- 消息线5基于商品数据动态创建了商品对象,商品对象不是在系统运行初期就存在的,所以消息线5用Create Message来表示对象的动态创建过程。
- 消息线7是数据服务对商品管理查询信息的返回,对应DataService中queryByName函数的return语句,它不会主动触发商品管理中函数的执行,所以消息线7是返回消息线。
- 消息线14将商品对象的元数据加入到购物车中,商品对象不再被使用,会在add函数结束后被自动回收。如果在回收之前需要对其进行显式销毁,可以用消息线15的销毁对象消息线来表示。
- 消息线9是将商品对象加入到购物车中,由于涉及异步查询库存信息,所以消息线9是异步消息线。用户执行该操作后可以继续执行消息线16的商品浏览,消息线16并不需要等待消息线9及其后续所有子任务执行完成,它和消息线9是非阻塞的并发关系。但由于顺序图是平面图,所以在视觉呈现上,消息线9和消息线16还是上下关系。