Визуальное моделирование сложных реагирующих систем при помощи диаграмм состояния UML Harel - Как уменьшить размер представления?
ОГЛАВЛЕНИЕ
Как уменьшить размер представления?
Решение – иерархические конечные автоматы. При обычном проектировании конечных автоматов все состояния считаются находящимися на одном и том же уровне. Модель не фиксирует общность, существующую среди состояний. В реальности многие состояния обрабатывают большинство сообщений аналогично, и различается только обработка нескольких важных сообщений. Даже когда реальная обработка различается, все же имеется некоторая общность. Проектирование иерархического конечного автомата фиксирует общность путем упорядочивания состояний в виде иерархии. Состояния на более высоком уровне в иерархии выполняют обработку сообщений общего характера, в то время как состояния более низких уровней наследуют общность от более высоких уровней и выполняют конкретные функции состояния.
Иерархия состояний конечного автомата основана на отношении типа «родитель-потомок», которое изображается компоновкой ветвей дерева. Например, на следующем рисунке: иерархия состояний в форме дерева, узел Игрок в дереве состояний – это корневое состояние, имеющее двух потомков: PowerDown (выключение питания) и PowerUp (включение питания). При этом узел PowerUp также является родителем трех потомков, и эти дети именуются родственными состояниями (братьями или сестрами) между собой.
Эта иерархическая организация означает, что когда запускается переход из состояния PowerDown в PowerUp, конечный автомат отключает состояние PowerDown и его потомков (если они есть) и активирует PowerUp и один или больше его потомков (если они есть).
Игрок
- PowerDown (выключение питания) (инициализация)
- PowerUp (включение питания)
- Playing (игра) (инициализация)
- Pause (пауза)
- Record (запись)
Рисунок: Иерархия состояний в форме дерева
Эта же иерархия может быть представлена в форме вложенной диаграммы. В этом формате иерархия среди состояний показывается при помощи вкладывания состояний-потомков внутрь их родительского состояния.
Рисунок: Иерархия состояний в форме диаграммы
При помощи API (интерфейса прикладного программирования) среды разработки приложений StateWizard конечный автомат Player (игрок) определяется так:
/* Определение сложного корневого состояния Игрока. */
#define SME_CURR_DEFAULT_PARENT Player
SME_BEGIN_ROOT_COMP_STATE_DEF(Player, PlayerEntry, PlayerExit)
SME_ON_INIT_STATE(SME_NULL_ACTION, PowerDown)
SME_END_STATE_DEF
SME_BEGIN_LEAF_STATE_DEF_P(PowerDown, PowerDownEntry, PowerDownExit)
SME_ON_EVENT(EXT_EVENT_ID_POWER, OnPowerDownEXT_EVENT_ID_POWER, PowerUp)
SME_END_STATE_DEF
SME_BEGIN_SUB_STATE_DEF_P(PowerUp)
SME_ON_EVENT(EXT_EVENT_ID_POWER,OnPowerUpEXT_EVENT_ID_POWER,PowerDown)
SME_END_STATE_DEF
SME_END_COMP_STATE_DEF(Player)
#define SME_CURR_DEFAULT_PARENT PowerUp
SME_BEGIN_COMP_STATE_DEF(PowerUp, Player, PowerUpEntry, PowerUpExit)
SME_ON_INIT_STATE(OnPowerUpInitChild, Playing)
SME_END_STATE_DEF
SME_BEGIN_LEAF_STATE_DEF_P(Playing, PlayingEntry, PlayingExit)
SME_ON_EVENT(EXT_EVENT_ID_PAUSE_RESUME,OnPlayingEXT_EVENT_ID_PAUSE_RESUME,Pause)
SME_END_STATE_DEF
SME_BEGIN_LEAF_STATE_DEF_P(Pause, PauseEntry, PauseExit)
SME_ON_EVENT(EXT_EVENT_ID_START_RECORD,OnPauseEXT_EVENT_ID_START_RECORD,Record)
SME_END_STATE_DEF
SME_BEGIN_LEAF_STATE_DEF_P(Record,RecordEntry,RecordExit)
SME_ON_EVENT(EXT_EVENT_ID_STOP_RECORD,OnRecordEXT_EVENT_ID_STOP_RECORD,Pause)
SME_END_STATE_DEF
SME_END_COMP_STATE_DEF(PowerUp)
Корневое состояние – это самое верхнее состояние, носящее имя приложения. По мере добавления состояний дерево растет вниз от корневого состояния.
Например, сложное состояние Player – это корневое состояние конечного автомата Player. Оно определяется, как показано ниже. PlayerEntry и PlayerExit – это указатели функции на действия при входе и выходе из корневого состояния, соответственно.
SME_BEGIN_ROOT_COMP_STATE_DEF(Player, PlayerEntry, PlayerExit)
Родительское состояние – это состояние, разветвляющееся в одно или больше дочерних состояний. Родитель может иметь нескольких потомков, но потомок имеет только одного родителя.
Например, родительское состояние сложного состояния PowerUp – это состояние Player. Определение состояния PowerUp приведено ниже:
SME_BEGIN_COMP_STATE_DEF(PowerUp, Player, PowerUpEntry, PowerUpExit)
Начальное дочернее состояние обозначает начальное состояние для конечных автоматов, имеющих состояния. Это дочернее состояние должно наступать в том и только в том случае, если автомат имеет одно или больше состояний или параллельных потомков.
Например, начальное дочернее состояние Playing сложного состояния PowerUp определяется, как показано ниже. OnPowerUpInitChild – это указатель функции на действие при входе в начальное дочернее состояние.
SME_BEGIN_COMP_STATE_DEF(PowerUp, Player, PowerUpEntry, PowerUpExit)
SME_ON_INIT_STATE(OnPowerUpInitChild, Playing)
SME_END_STATE_DEF
Родственные состояния – это дочерние состояния с общим родителем.