Диаграмма схем состояний


Диаграмма схем состоянийотображает конечный автомат, выделяя поток управления, следующий от состояния к состоянию. Конечный автомат – поведение, которое определяет последовательность состояний в ходе существования объекта. Эта последовательность рассматривается как ответ на события и включает реакции на эти события.

Диаграмма схем состояний показывает:

1 набор состояний системы;

2 события, которые вызывают переход из одного состояния в другое;

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

На диаграммах состояний применяется всего один тип сущностей – состояния, и всего один тип отношений – переходы.

Состояние – это период в жизни объекта, на протяжении которого он удовлетворяет какому-то условию, выполняет определенную деятельность или ожидает некоторого события. Состояния бывают:

● простые (simple),

● составные (composite),

● специальные (pseudo),

● ссылочные (submachine).

Переходы бывают простые и составные, каждый переход содержит от двух до пяти составляющих:

● исходное состояние (source),

● событие перехода (trigger event),

● сторожевое условие (guard),

● действие на переходе (effect),

● целевое состояние (target).

Простое состояние имеет следующую структуру:

● имя (name);

● действие при входе (entry action);

● действие при выходе (exit action);

● описание множества внутренних переходов (internal transitions) и соответствующих действий;

● внутренняя деятельность (do activity);

● множество отложенных событий (defer events).

Имя состояния является обязательным. Все остальные составляющие простого состояния не являются обязательными.

Действие при входе(entry) – это указание атомарного действия, которое должно выполняться при переходе автомата в данное состояние. Действие при входе выполняется после всех других действий, предписанных переходом, переводящим автомат в данное состояние.

Действие при выходе (exit) – это указание атомарного действия, которое должно выполняться при переходе автомата из данного состояния. Действие при выходе выполняется до всех других действий, предписанных переходом, выводящим автомат из данного состояния.

Множество внутренних переходов — это множество простых переходов из данного состояния в это же самое. Внутренний переход (internal) отличается от простого перехода в себя (external) тем, что действия при выходе и входе не выполняются.

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

Если в то время, когда автомат находится в некотором состоянии, происходит событие, для которого в данном состоянии не определен переход, то согласно семантике UML ничего не происходит и событие безвозвратно теряется. Чтобы этого избежать, в UML предусмотрено понятие отложенного события.

Отложенное событие – это событие, для которого не определен переход в данном состоянии, но которое, тем не менее, не должно быть потеряно, если оно произойдет, пока автомат находится в данном состоянии (обозначается при помощи ключевого слова defer). Семантика отложенного события такова: если происходит отложенное событие, то оно помещается в конец некоторой системной очереди отложенных событий. После перехода автомата в новое состояние проверятся (начиная с начала) очередь отложенных событий. Если в очереди есть событие, для которого в новом состоянии определен переход, то событие извлекается из очереди и происходит переход.

Простой переход всегда ведет из одного состояния в другое или в то же самое состояние. Переход не может приходить "ниоткуда" и уходить "в никуда". Существует несколько ограничений для специальных состояний, например, для начального состояния не может быть входящих переходов, а для заключительного — исходящих, а в остальном переходы между состояниями могут быть определены произвольным образом.

Прочие составляющие – событие перехода, сторожевое условие и действия на переходе не являются обязательными. Если они присутствуют, то изображаются в виде текста в определенном синтаксисе рядом со стрелкой, изображающей переход.

Синтаксис описания перехода следующий:

Событие [ Сторожевое условие ] / Действие

Событие перехода (trigger event) – это тот входной символ, который вместе с текущим состоянием автомата определяет следующее состояние.

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

Для каждого возбужденного перехода сторожевое условие проверяется ровно один раз, сразу после того, как переход возбужден и до того, как в системе произойдут какие-либо другие события. Если сторожевое условие ложно, то переход не срабатывает и событие теряется. Даже если впоследствии сторожевое условие станет истинным, переход сможет сработать, только если повторно возникнет событие перехода.

Действие (action) – это непрерываемое извне атомарное вычисление, чье время выполнения пренебрежимо мало.

В общем случае переход выполняется следующим образом. Пусть автомат находится в состоянии State1, в котором определен исходящий переход с событием Event, сторожевым условием Condition и действием Action, ведущий в состояние State2 (рис 3.20).

Рисунок 3.20. Семантика перехода

Если возникает событие Event, то переход возбуждается, и проверяется сторожевое условие Сondition (проверяются сторожевые условия всех возбужденных переходов в неопределенном порядке). Если сторожевое условие выполнено, то переход срабатывает – выполняется действие на выходе из состояния State1, выполняется действие на переходе Action, выполняется действие на входе в состояние State2 и автомат переходит в состояние State2. Даже если у нескольких возбужденных переходов сторожевые условия оказываются истинными, то, тем не менее, срабатывает всегда только один переход из возбужденных. Какой именно переход срабатывает — не определено. Таким образом, поведение, описываемое подобным автоматом, является недетерминированным. Если же сторожевое условие Condition не выполнено, то переход не срабатывает. Если ни один из возбужденных переходов не срабатывает, то событие Event теряется и автомат остается в состоянии State1.

UML допускает наличие переходов без событий — такой переход называется переходом по завершении. Переход по завершении (completion transition) — это переход, который происходит по окончанию внутренней деятельности.

Составное состояние может быть

● последовательным (sequential / non-orthogonal state),

● параллельным (ортогональным) (concurrent / orthogonal state).

Составное состояние – это состояние, в которое вложена машина состояний. Если вложена только одна машина, то состояние называется последовательным, если несколько – параллельным.

Рассмотрим всем известный пример: светофор. Он может находиться в двух основных состояниях:

● Off — вообще не работает — выключен или сломался;

● On — работает.

Работать светофор может по-разному:

● Blinking — мигающий желтый, дорожное движение не регулируется;

● Working — работает по-настоящему и регулирует движение.

В последнем случае у светофора есть 4 состояния, являющихся предписывающими сигналами для участников дорожного движения:

● Green — зеленый свет, движение разрешено;

● YellowGreen — состояние перехода из режима разрешения в режим запрещения движения (это настоящее состояние, светофор находится в нем заметное время);

● Red — красный свет, движение запрещено;

● RedYellow — состояние перехода из режима запрещения в режим разрешения движения (это состояние отличное от YellowGreen, светофор подает несколько иные световые сигналы, и участники движения обязаны по-другому на них реагировать).

 

Рисунок 3.21. Диаграмма состояний для светофора с использованием составных состояний

Назначение составных состояний аналогично назначению суперклассов: выявить общее в нескольких элементах и описать это общее только один раз. Тем самым сокращается описание модели, и она становится более удобной для восприятия человеком.