Визуальное моделирование сложных реагирующих систем при помощи диаграмм состояния 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

Родственные состояния – это дочерние состояния с общим родителем.