Динамическая цель в автомате - PullRequest
2 голосов
/ 28 февраля 2011

В автомате, созданном с использованием SCXML, есть ли способ установить динамическое целевое значение для перехода?

Я имею в виду, предположим, у меня есть объект с именем "obj", который был установлен как модель данных для scxml. Таким образом, для него можно задать условия (если в объекте было свойство с именем checkCondition), например:

cond = "obj.checkCondition"

<state id="state1">
    <transition cond="obj.checkCondition" target="state2"/>
</state>
<state id="state2">
    ...
</state>

У меня есть другое свойство в obj, которое называется nextTarget. Я хочу установить цель в этом переходе, считывая ее значение из объекта (как это делается в условиях).

<state id="state1">
    <transition cond="obj.checkCondition" target="eval(obj.nextTarget)"/>
</state>
<!-- Where in obj.nextTarget there it has been set as value "state1", "state2" or any state name -->

Есть ли синтаксис для этого?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 10 июля 2012

Вы можете указать атрибут cond в элементе перехода

<transition cond="data.value > 10" target="state2"/>
1 голос
/ 21 сентября 2011

SCXML - довольно простое описание состояний и возможных переходов между этими состояниями.Условных переходов не бывает.

Однако вы можете иметь более одного перехода из каждого состояния.Количество переходов из состояния не ограничено.

Итак, ответ на ваш вопрос состоит в том, что у вас есть столько переходов, сколько требуется для описания условных указаний, которые вы хотите пройти, и вы оцениваете условияв другом месте (то есть в Java).

Примером источника является запись SCXML в Википедии .

<state id="ready">
    <transition event="watch.start" target="running"/>
</state>
<state id="running">
    <transition event="watch.split" target="paused"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="paused">
    <transition event="watch.unsplit" target="running"/>
    <transition event="watch.stop" target="stopped"/>
</state>
<state id="stopped">
    <transition event="watch.reset" target="ready"/>
</state>

enter image description here

0 голосов
/ 12 октября 2012

Хотя ответ @Charles Goodwin довольно острый ... Я могу добавить свои слова.Чтобы упростить:

  • Что у вас есть в дизайне: у вас есть один переход my_transition
  • Что вам нравится: этот переход может привести к нескольким целевым состояниям

Вы просто скрываете логику проблемы.

Что у вас должно быть: несколько переходов

  • my_transition_A targetting state_A_target
  • my_transition_B targetting state_B_target
  • my_transition_C targetting state_C_target
  • my_transition_D targetting state_D_target ...

и процесс, который будет динамически устанавливать цель вдизайн, будет динамически обрабатывать событие для my_transition_A или my_transition_C ... точно так же, как если бы он выбрал target_state в вашем дизайне).

0 голосов
/ 21 сентября 2011

Вы пытаетесь создать сложную платформу State Machine, ориентированную на приложения.Это немного похоже на создание собственной структуры электронных таблиц для каждого приложения электронных таблиц вместо использования EXCEL.Лучшим подходом может быть использование существующей инфраструктуры и определение ваших событий и действий в SCXML.Вы можете увидеть примеры SM API Framework в www.StateSoft.org -> State Machine Gallery.

-Janusz

...