Динамична цел в държавна машина

В държавна машина, направена със 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 запис в Wikipedia.

<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

Опитвате се да изградите много ориентирана към приложението, сложна рамка на State Machine. Това е малко като изграждане на собствена рамка за електронни таблици за всяко приложение за електронни таблици, вместо да използвате EXCEL. По-добър подход може да бъде да използвате съществуваща рамка и да дефинирате вашите събития и действия в SCXML. Можете да видите примери за SM API рамка в www.StateSoft.org -> State Machine Gallery.

-Януш

person Janusz Dobrowolski    schedule 21.09.2011

Въпреки че отговорът на @Charles Goodwin е доста точен... мога да добавя моите думи. За да опростя:

  • Какво имате във вашия дизайн: имате един преход my_transition
  • Какво бихте искали: този преход да доведе до няколко state_targets

Направо криеш логиката на проблема.

Какво трябва да имате: няколко прехода

  • my_transition_A насочване state_A_target
  • my_transition_B насочване към състояние_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