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

В конечном автомате, созданном с помощью 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 -->

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

Спасибо.


person Javi    schedule 28.02.2011    source источник


Ответы (4)


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

<transition cond="data.value > 10" target="state2"/>
person Michael Thomas Wells    schedule 10.07.2012

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>

введите здесь описание изображения

person Charles Goodwin    schedule 21.09.2011

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

-Януш

person Janusz Dobrowolski    schedule 21.09.2011

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

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

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

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

  • my_transition_A целевое состояние_A_target
  • my_transition_B таргетинг state_B_target
  • my_transition_C таргетинг state_C_target
  • my_transition_D таргетинг на state_D_target...

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

person Stephane Rolland    schedule 12.10.2012