UML. Диаграммы состояний

Диаграммы конечных автоматов – это хорошо известный и проверенный временем способ описать поведение системы. В том или ином виде такие диаграммы присутствуют со времен зари вычислительной техники – 50-60 годов прошлого столетия. В объектно-ориентированных системах вы рисуете диаграмму состояния замкнутой системы для того, чтобы разобраться в тонкостях ее поведения в течение ее жизни.

Обычно, для примера приводят поведение стистем круиз контроля или торговые автоматы, однако мы поступим в духе разработчиков игр;) Мы опишем состояния контроллера секретной панели в замке с привидениями;) В этом замке спрятаны наши сокровища, нажитые, естесственно, неправедным путем. Сокровища хорошо скрыты от посторонних глаз и охраняемы. Для того, чтобы открыть сейф с сокровищами, необходимо вытащить из канделябра определенную свечу. После этого, мы увидим замок, открыв который, получим доступ к сокровищам. Для того, чтобы перехитрить тех, кто позарится на клад, в случае, если замок будет открыт до того, как извлечена свеча – мы даем команду страшному монстру атаковать посягнувших.

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

На диаграмме показано, что контроллер может находиться в одном из трех состояний: Wait (Ожидание), Lock (Замок) и Open (Открыт). На диаграмме также представлены правила, согласно которым контроллер сменяет одно состояние на другое. Эти правила представлены в виде переходов – линий, связывающих состояния. На диаграмме показано, что наш автомат может находиться в одном из трех состояний:

  • Wait (или Idle) – состояние ожидания

  • Lock – заперто

  • Open – открыто

На диаграмме так же представлены правила, по которым контроллер может переходить из состояния в состояние. Эти правила описаны в виде переходов – линий, связывающих состояния. Как правило, над переходом описывают две вещи:

  • гвард (guard) состояния – то, при каких условиях возможен переход — например, клавиша нажата, письмо пришло, дверь заперта

  • активность во время перехода – то, чем занимается система, пока осуществляется переход из состояния в состояние – например, идея > работа > профит;)

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

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

Конечное состояние, обозначаемое жирной точкой с границей вокруг, значит, что автомат прекратил свою работу. В нашем случае мы собираем сокровища в ларец, моем пол и сажаем кролика обратно в клетку;)

Помните, что конечные автоматы могут показывать только те объекты, которые непосредственно наблюдаются и действуют. Поэтому, несмотря на то, что мы могли описать на диаграмме и другие действия – например, положить или забрать чего-либо из сейфа, мы не стали этого делать – это не имеет отношения к данной системе. Когда мы говорим о состоянии объекта в терминологии ооп, мы имеем ввиду совокупность всех его внутренних данных. Отсюда несложно предположить, что один класс с простым integer внутри может иметь более четырех миллиардов состояний. Будьте абстрактны – выбирайте действительно важные состояния.

Когда применяют диаграммы состояний.

Диаграммы состояний хороши для описания состояний одной системы в рамках нескольких прецендентов. Они плохо подходят для формализации поведения нескольких взаимодействующих объектов. Хорошими кандидатами являются – поведения оконных менеджеров (заставка > главное меню > окно игры > …), контроллеры игровой механики (спит > охотится > ест > прячется > …), контроллеры анимации (бежит > ползет > стоит > …) и т.п. Паттерн Конечный автомат играет значительную роль при разработке приложений с логикой вообще и игр в частности.

Last updated