Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania_k_vypolneniyu_KP_OOP.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

5.2.3 Диаграммы состояний и переходов

Диаграмма состояний и переходов показывает: пространство состояний данного класса; события, которые влекут переход из одного состояния в другое; действия, которые происходят при изменении состояния [2]. Отдельная диаграмма состояний и переходов представляет определенный ракурс динамической модели отдельного класса или целой системы. Диаграммы состояний и переходов строятся только для классов, поведение которых (управляемое событиями) существенно. Можно также представить диаграмму состояний и переходов для управляемого событиями поведения системы в целом. Эти диаграммы используются в ходе анализа, чтобы показать динамику поведения системы, а в ходе проектирования - для выражения поведения отдельных классов или их взаимодействия.

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

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

Рисунок 5.12 – Значок состояния

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

На значках некоторых состояний полезно указать ассоциированные с ними действия. Как показано на рис. 5.12, действия обозначаются так же, как атрибуты и операции в значке класса. 

Событием называется любое происшествие, которое может быть причиной изменения состояния системы. Изменение состояний называется переходом. На диаграмме переходов и состояний он изображается значком, показанным на рис. 5.13. Каждый переход соединяет два состояния. Состояние может иметь переход само в себя; обычно есть несколько различных переходов в одно и то же состояние, но все переходы должны быть уникальны в том смысле, что ни при каких обстоятельствах не может произойти одновременно два перехода из одного состояния.

Рисунок 5.13 – Значок перехода из состояния в состояние

Идентификация событий позволяет определить границы поведения системы и распределить обязанности по осуществлению этого поведения между отдельными классами.

Действием называется операция, которая, с практической точки зрения, требует нулевого времени на выполнение. Например, включение сигнала тревоги - действие. Обычно действие означает вызов метода, порождение другого события, запуск или остановку процесса. Деятельностью называется операция, требующая некоторого времени на свое выполнение.

Существует несколько стратегий реализации управления событиями.

  1. Событие может быть представлено символическим именем (или именованным объектом), классом или именем некоторой операции. Все события являются символическими именами и каждый класс с поведением, управляемым событиями, имеет операцию, которая распознает эти имена и выполняет соответствующие действия. Такая стратегия часто используется в архитектурах типа модель-представление-котроллер (model-view-controller).

  2. Для большей общности можно считать события объектами и определить иерархию классов, которые представляют собой абстракции этих событий. Продолжая в том же духе, можно сделать так, чтобы переходы из состояния в состояние были полиморфны относительно классов событий.

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

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

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

  • door.Open() – действие;

  • Сброс времени - произошло событие;

  • start ОтсчетВремени - начать некоторую деятельность;

  • stop ОтсчетВремени - прекратить деятельность.

Имена операций или событий должны быть уникальны в области видимости диаграммы; там, где необходимо, они могут быть квалифицированы соответствующими именами классов или объектов.

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

Пример. Диаграммы состояний и переходов.

На рисунках 5.14-5.20 показаны диаграммы состояний и переходов для классов ПрО «Микроволновая печь» Man, Door, ElectricalAppliance, Button, Speaker, Timer, MicrowaveOven. Для класса Random диаграмма не приводится, так как класс статический.

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

Рисунок 5.14 – Диаграмма состояний и переходов для класса Man

Дверь – простейший класс, имеющий состояния: открыта и закрыта; и переходящий из одного в другое при вызове соответствующих методов.

Рисунок 5.15 – Диаграмма состояний и переходов для класса Door

Аналогично ведет себя и класс электроприбора.

Рисунок 5.16 – Диаграммы состояний и переходов для класса ElectricalAppliance

Класс Button наследует ElectricalAppliance, но кроме этого расширяет его дополнительными переходами: из состояния отключен по нажатию в состояние включен и в обратном порядке просто по истечении времени, так как кнопка без фиксации.

Рисунок 5.17 – Диаграмма состояний и переходов для класса Button

Класс Speaker также наследует ElectricalAppliance. Ведет себя аналогично Button, но время нахождения в состоянии включен иное.

Рисунок 5.18 – Диаграмма состояний и переходов для класса Speaker

Класс Timer очень похож на Button и Speaker, но позволяет извне установить и изменить время работы. На рисунке показаны два вложенных состояния: ожидание и отсчет времени завершен. Также в состоянии включен осуществляется деятельность, которая ведет отсчет времени.

Рисунок 5.19 – Диаграмма состояний и переходов для класса Timer

Класс MicrowaveOven также наследует класс ElectricalAppliance, но не расширяет его дополнительными переходами, а уточняет его состояние включен, т.е. все, что показано на рисунке 5.20, является вложенными состояниями состояния включен. На диаграмме в состояниях подробно отражен сценарий работы печи через управление ее свойствами.

Рисунок 5.20 – Диаграмма состояний и переходов для класса MicrowaveOven