通过组合状态动作来消除冗余代码
您可以将在一个状态中执行相同任务的 entry
、during
和 exit
动作组合在一起。
通过组合执行相同任务的状态动作,可以消除冗余代码。例如:
单独动作 | 等效组合动作 |
---|---|
entry: y = 0; y=y+1; during: y=y+1; |
entry: y = 0; entry, during: y=y+1; |
en: fcn1(); fcn2(); du: fcn1(); ex: fcn1(); |
en, du, ex: fcn1(); en: fcn2(); |
以这种方式组合状态动作会产生相同的图执行行为(语义),并生成与等效的单独动作相同的代码。
如何组合状态动作
将一个状态中执行相同任务的一组 entry
、during
和/或 exit
动作组合为以逗号分隔的动作列表。语法如下:
entry, during, exit: task1; task2;...taskN;
您也可以使用等效的缩写:
en, du, ex: task1; task2;...taskN;
有效组合
您可以使用这三个动作的任意组合。例如,以下组合是有效组合:
en
,du
:en
,ex
:du
,ex
:en
,du
,ex
:
您可以在逗号分隔列表中以任意顺序组合动作。例如,en, du:
给出的结果与 du, en:
相同。
无效组合
您不能将同一类型的两个或多个动作组合在一起。例如,以下组合无效:
en
,en
:ex
,en
,ex
:du
,du
,ex
:
如果您组合同一类型的多个动作,会收到一条警告,提示图对该动作只执行一次。
组合动作的执行顺序
状态执行组合动作的顺序与执行单独动作的顺序相同:
先执行
Entry
动作,按照它们在状态中出现的顺序从上到下执行再执行
During
动作,同样从上到下执行最后执行
Exit
动作,同样从上到下执行
组合动作的顺序不影响状态执行行为。例如:
组合动作 | 执行顺序 |
---|---|
|
|
|
|
|
|
|
|
组合状态动作的规则
不要组合同一类型的多个动作。
不要创建与动作关键字
entry
、en
、during
、du
、exit
、ex
同名的数据、事件或消息。