Дж. Рамбо, М. Блаха - UML 2.0 - Объектно-ориентированное моделирование и разработка (1158633), страница 32
Текст из файла (страница 32)
Часть иерархической схемы сигналов, поступающих с клавиатуры 6.4. Параллелизм Модель состояний неявным образом поддерживает параллелизм разных объектов. Вообще говоря, объекты являются автономными сущностями, которые могут действовать и изменяться независимо друг от друга. Однако полная независимость объектов на практике не выполняется. На них могут быть наложены общие ограничения, вызывающие некоторую корреляцию между изменением состояний объектов. б.4.1. Параллелизм в агрегации Диаграмма состояний агрегата является совокупностью диаграмм состояний (по одной на каждую составляющую часть агрегата).
Состояние агрегата соответствует комбинации состояний всех его частей. Агрегация является отношением И. Состояние агрегата — зто одно состояние с первой диаграммы И одно состояние со второй диаграммы И одно состояние с третьей диаграммы и т. д. В наиболее интересных моделях состояния частей взаимодействуют друг с другом. Переходы одного объекта могут зависеть от того, в каком состоянии находится другой объект. Это обеспечивает взаимодействие между диаграммами состояний при сохранении их модульной структуры. На рис. 6.7 показано состояние объекта Саг (Автомобиль), которое представляет собой агрегацию состояний частей: 1яп1г1оп (Зажигание), ТгапзтЬз1оп (Передача), Ассе1егагог (Газ), Вга1ге (Тормоз) и других, не указанных на диаграмме объектов.
Состояние автомобиля включает одно состояние от каждой из частей. Каждая часть совершает переходы из состояния в состояние параллельно с другими частями. Диаграммы состояний частей являются почти независимыми, 144 Глава 6 ° Углубленное моделирование состояний но не совсем: автомобиль не заведется, если коробку передач не поставить на нейтраль. Это показывает сторожевое условие ТгапзтЫ1ол ьл №игга( (Коробка передач на нейтрали) на переходе от фтйоп-ОД (Зажигание-Выключено) к фл1г1опУГагт1пй (Зажигание-Стартер). Рис.
6.7. Агрегация и диаграммы параллельных состояний 6.4.2. Параллелизм в объекте Некоторые объекты можно разбить на подмножества атрибутов или связей, каждое из которых характеризуется своей собственной диаграммой. Состояние объекта включает одно состояние с каждой из поддиаграмм. Эти диаграммы не обязательно должны быть независимыми: одно и то же событие может вызывать переходы на нескольких диаграммах. Параллельность внутри объекта обозначается в ()МЕ разбиением композитного состояния на области при помогпи пунктирных линий. Название композитного состояния должно быть указано в отдельной закладке, которая не должна быть похожа на одну из областей. На рис. 6.8 показана диаграмма состояний одного роббера при игре в бридж.
Когда сторона выигрывает гейм, она становится «уязвима». Первая сторона, бЯ. Параллелизм 145 выигрывающая два гейма, выигрывает и роббер. Состояние роббера включает в себя одно состояние с каждой из вложенных диаграмм. При входе в композитное состояние Р!ау(лд глЬЬег (Играется роббер) обе области находятся в начальных состояниях №г ои!легаЫе (Неуязвимы).
Каждая область независимо от другой может перейти в состояние РЫлегаЫе (Уязвимы), когда соответствующая сторона выиграет гейм. Когда сторона выиграет второй гейм, произойдет переход в состояние ЬЪы гиЬЬег (Выиграли роббер). Этот переход завершает выполнение обеих параллельных областей, потому что они являются частями одного и того же композитного состояния Р(ау(лК пгЬЬег и активными могут быть только тогда, когда активно это композитное состояние.
Рис. 6.8. Диаграмма игры в бридж с параллельными состояниями Большинство языков программирования не имеют внутренней поддержки параллелизма. Для реализации этой концепции вы можете использовать библиотеки, примитивы операционной системы или СУБД. В процессе анализа все объекты должны рассматриваться как действующие параллельно. В процессе проектирования следует выбрать оптимальный вариант. Многие реализации не требуют параллельности, им оказывается вполне достаточно одного потока управления. 6.4.3. Синхронизация параллельной деятельности Иногда один объект должен участвовать в двух и более видах деятельности параллельно.
Объект не синхронизирует внутренние этапы этих видов деятельности, но должен завершить оба вида деятельности перед тем, как он перейдет в следующее состояние. Например, банкомат должен выдать и наличные, и карту пользователя после завершения транзакции. Банкомат не должен возвращаться в состояние бездействия до тех пор, пока пользователь не заберет карту и деньги, причем пользователь может взять их в произвольном порядке или даже одновременно. Порядок не имеет значения, важно только завершение обоих видов деятельности. Это пример разделения управления на параллельные потоки с последующим слиянием.
На рис. 6.9 показана диаграмма состояний для параллельной деятельности. Количество состояний, которые могут быть активными одновременно, зависит от 146 Глава б ° Углубленное моделирование состояний конкретных событий и в нашем примере может меняться от одного до двух.
В языке ()МЕ параллельные виды деятельности в рамках одного состояния обозначаются разделением этого состояния на области при помощи пунктирных линий. Каждая область — это вложенная диаграмма, описывающая один из параллельных видов деятельности в рамках композитной деятельности. Композитная деятельность включает ровно одно состояние из каждой поддиаграммы.
Рис. 6.9. Синхронизация управления Развилка перехода означает разделение управления на параллельные части. Небольшая жирная полоса с одной входящей стрелкой и двумя исходящими используется для обозначения развилки. Около входящей стрелки указывается событие и необязательное сторожевое условие. Около исходящих стрелок пометок быть не должно. Каждая исходящая стрелка должна быть направлена на состояние из своей собственной поддиаграммы. В нашем примере переход по событию геас(у (готово) разделяется на две параллельные части, по одной на каждую из параллельных поддиаграмм. Когда этот переход запускается, два параллельных подсостояния становятся активными и выполняются независимо друг от друга.
Любой переход в состояние с параллельными областями активирует каждую из них. Если для какого-либо перехода не указано целевое состояние в одной из параллельных областей, эта область начинает выполняться с начального состояния по умолчанию. Поэтому в нашем примере развилку можно было и не рисовать: достаточно было нарисовать переход в состояние Елнгг1нд (Выдача), и параллельные области начали бы выполняться с начальных состояний. Слияние управления обозначается в 0МЕ явным образом при помощи перехода с одной исходящей и несколькими входящими стрелками, соединенными с небольшой жирной полосой (на рис.
6.9 ее нет). Переключающее событие и необязательное сторожевое условие ставятся около этой полосы. Обратите внимание, что переход запускается одним событием (а не несколькими, по числу стрелок). Если некоторые области композитного состояния не участвуют в слиянии, они автоматически завершаются, как только запускается переход со слиянием. Поэтому переход из одного из параллельных подсостояний в состояние за пределами композитного вызывает завершение всех остальных параллельных состояний.
Можно рассматривать это как вырожденное слияние с единственным потоком управления. Переход по завершении из внешнего композитного состояния в другое состояние неявным образом подразумевает слияние параллельных потоков управления (см. рис. 6.9). Переход по завершении запускается, когда заканчивается деятельность исходного состояния. Композитное состояние с параллельными областями 6.5. Пример модели состояний 147 считается закончившим деятельность, когда заканчивают свою деятельность все его области, то есть когда каждая из них достигает своего конечного состояния.
Все подсостояния должны завершиться прежде, чем переход по завершении будет запущен. В нашем примере завершение обоих видов деятельности приводит к тому, что оба подсостояния достигают своих конечных состояний, в результате чего запускается переход со слиянием, и активным становится состояние ЯеаЫу Го гезет (Готовность к перезапуску). Если бы мы нарисовали отдельный переход из каждого подсостояния в конечное состояние, это имело бы другой смысл: любой переход приводил бы к завершению выполнения второго подсостояния до его реального окончания. Запуск перехода со слиянием приводит к выполнению деятельности при выходе для всех областей, как для явных, так и для неявных слияний. 6.5.