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