Композитное состояние и внутренние переходы
При условии, что я сейчас в StateB. Sig2 приходит. Таким образом, ни вход, ни выход не будут выполнены, а только Act5. Все идет нормально.
Сейчас мы находимся в StateC, но на этот раз Sig1 приходит. Определен внутренний переход, но в родительском составном состоянии. Должен ли я выйти из StateC, сделать Act2 и перейти к начальному разъему и войти в StateB?
Я не нашел ответа на этот вопрос в стандарте UML.
2 ответа
Вам не нужно выходить StateC
внутренние переходы в собственное состояние всегда могут происходить, пока вы находитесь в некоторых его подсостояниях.
14.5.12.3 Литералы
- внутренний
- Подразумевается, что переход, если он инициирован, происходит без выхода или входа в исходное состояние (т. Е. Он не вызывает изменения состояния). Это означает, что условие входа или выхода государства источника не будет вызываться. Внутренний переход может быть выполнен, даже если SateMachine находится в одном или нескольких регионах, вложенных в ассоциированное состояние.
Это имеет смысл - вы всегда находитесь в некотором подсостоянии составного состояния. (Как только вы вводите составное состояние, оно сразу (после entry
поведение) переходит в первое состояние).
И конечно внутренние переходы не меняют конфигурацию состояния, поэтому оно останется прежним (<StateA::StateC>
).
Это все, конечно, при условии, что вы телепортировались в StateC
потому что это состояние недостижимо.
В статье в Википедии о диаграммах состояний UML в настоящее время делается однозначное утверждение, которое разрешает это:
В отличие от самостоятельного перехода, никакие действия входа или выхода никогда не выполняются в результате внутреннего перехода, даже если внутренний переход наследуется от более высокого уровня иерархии, чем текущее активное состояние. Внутренние переходы, унаследованные от суперсостояний на любом уровне вложенности, действуют так, как если бы они были определены непосредственно в текущем активном состоянии.
К сожалению, это не источник. Я согласен с @user2281723, что спецификация неоднозначна. Из § 14.2.3.8.1 UML 2.5:
Внутренний - это особый случай локального Перехода, который является самопереходом (т. е. с тем же исходным и целевым состояниями), так что состояние никогда не выходит (и, следовательно, не вводится повторно), ..
Если это означает, что вся конфигурация активного состояния (все активные состояния во вложенной иерархии) не завершена, то никакого изменения состояния не происходит. Если это означает, что только определенное состояние, которому принадлежит внутренний переход, не завершено, не означает ли это, что все подсостояния будут завершены, и состояние с переходом станет активным состоянием? Это целевое состояние перехода в модели.
Я подозреваю, что первое значение было задумано авторами спецификаций и используется на практике. Надеюсь, в конце концов к спецификации будут добавлены уточнения.