17.7.4 表示法
交互使用
交互使用表示为一个联合片段符号,其中的操作符是ref。名称(在交互使用区域内)的完整语法是:
<name> ::= [<attribute-name> ‘=’ ] [<collaboration-use> ‘.’] <interaction-name>
[‘(’ <io-argument> [‘,’ <io-argument>]* ‘)’] [‘:’ <return-value>]
<io-argument> ::= <in-argument> | ‘out’ <out-argument>
<attribute-name>指的是交互中一个生命线的一个属性。
<collaboration-use>是一个绑定了一个协同中生命线的协同使用。此时交互的名称在协同内。参见图17.24协同使用的示例。
io-arguments通常是IN参数。如果有OUT或INOUT参数并且需要描述输出值,那么它们可以表示在‘out’后。
参数语法在17.4.4 消息子节解释。
如果交互使用返回了一个值,这可以在语法末尾描述在一个冒号后。
部分分解
部分分解可以通过生命线头部的一个引用条款来指示,这可以参见17.3.4生命线的表示法(还可以参见图17.21)。
如果部分分解被内嵌在在被分解的生命线下并且分解条款是“strict”,那么这指示了内嵌分解中的所有子生命线上的构造都要按照严格的顺序来排列(参见17.6.4 Strict交互操作符)。
额外全局(Extra global)联合片段的矩形框在被分解交互的边界之外。
风格指南
分解所涉及的交互的名称如果包括了被分解部分的类型和产生这个分解的交互名称,那么将是有益的。如图17.21所示,其中分解被称为AC_UserAccess,其中‘AC’指的是ACSystem,它是生命线的类型,UserAccess是包含被分解的生命线的交互的名称。
17.7.5 示例
图17.19 InteractionUse
在图17.19中,我们展示了一个交互使用,它引用了交互 EstablishAccess,并使用了一个输入参数“Illegal PIN”。在可选的联合片段中有另一个交互使用,它引用了OpenDoor,没有参数。
图17.20 InteractionUse with value return
图17.20中,我们有一个更高级的交互,它对一个返回了一个Verdict值的行为进行了建模。从该交互返回的值用一个单独的生命线a_op_b来表示。在交互中,引用了a_util_b的交互使用用返回值9赋值给了:xx的属性xc,并且使用了inout参数w(返回输出值12)。
图17.21 PartDecomposition - the decomposed part
在图17.21中,我们看到在UserAccess中ACSystem是如果被分解为AC_UserAccess的,后者是由类ACSystem所拥有的一个交互。
在图17.22中,我们看到AC_UserAccess有一个全局的构造与覆盖ACSystem的UserAccess构造相匹配。
特别的,我们注意到“额外交互组”超出了交互的框。这个构造对应于UserAccess的一个联合片段。然而,我们想指示出的是:该额外全局交互组中的操作数是与相同原始联合片段的其它分解的类似额外全局交互组一个一个的联合而成。
作为一种便捷的表示手段,分解还可以被“内嵌”展示。在图17.22中,我们看到:AccessPoint的内部可连接元素(p1和p2)被生命线在这个层次表示了出来。
图17.23 Sequence Diagrams where two Lifelines refer to the same set of Parts (and Internal Structure)
在图17.23展示的序列图中,r向s[k](类型为B)发送了m1,s[k]向s[u]发送了m2。同时独立于s[k]和s[u],r通过一个gate向交互使用N发送了m3。跟随m3消息进入N我们看到随后s[u]向s[k]发送了另一个m3消息。然后s[k]向s[u]发送了m3之后是m2。s[u]以任意次序(共同区域)接收到后面的这两条消息。在接收到这些消息后,我们在变量x(当然由s[u]所拥有)上声明了一个状态不变量。
图17.24 Describing Collaborations and their binding
图17.24中的例子展示了如果利用协同使用来使得协同的交互在另一个分类符中可用。
协同W有两个部分x和y,它们的类型分别是(类)superA和superB。类A和B分别是superA和superB的特化。序列图Q展示了一个我们将在另一个环境下会复用的简单交互。类E代表了这个环境。有两个匿名的部分:A和:B并且协同W的协调使用w1把x和y分别绑定到:A和:B。因为:A和:B是类型x和y的特化类型的部分,所以该绑定是合法的。