На этом шаге рассмотрим разделение и соединение переходов между состояниями объекта.
Обычно вход в составное состояние с ортогональными областями ведет к начальному состоянию каждой из этих областей. Но также возможно осуществить переход из внешнего состояния непосредственно в одно или несколько ортогональных состояний. Такой процесс называется разделением (fork), поскольку управление передается от одного состояния нескольким ортогональным сразу. Графически это выражает толстая черная линия с одной входящей стрелкой и несколькими исходящими, каждая из которых указывает на ортогональное состояние. Если одна или несколько ортогональных областей не имеют целевых состояний, то неявно выбираются начальные состояния этих областей. Переход к единственному ортогональному состоянию внутри составного – также неявное разделение; начальные состояния всех других ортогональных областей являются неявными участниками разделения.
Аналогичным образом переход от любого состояния внутри составного с ортогональными областями инициирует выход из всех ортогональных областей. Такой переход часто представляет ошибочное условие, вызывающее прерывание всех параллельных вычислений.
Соединение (join) – это переход с несколькими входящими стрелками и одной исходящей. Каждая входящая стрелка должна исходить от состояния в разных ортогональных областях одного и того же составного состояния. Соединение может иметь инициирующее событие. Переход с соединением эффективен только тогда, когда активны все исходные состояния; статус других ортогональных областей составного состояния не важен. Если событие происходит, то управление покидает все ортогональные области составного состояния, а не только те, откуда ведут стрелки.
Рис. 1 – вариант предыдущего примера с явными переходами разделения и соединения.
Рис.1. Переходы с разделением и соединением
Переход maintain (поддержка) к составному состоянию Maintenance (Обслуживание) – это по-прежнему неявное разделение, ведущее к начальным состояниям по умолчанию двух ортогональных областей. В этом примере, однако, присутствует переход с явным разделением от Idle (Простой) ко вложенным состояниям Self diagnose (Самодиагностика) и конечному состоянию области Commanding (Обработка команд). Конечное состояние – это явное состояние, которое может быть целью перехода. Если возникает событие ошибки во время Self diagnose, то происходит неявное слияние с переходом к Repair (Восстановление). При этом и Self diagnose, и любое активное состояние области Commanding завершается.
Есть также явный переход со слиянием к состоянию Offline (Разъединение). Он осуществляется только при возникновении события disconnect (потеря связи), когда активно и состояние Testing devices (Тестирование устройств), и конечное состояние области Commanding (Обработка команд). Если оба состояния неактивны, данное событие не имеет никакого эффекта.
Другой способ моделирования параллелизма – применение активных объектов. То есть вместо разбиения одного автомата объекта на несколько параллельных областей можно определить два активных объекта, каждый из которых реализует поведение одной из параллельных областей. Если на поведение одного из этих параллельных потоков влияет состояние другого, это можно смоделировать при помощи ортогональных областей. Если же поведение одного потока зависит от сообщений, посланных другим или другому, то имеет смысл воспользоваться активными объектами. Если между параллельными потоками происходит лишь минимальное общение либо вообще не наблюдается никакого, то в большинстве случаев применение активных объектов сделает ваш дизайн более наглядным.
На следующем шаге рассмотрим типичные приемы моделирования жизненного цикла объекта.