前页 | 后页 |
建模可执行状态机
可执行状态机模型和计算机模型所需的大部分工作是基于标准 UML 的类状态建模,尽管必须遵守一些约定以确保形成良好的代码库。唯一新奇的构造工件就是用元素来构成可执行状态机实例或场景的配置。工件:用于指定详细信息
- 代码语言( JavaScript 、C#、 Java 、C++ 包括 C)
- 场景中涉及的类和状态机
- 包括运行状态的实例规范;注记这可能包括同一状态机的多个实例,例如在网球比赛模拟中使用了两次“球员”类
可执行状态机基本建模工具和对象
这些是构建可执行状态机时使用的主要建模元素。
元素类型 |
描述 |
---|---|
类和类图表 |
类定义了与被建模的状态机相关的object类型。例如,在一个简单的网球比赛场景中,您可以为球员、比赛、击球和裁判中的每一个定义一个类。每个都有自己的状态机,并且在运行时将由每个相关实体的object实例表示。有关类和类图的更多信息,请参阅UML建模指南。 |
状态机 |
对于您定义的将在场景中具有动态行为的每个类,您通常会定义一个或多个UML状态机。每个状态机将确定适用于拥有类的一个方面的合法的基于状态的行为。例如,可以有一个状态机代表玩家的情绪状态,一个跟踪他当前的健康和能量水平,一个代表他的输赢状态。所有这些状态机都会在状态机场景开始执行时被初始化并启动。 |
可执行状态机工件 |
这种刻板工件是用来指定可执行状态机的参与者、配置的核心元素和启动条件。从场景的角度来看,它用于确定涉及哪些(类)实例,它们可能会触发器发送和发送什么事件,以及它们在什么启动条件下运行。 从配置方面工件,你可以用来建立一个分析器脚本的链接,该分析器脚本将确定输出目录、代码语言、编译脚本等。右键单击工件设备将允许您生成、构建、编译和可视化您的机器的状态机执行。 |
状态机支持的构造
此表详细说明了支持的状态机造以及与每种类型相关的任何限制或一般约束。
构建 |
描述 |
---|---|
状态机 |
默认激活:状态机开始执行时。 入口入口:从入口过渡到包含区域中的顶点。
|
状态 |
|
复合状态Entry |
|
子状态 |
|
过渡支持 |
|
触发器的事件 |
可执行状态机仅支持 Signals 的事件处理。 要使用调用、计时或更改事件类型,您必须定义一个外部机制以基于这些事件生成信号。 |
信号 |
属性可以在 Signals 中定义;属性的值可以用作转移 中的事件参数转移 防护条件。 例如,这是 C++ 中转换效果中的代码集: 如果(信号->signalEnum == ENUM_SIGNAL2) { int xVal = ((Signal2*)signal)->myVal; } Signal2 生成如下代码: 类 Signal2:公共信号{ 上市: 信号2(){}; Signal2(std::vector<String>& lstArguments); int myVal; }; 注记:更多细节可以通过生成一个可执行状态机并参考生成的“EventProxy”文件找到。 |
最初的 |
Initial Pseudostate 表示区域的起点。最多是一个转移 的源转移 ;在一个区域中最多可以有一个 Initial Vertex。 |
区域 |
默认激活和显式激活: 转换终止于包含状态:
|
选择 |
当复合转换遍历达到此伪状态时,动态评估所有传出转换的守卫条件约束。 |
连接点 |
静态条件分支:在执行任何复合转换之前评估保护约束。 |
分叉/汇合 |
非线程,每个活动区域交替移动一步,基于完成事件池机制。 |
入口点/出口点节点 |
非线程用于正交状态或正交状态机;每个活动区域交替移动一个步骤,基于完成事件池机制。 |
历史节点 |
|
延期事件 |
划一个自我转移 , 并改变转移 kind to类型();'在过渡的“影响”字段中。 |
连接点参考 |
A点参考表示子机状态引用的状态机中定义的条目/出口的使用(作为子机状态的一部分)。子机状态的连接点引用可以作为Transitions的源和目标。它们代表进入或退出子机状态所引用的状态机。 |
状态行为 |
状态“entry”、“状态”和“exit”行为被定义为对状态的操作。默认情况下,您将用于每个行为的代码键入到 行为操作的属性窗口的“代码”面板。请注记,您可以通过自定义生成模板将其更改为将代码键入“行为”面板。 生成的“运行”行为将在继续之前运行完成。代码与其他入口行为不并发; 'doActivity' 行为被实现为 'execute in order序列entry' 行为。 |
对其它/类中的行为的引用
如果子机状态引用了当前上下文或类之外的行为元素,则必须在当前上下文类中添加一个<<import>>连接器到容器上下文类。例如:
Class1中的子机状态S1指Class2中的状态机ST2
因此,我们将 <<import>> 连接器从 Class1 添加到 Class2,以便可执行状态机生成代码以正确生成子机状态S1 的代码。 (在类1上,单击快速链接箭头并拖动到类2,然后从连接器类型菜单中选择“导入”。)
再可执行状态机工件
您可以使用单个工件文件创建组件的多个模型或版本。工件一个电阻器,举例来说,可以重复使用箔电阻器和绕线电阻器这很可能是相似对象的情况,尽管它们由相同的分类器表示,但通常表现出不同的运行状态。从建模的角度来看, A名为“resistorType”的属性取值“wire”而不是“foil”可能是所需的全部。然后可以重新使用相同的状态机来测试可能由于运行状态的变化而导致的行为变化。这是过程:
节 |
行动 |
---|---|
创建或打开部件图 |
打开要处理的部件图。这可能是包含您的原始工件。 |
选择要复制的可执行状态机 |
现在在浏览器窗口中找到工件可执行状态机。 |
创建新部件 |
在按住 键的同时,将原始工件拖到您的图表上。系统将提示您两个问题。 第一个答案是物件,第二个答案是全部。重工件属性并将其与原始属性区分开来,然后继续更改其属性。 |