消息线连线规则
顺序图连线逻辑:
元素概念:
- 消息线(Message):同步消息线(Message),异步消息线(Async Message),返回消息线(Reply Message),自连消息线(Self Message),创建消息线(Create Message),终止消息线(Delete Message)。
- 激活块(Activation,术语同EA):代表了一段生命周期,激活块内可包含子激活块。激活块的断开代表了其生命周期的终止。
- 生命线(Lifeline):通用生命线(Lifeline),边界生命线(Boundary Lifeline),实体生命线(Entity Lifeline),控制生命线(Control Lifeline),参与者生命线(Actor Lifeline)。生命线的类型不会影响消息线的连线逻辑。
连线规则:
- 同步消息线(Message)与异步消息线(Async Message)会在其指向的目标上创建一个激活块(如果指向生命线,则在生命线上创建;如果指向某个激活块,则在其内创建一个子激活块)。
- 返回消息线(Reply Message)指向到激活块上,不会额外创建子激活块。如果返回消息指向的是生命线则会创建一个激活块。
连线算法:
- 目标端寻源:一条消息线M1尝试连接到生命线L2上。
从当前消息线M1出发,如果该消息线M1的源端S1在生命线L2上,则S1为M1的目标端(同时也是源端),在S1内创建子激活块并将M1指向它【图1】;否则继续如下流程;
查找源端S1的引入消息线(From Message),如果找不到,则终止寻源过程,目标端寻源失败,在L2上新创建一个激活块并将M1指向它【图2】;如果能找到,则命名为FM1,继续如下流程【图3】;
检测消息线FM1的源端FS1,查看其是否是生命线L2上的激活块,如果是则FS1为M1的目标端,在FS1内创建子激活块并将M1指向它【图4】;如果不是,则重复步骤b【图5】;
当查找到顺序图第一根消息线依旧未找到目标端,则此次寻源过程终止,目标端寻源失败,在L2上新创建一个激活块并将M1指向它【图5】;如果找到则在其内创建子激活块并将M1指向它【图6】。
图6中M1的逆向寻源不会经过2、3两根消息线,因为M1的源端S1的引入消息线是第一条线,直接能找到目标。
逆向寻源过程中,如果寻源过程中遇到异步消息线(Async Message)或者返回消息线(Reply Message),则终止寻源过程;此时如果M1不是返回消息线(Reply Message),则在L2上新创建一个激活块并将M1指向它。
寻源过程中断后或者未找到对应激活块,并且M1是返回消息线:1. 那么如果M1有源端引入线(源端引入连线类型不是返回消息线),则从M1的目标端所在生命线找到其内位置最低的激活点作为寻源目标(图7.1)。2. 如果M1没有源端连线,或者源端连线是返回消息线(Reply Message),则在L2上新创建一个激活块并将M1指向它(图7.2,图7.3)。
- 源端寻源:一条消息线M1从生命线L1上出发。算法规则与目标端寻源类似,差异在于源端不以当前M1为出发点,而是以M1的上一条消息线LM1为出发点,并且不受异步与返回消息线的限制。
找到当前消息线M1的上一条消息LM1(注意,是位置在其上的第一条消息线),从LM1出发,如果LM1的目标端LT1在生命线L1上,则LT1为M1的源端【图8】;如果不在,则继续如下流程;
用LM1逆向寻源(同目标端逆向算法),如果能找到在生命线L1上的激活块,则该激活块为M1的源端【图9】;如果找不到生命线L1上的激活块,在生命线L1上新创建一个激活块并将M1从它引出【图10】。
逆向寻源过程中,如果某个消息线是返回消息线(Reply Message),则其源端不参与寻源判断,直接略过它继续向前寻源。