Конечный автомат: в каком состоянии выполняется действие при переходе?

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

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

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

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

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

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


person Roman    schedule 12.03.2019    source источник


Ответы (1)


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

будет ли действие выполнено, пока мой объект находится в состоянии 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.

person hovanessyan    schedule 13.03.2019