Динамическая цель в автомате

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

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

конд ="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 ответа

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

<transition cond="data.value > 10" target="state2"/>

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>

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

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

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

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

  • my_transition_A targetting_A_target
  • my_transition_B targetting state_B_target
  • my_transition_C targeting state_C_target
  • my_transition_D targeting state_D_target...

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

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

-Janusz

Другие вопросы по тегам