17.4.4 表示法
消息
表示表示为从发送消息端到接收消息端的一条线。线中的各个线段要么水平要么向下地从发生事件指向接收事件。发生和接收事件可能都在相同的生命线上。线的格式或箭头反映消息的属性:
- 异步消息(消息方式为asynchCall或asynchSignal)有一个开放的箭头。
- 同步消息(消息方式为synchCall)有一个填充的箭头。
- 应答消息(消息方式为reply)有带有开放或填充的箭头的虚线。
- 对象创建消息(消息方式为createMessage)有带有开放箭头的虚线。
- 对象删除消息(消息方式为deleteMessage)必须在一个销毁出现规约上结束。
- 丢失的消息在箭头的末端用一个小黑圈来指示。
- 被发现的消息在消息的起始端用一个小黑圈来指示。
- 在通信图上,使用靠近消息名称与消息同向的一个小箭头和沿生命线之间的序列号来修饰(参见表17.4和图17.26)。
(交互)图中消息标签的语法如下:
<message-label> ::= <request-message-label> | <reply-message-label> | ‘*’
等同‘*’的消息标签是更加复杂的联合片段的速记法,以代表任何类型的一条消息。这可以匹配状态机中的星号触发器。
request-message-label可用于不是应答的所有类型的消息。它具有如下的格式:
<request-message-label> ::= <message-name> [‘(’[<input-argument-list>]‘)’]
<input-argument-list> ::= <input-argument> [‘,’<input-argument>*]
<input-argument> ::= [<in-parameter-name> ‘=’] <value-specification> | ‘-’
request-message-label中出现的message-name是消息的名称属性。如果消息有一个签名,这会是签名所引用的操作或信号的名称。否则这个名称没有限制。
如果request-message-label包括一个input-argument-list,那么要么所有的input-arguments都有一个给定的in-parameter-name,要么都没有。如果没有给定in-parameter-names,那么input-arguments指示消息的参数,按照顺序,用一个连字符(‘-’)指示一个通配符参数。如果该消息有个签名,那么它们必须按序与操作的in或inout自有参数或信号的属性匹配。必须为每一个这样的parameter或属性提供一个argument。
如果消息有签名,request-message-label可能只有具有in-parameter-names的input-arguments。此时,input-arguments与一个操作的in和inout自有参数或一个信号的属性通过名称来匹配。任意没有命名的参数或属性被认为具有隐含的通配符arguments。如果给定了in-parameter-names,就不使用显式的通配符图示(‘-’)。
如果request-message-label不包括input-argument-list而消息有签名,那么这指示对于操作的in和inout自有参数或信号的属性(如果有的话),消息都有与之对应的通配符arguments。注意,括号不是input-argument-list的一部分,因此,没有input-argument-list的request-message-label仍然可选的在message-name后面包括一个空括号(“()”)。
应答消息reply-message-label具有如下格式:
<reply-message-label> ::= [<assignment-target> ‘=’] <message-name> [‘(’ [<output-argument-list>] ‘)’] [‘:’ <value-specification>]
<output-argument-list> ::= <output-argument> [‘,’<output-argument>]*
<output-argument> ::= <out-parameter-name> ‘:’ <value-specification>
| <assignment-target> ‘=’ <out-parameter-name> [‘:’ <value-specification>]
在reply-message-label中出现的是消息的名称属性。如果消息有签名,这会是签名所引用的操作的名称。否则这个名称没有限制。
reply-message-label在message-name左边可以有一个可选的assignment-target,reply-message-label末尾冒号后的可选value-specification指示相应的返回值。如果消息的签名是带有返回参数的操作,那么这个assignment-target和/或value-specification对应那个参数的argument(如果没有给出assignment-target,它就被认为是未知的)。如果消息的签名没有返回参数,那么reply-message-label整体上没有assignment-target或value-specification。
如果应答消息没有签名,那么它可以规定的唯一参数就是上面规定的返回参数。然而,如果消息的签名是带有有out或inout自有参数的操作,那么这些参数可以由output-arguments提供。output-argument总是显式地指明匹配的参数。任意没有命名的参数被认为具有隐含通配符arguments。(因此,对于output-arguments,不需要显式的通配符图示)。
如果reply-message-label不包括output-argument-list而消息有签名,那么这指示着消息具有与该签名操作的所有out和inout自有参数(如果有的话)相对应的通配符arguments。注意括号不是output-argument-list的一部分,因此没有output-argument-list的reply-message-label仍然可以在message-name后面可选的包括一个空集括号(“()”)。
具有显式的assignment-target的output-argument还可以可选的包括一个value-specification。如果给出了value-specification,那么这指示了用于该argument的返回值。否则,该argument没有建模返回值。如果output-argument没有显式的给出assignment-target,它被认为具有一个未知的assignment-target。此时,需要包括一个value-specification,它用做该argument的返回值。
如果应答消息的身份(identity)明显(例如,当它的sendEvent是一个执行出现(其中只有一个操作调用消息的唯一一个receipt)范围内唯一的应答时),它的标签可以被省略已简化模型图。如果应答消息有签名,那么为签名参数的所有返回、out和inout自有参数提供通配符参数。参见图17.2的例子。
销毁出现规约
DestructionOccurrenceSpecification(销毁出现规约)在生命线的底部用一个形如X的叉号来描绘。参见图17.8。
图17.8 DestructionOccurrenceSpecification symbol
Gate
Gates只是框上的点,是消息的末端。它们可能有一个显式的名称(参见图17.4)。
17.4.5 示例
图17.3中,我们只看到了异步消息。这些消息可能互相反超。
图17.14中,我们看到了带有应答的同步方法调用。我们还看到了代表创建一个对象的消息。
图17.26中,我们看到如何在通信图中指示消息。
语法示例:
- mymessage(14, - , 3.14, “hello”) //这是一个请求消息;第二个参数是个通配符
- mymsg(myint=16) //这是ygie请求消息;给出了输入参数‘myint’的argument值16
- v=mymsg(w=myout:16):96 //这是一个应答消息,把返回值69赋给‘v’,把值为16的out参数‘myout’赋给‘w’。
参见图17.14中许多消息识别的文本语法的不同应用。