如何在UML状态机转换中处理多个条件

3

我该如何处理UML状态机转换中(作为守卫条件)多个具有不同布尔表达式的条件?

示例: enter image description here

在此示例中,我想在从“登录”到“已登录”的转换中添加多个条件(例如“尝试次数<3”),如注释所述。

如何符合UML标准处理此问题?


看起来你想要一个EA的解决方案,是吗?那就说出来吧 :) - granier
你可以将状态分解为多个状态,每个状态都有自己的转换条件(例如,“networkOK --> LoginPrompt”),或者将其定义为一个复合条件。 - Paul Ogilvie
@granier 这就是他在这个问题上打了EA标签的原因。 - qwerty_so
2个回答

3

简单来说(为了聚焦于所需步骤)

enter image description here

Guard中放置一个布尔条件,就像上面的示例一样。这可以是任何文本。您可以编写C样式或纯文本。我不确定这里是否适用OCL,但那只是学术目的(我的观点)。

N.B. 您的图表显示Tries = 3,这也应该是一个Guard(即[Tries = 3]),而不是一个Name


据我所知,OCL不使用&&而是使用and...(为什么?也许这些人不懂C语言...) - granier
@granier 也许他们来自使用文本而非符号的 Python、Pascal、COBOL 或(某种程度上)FORTRAN 前端。 - qwerty_so
Cobol:为什么不呢 :) - granier

2
这里有几个选择:
  1. 您的守卫条件可以在“[]”中组合多个检查,就像您在注释中所做的那样。
  2. 您可以在相同的两个状态之间进行多个转换,每个转换都有自己的条件。
  3. 您可以在状态中设置子状态。因此,在您的示例中,这三个状态可以位于“正常操作”的超级状态中 - 您可以通过其他文档或注释进一步定义该状态。
所有这些都是有效的UML语法。但请注意,仅因为某个东西是有效的并不意味着它将在您的编辑器中得到支持。例如,许多年过去了,大多数序列图功能才能在编辑器中使用...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接