Конечный автомат: в каком состоянии выполняется действие над переходом? - PullRequest
1 голос
/ 12 марта 2019

Я просто читаю теорию конечных автоматов. Пожалуйста, учтите это:

             event[guard]/action
State A -----------------------------> State B

Вот мой вопрос: если я определю переход между состояниями A и B с событием, защитой и действием, как на приведенной выше «картинке»; и, кроме того, событие получено, и защитное выражение оценивается как true, тогда: будет ли выполнено действие, пока мой объект находится в состоянии A, или B?

Другими словами, нужно ли настраивать действие, чтобы оно выполнялось в состоянии A или B (предположим, я хочу выбрать только одно состояние, в котором действие может быть выполнено)?

Google находит, скажи мне, что действие будет выполнено в точное время перехода; но у моего мозга есть проблемы, чтобы принять его: imo мой объект должен находиться в определенном состоянии, в то время как действие выполняется (только потому, что мой объект должен всегда находиться в определенном состоянии). И выполнение действия может занять некоторое время.

Related: Что происходит, если во время выполнения действия возникает ошибка. Мой объект останется в состоянии A, или он все равно перейдет в состояние B (помните, что событие было получено, а защитное выражение оценено как true)?

1 Ответ

0 голосов
/ 13 марта 2019

Это довольно легко проверить с помощью пользовательского конечного автомата , в котором вы переопределяете соответствующие методы для входа / выхода из состояния и переходов.

будет ли выполнено действие, пока мой объект находится в состоянии A или B?

Ваше действие (которое находится на переходном этапе) будет выполняться, пока вы находитесь в состоянии А. Порядок действий следующий:

Started transition
State Entered: A
SM changed states from:null to: A
Ended transition
---
Executing guard logic
Started transition
Executing normal action //action is executed before exiting State A
State exited: A
State Entered: B
SM changed states from:A to: B
Ended transition

Что произойдет, если во время выполнения действия возникнет ошибка. Мой объект останется в состоянии A или перейдет в состояние B в любом случае

Вы останетесь в штате А.

Как видно из вышеприведенного вывода, выход из состояния происходит после того, как действие выполнено (успешно). Если перед этим возникнет исключение, вы все еще будете в состоянии A.

...