Main Content

通过组合状态动作来消除冗余代码

您可以将在一个状态中执行相同任务的 entryduringexit 动作组合在一起。

通过组合执行相同任务的状态动作,可以消除冗余代码。例如:

单独动作等效组合动作

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();

以这种方式组合状态动作会产生相同的图执行行为(语义),并生成与等效的单独动作相同的代码。

如何组合状态动作

将一个状态中执行相同任务的一组 entryduring 和/或 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:

如果您组合同一类型的多个动作,会收到一条警告,提示图对该动作只执行一次。

组合动作的执行顺序

状态执行组合动作的顺序与执行单独动作的顺序相同:

  1. 先执行 Entry 动作,按照它们在状态中出现的顺序从上到下执行

  2. 再执行 During 动作,同样从上到下执行

  3. 最后执行 Exit 动作,同样从上到下执行

组合动作的顺序不影响状态执行行为。例如:

组合动作执行顺序

Entry action y = 0 followed by combined entry and during action y = y+1.

  1. en: y = 0;

  2. en: y = y+1;

  3. du: y = y+1;

Combined entry and during action y = y+1 followed by entry action y = 0.

  1. en: y = y+1;

  2. en: y = 0;

  3. du: y = y+1;

Combined during and entry action y = y+1 followed by entry action y = 0.

  1. en: y = y+1;

  2. en: y = 0;

  3. du: y = y+1;

Combined during and entry action y = y+1 followed by combined entry and exit action y = 10.

  1. en: y = y+1;

  2. en: y = 10;

  3. du: y = y+1;

  4. ex: y = 10;

组合状态动作的规则

  • 不要组合同一类型的多个动作。

  • 不要创建与动作关键字 entryenduringduexitex 同名的数据、事件或消息。

相关主题