2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 63
Текст из файла (страница 63)
При наличии ряда неортогональных подсостояний в контексте включающего составного состояния объект может находиться одновременнов этом составном состоянии и только в одном из его подсостояний(или в конечном состоянии). Таким образом, неортогональные подсостояния разделяют пространство составного состояния на непересекающиеся состояния.Переход от исходного состояния, внешнего по отношению к составному включающему состоянию, может вести либо к этому последнему, либо к одному из его подсостояний. Если целью переходаявляется составное состояние, то вложенный автомат должен иметьначальное состояние, которому передается управление после входав составное состояние и после выполнения его входного действия,если таковое присутствует.
Если цель перехода – вложенное подсостояние, то управление передается ему после выполнения входногоТермины и понятия327действия (если оно есть) составного состояния и (если оно есть)входного действия этого целевого подсостояния.Переход, ведущий из составного состояния, может иметь в качестве исходного либо его само, либо одно из его подсостояний.В любом случае управление сначала покидает вложенное состояние(при этом выполняется его выходное действие, если таковое присутствует), а затем составное состояние (при этом выполняется еговыходное действие, если оно есть).
Переход, началом которого является составное состояние, по существу, прерывает деятельностьвложенного автомата. Завершающий переход составного состояниявыполняется, когда управление достигает его конечного подсостояния.На заметку. Вложенные неортогональные автоматы могутиметь как максимум одно начальное подсостояние и одноконечное.Исторические состоянияАвтомат описывает динамическое поведение объекта, текущеесостояние которого зависит от его прошлого.
Автомат, по сути, специфицирует допустимый порядок состояний, которые может принимать объект за время своего жизненного цикла.Если не указано иное, то когда переход приводит к составномусостоянию, деятельность вложенного автомата начинается с его начального состояния (если только непосредственной целью перехода не является конкретное подсостояние). Однако иногда возникаетнеобходимость моделировать объект, «помнящий» подсостояние,которое было активным перед тем, как он покинул составное состояние.
Так, при моделировании поведения агента, выполняющегоавтоматическое резервное копирование на всех компьютерах сети,желательно помнить, на чем он остановился, когда, например, былпрерван по запросу оператора.Теоретически здесь допускается моделирование с помощьюпростого автомата, но это будет некрасиво. Нужно будет, чтобы каждое последовательное подсостояние посылало значение некоторойпеременной, локальной по отношению к составному состоянию.Начальное состояние в этом составном должно будет иметь переход, снабженный защитным условием, проверяющим переменную,в каждое из своих подсостояний.
Таким образом, при выходе из составного состояния можно будет запомнить последнее подсостояние, с тем чтобы при следующем входе в составное состояние сразуосуществить переход в него. Это неудобно, ведь вам придется помнить о том, что нужно «коснуться» всех подсостояний и установитьКонечные автоматы328для каждого соответствующее выходное действие. В результате появится множество переходов из одного и того же начального состояния, ведущих к различным целевым подсостояниям с очень похожими (но всеFтаки разными) защитными условиями.В UML предусмотрен более простой способ моделированияподобных идиом – с помощью исторических состояний. Историческое состояние (history state) позволяет составному состоянию,включающему неортогональные подсостояния, «помнить» подсостояние, которое было активным на момент последнего перехода изсоставного состояния вовне.
Как показано на рис. 22.6, историческое состояние изображается в виде маленького кружочка с буквой«H» (History).начальное состояние первого входаРезервноекопированиеТермины и понятия329На заметку. Буквой «H» обозначается поверхностная память,которая хранит лишь последнее состояние ближайшего вложенного автомата. Можно специфицировать и глубиннуюпамять, изобразив ее в виде маленького кружочка с символами«H*» внутри.
Такая история хранит состояния всех вложенныхавтоматов. Если имеется только один уровень вложенности,то поверхностная и глубинная память семантически эквивалентны. Если же уровней вложенности несколько, поверхностная память хранит состояние только ближайшего вложенного автомата, а глубинная – всех автоматов, вложенных другв друга на любую глубину.В любом случае, если вложенный автомат достиг завершающегосостояния, то он теряет всю хранимую в нем историю и ведет себятак, как будто никакого входа в него еще не было.Ортогональные подсостоянияисторическое состояниес поверхностной памятьюРис.
22.6. Историческое состояниеЕсли нужно, чтобы переход активировал последнее подсостояние,то он показывается как ведущий из составного состояния вовне, непосредственно к историческому. Когда вы впервые входите в составное состояние, оно еще не имеет истории. Это означает, что в наличииимеется единственный переход от исторического состояния к последовательному подсостоянию, – в данном примере Collecting (Сбор).Цель этого перехода специфицирует начальное состояние вложенного автомата при первом входе.
Предположим, что во время состояния BackingUp (РезервноеКопирование) и Copying (Копирование) посылается событие query (запрос). Управление покидает Copying и BackingUp(вызывая при необходимости их выходные действия) и возвращается к состоянию Command (Команда). Когда завершится деятельностьCommand, завершающий переход вернется к историческому состояниюсоставного состояния BackingUp. На этот раз, поскольку существуетистория вложенного автомата, управление передается состояниюCopying, минуя состояние Collecting, так как именно Copying было последним активным подсостоянием перед последним выходом из BackingUp.Неортогональные подсостояния – это наиболее общий случайиспользования вложенных автоматов, с которым приходится сталкиваться на практике.
Однако в некоторых ситуациях моделирования может понадобиться специфицирование ортогональныхобластей. Они позволяют описать несколько автоматов, работающих параллельно в контексте включающего объекта.В примере на рис. 22.7 показано расширение состояния Maintenance(Обслуживание) из рис. 22.5. Оно декомпозируется на две ортогональные области – Testing (Тестирование) и Commanding (Обработкакоманд), показанные в виде вложений в Maintenance, но разделенные пунктирной линией. Каждая из этих ортогональных областей,в свою очередь, разбита на подсостояния. Когда управление передается из состояния Idle (Простой) в Maintenance, то общий поток разделяется на два параллельных – включающий объект будет одновременно пребывать в областях Testing и Maintenance.
Более того, объект,находящийся в области Commanding, также пребывает и в состоянииWaiting (Ожидание) или Command (Команда).На заметку. Неортогональные подсостояния отличаютсяот ортогональных по следующему признаку. Имея нескольконеортогональных подсостояний на одном и том же уровне,объект может пребывать либо в одном из них, либо в другом.Имея же несколько ортогональных областей на одном и томже уровне, он будет одновременно пребывать в состояниикаждой из них.Конечные автоматы330ПростойсоединениеподдержкаортогональнаяобластьОбработка командвложенное состояниеРис. 22.7.
Параллельные подсостоянияПрохождение по каждой из этих двух ортогональных областейосуществляется параллельно. В итоге каждый вложенный автоматдостигает своего конечного состояния. Если одна ортогональная область переходит в конечное состояние раньше другой, управлениев ней ожидает, пока другая область не достигнет своего конечногосостояния. Когда же обе области оказываются в своих конечных состояниях, управление из них сливается обратно в общий поток.Когда имеется переход в составное состояние, разбитое на ортогональные области, управление всегда разделяется на столько жепараллельных потоков, сколько существует таких областей.
Аналогично, при наличии перехода из составного состояния, разбитогона ортогональные области, параллельные потоки управления сливаются воедино. Это верно во всех случаях. Если все ортогональныеобласти достигают своего конечного состояния или же присутствует явный переход из включающего составного состояния, управление сливается в один поток.На заметку. Каждая ортогональная область может иметьначальное, конечное и историческое состояние.Термины и понятия331непосредственно в одно или несколько ортогональных состояний.Такой процесс называется разделением (fork), поскольку управление передается от одного состояния нескольким ортогональнымсразу.
Графически это выражает толстая черная линия с одной входящей стрелкой и несколькими исходящими, каждая из которыхуказывает на ортогональное состояние. Если одна или несколькоортогональных областей не имеют целевых состояний, то неявновыбираются начальные состояния этих областей.
Переход к единственному ортогональному состоянию внутри составного – такженеявное разделение; начальные состояния всех других ортогональных областей являются неявными участниками разделения.Аналогичным образом переход от любого состояния внутри составного с ортогональными областями инициирует выход из всехортогональных областей. Такой переход часто представляет ошибочное условие, вызывающее прерывание всех параллельных вычислений.Соединение (join) – это переход с несколькими входящими стрелками и одной исходящей. Каждая входящая стрелка должна исходить от состояния в разных ортогональных областях одного и тогоже составного состояния. Соединение может иметь инициирующеесобытие. Переход с соединением эффективен только тогда, когда активны все исходные состояния; статус других ортогональныхобластей составного состояния не важен.
Если событие происходит,то управление покидает все ортогональные области составного состояния, а не только те, откуда ведут стрелки.Рис. 22.8 – вариант предыдущего примера с явными переходамиразделения и соединения. Переход maintain (поддержка) к составномуПростойразделениеВосстановлениедиагностикаподдержкаошибкаТестированиеустройствОбработка командРазделение и соединениеОбычно вход в составное состояние с ортогональными областями ведет к начальному состоянию каждой из этих областей.Но также возможно осуществить переход из внешнего состояниясоединениеРазъединениепотеря связиРис. 22.8. Переходы с разделением и соединениемКонечные автоматы332состоянию Maintenance (Обслуживание) – это поFпрежнему неявноеразделение, ведущее к начальным состояниям по умолчанию двухортогональных областей.
В этом примере, однако, присутствует переход с явным разделением от Idle (Простой) ко вложенным состояниям Self diagnose (Самодиагностика) и конечному состояниюобласти Commanding (Обработка команд). Конечное состояние – этоявное состояние, которое может быть целью перехода. Если возникает событие ошибки во время Self diagnose, то происходит неявное слияние с переходом к Repair (Восстановление). При этоми Self diagnose, и любое активное состояние области Commanding завершается.Есть также явный переход со слиянием к состоянию Offline(Разъединение). Он осуществляется только при возникновении события disconnect (потеря связи), когда активно и состояние Testingdevices (Тестирование устройств), и конечное состояние областиCommanding (Обработка команд).