Чтобы добавить к ответу Бруно что-то более конкретное.
Как указано в спецификации 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