
# 绘制消息线和激活块
#### 约束与限制
根据建模规范限制，建模的连线不能独立存在于图中，两端必须是连接在元素上的，因此不允许消息线直接拖拽至画布上。且绘制顺序图时，必须保证图的类型为顺序图，否则可能导致无法绘制对应消息线。参考常见问题[如何查看和修改模型图类型](https://support.huaweicloud.com/codeartsmodeling_faq/modeling_faq_0001_8.html)。
自消息线分为同步自消息线和异步自消息线，工具当前仅支持同步自消息线。
#### 消息线介绍
顺序图用消息线描绘元素之间的工作流或者活动。软件模型中，消息线可以用来代表源端或目标端元素的操作或者属性。您可以根据需求[绘制消息线]，绘制消息线后，也可以[提升或降低消息线层级](https://support.huaweicloud.com/usermanual-codeartsmodeling/modeling_ug_0003_4_6.html)。
介绍参考[元素介绍](https://support.huaweicloud.com/usermanual-codeartsmodeling/modeling_ug_0003_4_0.html)中消息线和激活块分类。
#### 建模规范
- 同步消息线（Message）/异步消息线（Async Message） 这两类消息线都是指令/任务型消息，一般用来表达发送方向接收方传递指令或调用任务，这些任务通常是有执行时间的。目标生命线在执行任务的这段时间处于激活状态，会在生命线上生成对应的激活块。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191083917.png "点击放大")
  对应的代码模型。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155717318.png "点击放大")
  同步消息线与异步消息线的区别是相对于消息发送方而言的，同步消息线的发送方会等待指令/任务执行完成，在指令/任务执行过程中它也是处于激活状态，所以发送方的生命线上会有对应激活块。而异步消息线的发送方不会等待指令/任务完成，在消息线发送之后它就处于非激活状态了。
  "输入账号密码登录"是同步消息，"顾客"生命线在发送完之后处于等待状态，直到"通知登录结果"消息传来，它都是处于激活状态。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191198261.png "点击放大")
  "输入账号密码登录"是异步消息，"顾客"生命线在发送完之后不再等待，在"通知登录结果"传来的这段时间内，它都是处于非激活状态。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155877074.png "点击放大")
  
- 返回消息线（Reply Message） 返回消息线是针对同步/异步消息线的结果响应，它本身不是指令/任务型的，即它不会触发目标生命线的任务调用或者指令执行。![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191083921.png "点击放大")
  对应到代码模型，返回消息线一般表示的是方法/函数中的return语句，或者是接口请求中的数据返回。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155717322.png "点击放大")
  从上面模型图和代码中可以看到，同步消息线是对verify方法的调用，属于指令/任务型的消息，而返回消息线是verify方法中的结果返回，它不直接调用或者触发LoginPage中方法的执行。
  
- 自消息线（Self Message） 自消息线是目标生命线发向自己的指令/任务型消息，它会在原有激活块上生成二级或更高层级激活块。对应到软件模型，自消息线一般表示对象调用自身的方法/函数。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191198265.png "点击放大")
  对应的代码模型。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155877078.png "点击放大")
  
- 创建对象消息线（Create Message）/ 销毁对象消息线（Delete Message） 顾名思义，创建对象消息线会动态创建目标对象，该目标对象可能是一个临时对象，也可能是一个动态创建的永久对象。对应软件模型，当一个对象不是在系统运行初期就存在，而是在运行过程中由其余对象创建出来的，则该对象的创建过程适合用创建对象消息线来表示。
  销毁对象消息线会动态销毁目标对象，目标对象可能是由创建对象消息线临时生成的，也可能是系统运行初期就存在的对象。对应软件模型，当要进行资源回收时，通常需要销毁目标对象，此时可以用销毁对象消息线来表示资源回收过程。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191083929.png "点击放大")
  对应的代码模型。
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155717326.png "点击放大")
  
- 激活块（Activation） 激活块表示的是目标对象（生命线）处于激活状态的时间段，它是由消息线触发生成的。顺序图中一共有六类消息线，其中有五类消息线（Message、Async Message、Self Message、Create Message、Delete Message）是指令/任务型消息，可以在目标生命线上生成激活块（创建对象消息线对应的指令是创建目标对象），而返回消息线（Reply Message）一般是对其余消息线的结果响应。
  激活块上可以挂载二级甚至更多层级的激活块，表示的是对应层级消息的子任务激活状态。
  
 
 #### 建模步骤
您可以通过如下方式绘制生命线：
1. 绘制消息线。 
   - 选择生命线，从元素的辅助连线三角标单击拖拽至另一个生命线上，选择消息线类型。 ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155416192.png)
     
   
   
   
   - 在元素面板上单击或者双击选择要使用的消息线，然后从生命线虚线任意位置左键拖拽生成消息线到目标生命线上。 单击：元素面板消息线外框处于选中状态，可以使用该消息线一次，在图中绘制消息线后会自动取消单击选择状态。
     双击：元素面板消息线外框及背景处于选中状态，可以多次使用该消息线，使用完后需单击取消该连线的选中状态。
     ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155418316.png "点击放大")
     
   
   
   
   
