Что делает 'do' в диаграмме состояний UML?

Я не уверен на 100%, что делает 'do' на диаграмме состояний UML.

Правильно ли я думаю:

Если происходит переход, сначала будет выполнено «вход», а затем «до». И если мы выходим из состояния, будет выполнен только «выход».

Применяется ли эта логика и к рефлексивным переходам?

А что, если произойдет триггер, который не запустит переход? Выполняется ли это только 'do'?


person Nime    schedule 09.08.2020    source источник
comment
@bruno, к сожалению, нет.   -  person Nime    schedule 09.08.2020


Ответы (2)


Спецификация UML говорит нам:

14.2.3.4.3 Вход в состояние, выход и поведение doActivity

. . .

Состояние также может иметь связанное поведение doActivity. Это поведение начинает выполняться при входе в состояние (но только после того, как поведение входа в состояние завершено) и выполняется одновременно с любыми другими действиями, которые могут быть связаны с состоянием, до тех пор, пока:

  • он завершается (в этом случае генерируется событие завершения) или
  • состояние завершается, и в этом случае выполнение поведения doActivity прерывается.

Выполнение поведения doActivity для состояния не зависит от срабатывания внутреннего перехода этого состояния.

Ты :

Применяется ли эта логика и к рефлексивным переходам?

Как сказано в последнем предложении выше, это зависит от того, является ли рефлексивный переход внутренним или внешним.

person bruno    schedule 09.08.2020
comment
Так что 'do' не будет выполняться, если мы покинем состояние. В этом случае будет выполнен только «выход», верно? А если мы находимся в состоянии и у нас есть триггер, который не запускает переход, тогда будет выполнено «do»? А что вы понимаете под внутренними и внешними рефлекторными переходами? - person Nime; 09.08.2020
comment
@Nime, рефлексивный переход может быть внутренним или внешним, когда вы добавляете рефлексивный переход, вы должны выбрать, какой именно. Таким образом, в случае внутреннего самоперехода поведение do не прерывается. Если нет возможного перехода, поведение do может (продолжать) выполняться или нет, UML ничего не говорит об этом, чтобы быть совместимым с любыми случаями, потому что мы не знаем, выполняется ли оно в цикле, по таймеру и т. д. и как долгое его исполнение - person bruno; 09.08.2020

Чтобы добавить к ответу Бруно что-то более конкретное.

Как указано в спецификации UML (и процитировано Бруно в его ответе), действие do выполняется, пока система находится в определенном состоянии (после завершения действий entry). Выполняется в течение всего времени нахождения системы в состоянии. Действия do перестают выполняться только в двух случаях:

  • Запускается переход, выводящий вас из состояния; в таком случае действия do прерываются, выполняются действия exit, если таковые имеются, а затем происходит переход. Переход может быть рефлексивным (т. е. после завершения система возвращается в то же состояние), и в этом случае будут выполнены первые действия входа, а после их завершения выполнить деятельность возобновится.
  • Действия do заканчиваются сами по себе; в таком случае, как только действия do закончатся, пора покинуть состояние. Таким образом, выполняются возможные действия выход и выполняется переход. Действительная система должна иметь один или несколько переходов без инициирующего события (если их несколько, то они должны иметь условия, позволяющие однозначно определить, какой из них будет использоваться), которые будут выполняться после выходного действия (или do, если не было exit) завершается.

Возьмем более наглядный пример. Рассмотрим стиральную машину. В нем есть два интересных состояния, одно наполняется водой, другое вращается барабан.

Для наполнения водным состоянием можно ожидать следующих действий:

  • вход: открытый водяной клапан
  • делать: следить за уровнем воды
  • выход: закрыть водяной клапан

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

Как вы можете ясно видеть, в таком случае действие do прерывается после захвата триггера перехода.

А вот с барабанной дробью дело обстоит иначе. Для простоты у нас будет только одно действие *do( без действий entry или exit:

  • сделать: вращать барабан в течение n секунд со скоростью n

Когда стиральная машина входит в это состояние, она сразу же начинает крутить барабан и (если это не прерывается каким-либо исключительным событием) продолжает это делать в течение заданного периода времени. По истечении этого времени действие do немедленно прерывается и происходит переход в следующее состояние. В таком случае именно действие do определяет, когда произойдет следующий переход состояния, по крайней мере, в типичном сценарии.

person Ister    schedule 10.08.2020