UML之序列图的执行规范
执行规范(Execution Specification)是一个覆盖在生命线上的垂直的、不透明的矩形,这个矩形表示其覆盖的生命线正忙于执行某些行为。
在序列图中执行规范不是必需的,但复杂的序列图中可能需要查看执行栈或者对某些行为的结束点感兴趣,此时使用执行规范是有帮助的。如果在序列图中的任意一条生命线上使用了执行规范,那么就应当在该图中的所有生命线上都使用执行规范。使用了执行规范的序列图样例如图 1所示,而未使用执行规范的序列图样例如图 2所示。
执行规范还可以有名称,但一般只在执行的行为名称与对应消息名称不一致时才需要使用执行规范名称。在实际建模工作中,大多数建模者从不为执行规范指定名称。
在图 1中,右侧生命线:Lifeline2在开始处存在执行规范,故它处于忙碌状态;然后它向左侧生命线:Lifeline1发送同步消息,左侧生命线:Lifeline1在接收到消息后开始忙碌执行(故在生命线上描画一个执行规范)。与此同时,右侧生命线:Lifeline2暂停执行,直到左侧生命线:Lifeline1执行完毕并返回结果给右侧生命线:Lifeline2之后,右侧生命线:Lifeline2恢复其之前的执行。
在图 1中,右侧生命线:Lifeline2暂停执行时,执行规范不再覆盖生命线。但由于当前消息是同步消息,右侧生命线:Lifeline2或其包含的部分或线程会等待同步消息的返回,所以依然可以将其视作“执行/忙碌”状态,因而通常情况下,建模者或者工具会使用一个持续到消息返回的执行规范(如图 3所示),而不是一个中间被切断的执行规范。
基于图 1的风格,一个序列图的两条生命线之间的交互时,生命线上的执行规范根据交互过程交替出现,而基于图 3的风格,则两条生命线上可并行出现执行规范。两条生命线由于同步消息而同时处于忙碌状态时,如果存在回调,则执行规范将产生重叠。在图 4中,左侧生命线:Lifeline3向右侧生命线:Lifeline4发送同步消息operate(),并且在消息中指定了一个回调操作。右侧生命线:Lifeline4在收到同步消息operate()后开启一个执行规范,但在该执行规范中,需要对左侧生命线:Lifeline3执行一个回调callback(),因而需要在序列图中描画一个由右侧生命线:Lifeline4发送至左侧生命线:Lifeline3消息callback(),这个消息在左侧生命线:Lifeline3上已经存在的执行规范上叠加一个新的执行规范。叠加的执行规范通常以相较于被叠加执行规范较小的矩形表示,并与被叠加执行规范稍微错开,正如在图 4中所描画的那样。
一些建模者将执行规范理解为当前生命线的激活状态,一些UML工具也按照激活提供执行规范的建模支持,因而很容易引起概念混淆。事实上,激活状态只是执行规范的表现形式之一,并不等同于执行规范本身。执行规范作为UML模型中的一个元素,用于表示生命线在某段时间内正在执行的具体操作或行为,而激活只是帮助我们可视化这一执行过程的手段。如果将两者混为一谈,可能会导致对模型行为的误解。
在实际建模时,为更准确地表达行为语义,我们可以注意以下几点。
首先,要正确使用执行规范元素来体现对象的执行过程,而不应仅依赖工具自动绘制的激活条。确保每个执行规范的开始和结束都与相应消息的发送和返回相对应,这样可以清晰地标明对象何时开始执行操作以及何时结束。
其次,充分利用UML工具提供的功能来增强模型的语义表达,例如为执行规范注明所执行的操作名称或添加注释,使图中的激活更直观地反映实际行为。
最后,虽然不同UML工具对执行规范的呈现方式可能有所不同,但无论工具如何表现激活,都应牢记其背后代表的是执行规范这一概念。
通过这些实践,我们就能有效避免上述误解,在使用UML工具绘制序列图时更精准地传达系统的动态行为语义。
UML – 光头颜说IThttps://gtyan.com/archives/category/uml
本UML专栏https://blog.csdn.net/mboy2008/category_12860871.html