2. 编辑消息线。选中连线按F2键/回车键/右键单击消息线选择"编辑"，可以编辑消息线名称。 
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191198269.png)
   
   
3. 移动消息线。消息线有两种移动方式：平移和跨线移动。 
   - 平移是指对选定消息线在垂直方向上移动，该消息线相对于其余消息线的位置不变，但该消息线及其下方其余消息线均会同步移动，平移的消息线不能越过该消息线上方的其余消息线，平移操作可能会触发生命线高度变化。平移的目的一般是调整消息线之间的间距，或者为插入新消息线留空间。 选中消息线，鼠标左键按住消息线可以在垂直方向上平移。
     ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155877082.gif "点击放大")
     
   
   - 跨线移动是指调整选定消息线在生命线上的位置，该消息线相对于其余消息线的位置会变化，但不会影响其余消息线的位置（其余消息线不移动）。跨移的消息线可以移动到生命线上任意位置，由于消息线的顺序发生变化，一般会导致激活块的状态发生改变。跨线移动的目的一般是为了纠错，某个消息线原先的位置绘制错误，通过跨线移动对其进行调整。 选中消息线，按住Ctrl按键，再利用鼠标左键按住消息线在垂直方向上移动。
     ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191083933.gif "点击放大")
     
   
   
   
   
4. 变更消息线类型/连接端。对于已连接的消息线，工具提供了变更消息线类型以及变更连接端的能力。 
   - 右键单击消息线，选择"类型\&构造型"，修改消息线类型。 ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191243145.png)
     
   
   
   
   - 左键选中消息线，拖动消息线起点或者终点向其余生命线拖去，可以将连接点变更到新生命线上。 ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191243821.png)
     
   
   
   
   
5. 绑定方法/接口。如果生命线是定义方法或者实现接口的元素，则对于指向该生命线的消息线，可以绑定目标元素上定义的方法或者接口。 
   在类图中的Student元素定义方法Study
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155877090.png "点击放大")
   选中顺序图消息线，右键 \> 绑定/解绑接口。
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002156013108.png)
   选择Student元素定义的方法Study。
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002156173180.png "点击放大")
   单击绑定，方法同步更新到消息线上。
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191454477.png)
   同样可以绑定接口元素。
   ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191506269.png "点击放大")
   
   
#### 模型示例
- 以老师安排学生大扫除为例解释下顺序图中激活块的概念（映射到计算机系统/软件模型，激活块代表的是对应部件或者软件对象处于激活状态的时间段）。 ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155717338.png "点击放大")
  如上所示，老师安排劳动委员组织学生对教室进行大扫除活动，老师先给劳动委员下达了大扫除的任务指示，并要求在大扫除结束后向他汇报成果。假设老师在大扫除期间没有其余事情可做，下达任务后一直等待任务完成，那么在老师这条生命线上会有一个贯穿任务始终的激活块，表示老师在这个时间段内处于活跃状态（全程关注大扫除这个任务）；而劳动委员负责大扫除任务的子任务安排（任务调度），他的活跃状态与老师几乎一致（安排任务、验收结果以及汇报成果）。
  学生A和学生B在这个过程中负责不同的子任务，由于子任务之间存在先后顺序（必须先扫地再拖地），所以在图中呈现的是上下顺序。对于学生A来讲，他在接到任务、扫地及任务结束验收期间是处于活跃状态的，而此时学生B还未被安排任务，此时的他是未激活的（所代表的生命线在对应时间段内没有激活块）。同理，对于学生B来讲，从他接到任务、拖地到任务结束验收期间他处于激活状态，而此时学生A由于完成了子任务且没有其余任务，他处于未激活状态。
  附载在激活块上的小方块，实际也是激活块，它表示的是子任务。比如学生B在接到拖地任务后，就执行了洗拖把和拖地这两个子任务，两个子激活块代表的是学生B在这两个子任务上的活跃时间段。
  综上，激活块代表的是目标对象由于执行任务（进入激活状态）到结束任务（恢复未激活状态）的时间段，它的高度并不完全等同于任务时间长短，只是用来表示任务执行顺序以及目标对象激活状态。
  

- 以用户在线购物为例，结合代码示例解释消息线的使用场景，以及其与对象/方法之间的对应关系。 ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191198277.png "点击放大")
  上述示例对应下面的代码，可以结合代码中函数调用关系理解示例中消息线的连接方式：
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002155877094.png "点击放大")
  ![](https://support.huaweicloud.com/usermanual-codeartsmodeling/zh-cn_image_0000002191083949.png "点击放大")
  
1. 消息线3对应GoodsManager中的queryByName调用，由于调用DataService中的queryByName是异步操作，所以消息线3是异步消息线。
2. 消息线5基于商品数据动态创建了商品对象，商品对象不是在系统运行初期就存在的，所以消息线5用Create Message来表示对象的动态创建过程。
3. 消息线7是数据服务对商品管理查询信息的返回，对应DataService中queryByName函数的return语句，它不会主动触发商品管理中函数的执行，所以消息线7是返回消息线。
4. 消息线14将商品对象的元数据加入到购物车中，商品对象不再被使用，会在add函数结束后被自动回收。如果在回收之前需要对其进行显式销毁，可以用消息线15的销毁对象消息线来表示。
5. 消息线9是将商品对象加入到购物车中，由于涉及异步查询库存信息，所以消息线9是异步消息线。用户执行该操作后可以继续执行消息线16的商品浏览，消息线16并不需要等待消息线9及其后续所有子任务执行完成，它和消息线9是非阻塞的并发关系。但由于顺序图是平面图，所以在视觉呈现上，消息线9和消息线16还是上下关系。
 
