Гради Буч - Объектно-ориентированный анализ и проектирование с примерами приложений на С++ (1158635), страница 47
Текст из файла (страница 47)
Наконец, можно определить событие просто как операцию, такуюкак GardeningPlan:: execute (). Это похоже на подход, которыйтрактует события как имена, но в отличие от него здесь не требуется явногодиспетчера событий.Для нашего метода несущественно, какая из этих стратегий выбранадля разработки, если она последовательно проводится во всей системе.Обычно в замечаниях указывается, какая стратегия использована для данногоконкретного автомата.Действие можно записывать, используя синтаксис, показанный вследующих примерах:•heater.startUp() действиепроизошло событие•DeviceFailureначать некоторую деятельность•start Heating•stop Heatingпрекратить деятельность.Имена операций или событий должны быть уникальны в областивидимости диаграммы; там, где необходимо, они могут бытьквалифицированы соответствующими именами классов или объектов.
Вслучае начала или прекращения некоторой деятельности, она может бытьпредставлена операцией (такой, как Actuator::shutDown ()) илисимволическим именем (для событий). Когда деятельность соответствуетнекоторой функции системы, такой, как harvest crop (сбор урожая), мыобычно пользуемся символическими именами.На каждой диаграмме состояний и переходов должно присутствоватьровно одно стартовое состояние; оно обозначается немаркированнымпереходом в него из специального значка, изображаемого в виде закрашенногокружка. Иногда бывает нужно указать также конечное состояние (обычноавтомат, ассоциированный с классом или системой в целом, никогда недостигает конечного состояния; этот автомат просто перестает существоватьпосле того, как содержащий его объект уничтожается).
Мы обозначаемконечное состояние, рисуя немаркированный переход от него к специальномузначку, изображаемому как кружок с закрашенной серединой.Рис. 5-20. Диаграмма состояний и переходов для контроллера тепличнойсреды (EnvironmentalController)Пример. До сих пор вводились значки, описывающие существенныеэлементы диаграмм состояний и переходов. В совокупности онипредоставляют разработчику систему обозначений, достаточную длямоделирования простого конечного плоского автомата, пригодного дляописания приложений с ограниченным числом состояний. Системы, имеющиемного состояний или обладающие сильно запутанным событийнымповедением, которое описывается переходами по условию или в результатепредыдущих состояний, требуют для построения диаграмм переходов болеесложных понятий.На рис.
5-20 показан пример использования существенныхобозначений. Пример опять описывает гидропонную систему. Мы видимдиаграмму состояний и переходов для класса EnvironmentalController,впервые введенного на рис. 5-5.На этой диаграмме все события представляются символическимиименами. Мы видим, что все объекты этого класса начинают свою жизнь вначальном состоянии Idle (ожидание); затем они изменяют свое состояние пособытию Define climate, для которого не предполагается явных действий(считается, что это событие, то есть ввод климатического задания, происходиттолько в дневное время). Дальше динамическое поведение этого классасостоит в переключении между со-стояниями Daytime и Nighttime (день иночь); оно определяется событиями Sunrise и Sunset (восход и закат)соответственно; с этими событиями связаны действия по изменениюосвещения.
В обоих состояниях событие понижения или повышениятемпературы в теплице вызывает обратную реакцию (операцияadjustTemperature(), которая является локальной в этом классе). Мывозвращаемся в состояние Idle, когда поступит событие Terminateclimate, то есть будет отменено климатическое задание.Дополнительные понятияЭлементы диаграмм состояний и переходов, которые мы только чтоописали, недостаточны для многих случаев сложных систем. По этой причинемы расширим наши обозначения, включив семантику карт состояний,предложенную Харелом.Рис. 5-21.
Действия, условные переходы и вложенные состоянияДействия, ассоциированные с состояниями и условные переходы.Как показано на рис. 5-18, с состояниями могут быть ассоциированы действия.В частности, можно назначить выполнение некоторого действия на входе иливыходе из состояния, при этом используется синтаксис следующих примеров:•entry start Alarmзапуск процедуры при входе в состояниевызов операции при выходе из•exit shutDown()состояния.Как и для переходов, можно назначить любое действие послеключевых слов entry и exit(вход и выход).Деятельность можно ассоциировать с состоянием, используясинтаксис следующего примера:•do Coolingв данном состоянии заниматься этойдеятельностью.Этот синтаксис служит сокращенной записью явных указаний:"Начать деятельность при входе в состояние и окончить при выходе из него".На рис.
5-21 мы видим пример использования этих обозначений. Привходе в состояние Heating (нагревание) вызывается операцияHeater::startUp(), а при выходе - операция Heater::shutDown(), то естьпроисходит запуск и остановка нагревания. При входе и выходе из состоянияFailure (сбой), соответственно вызывается и прекращается сигнал тревоги(Alarm).Рассмотрим также переход из состояния Idle в состояние Heating.Он совершается, если температура понизилась, но только в случае, еслипрошло больше пяти минут после того, как последний раз был выключеннагреватель. Это пример условного (или защищенного) перехода; условиепредставляется логическим выражением в скобках.Вообще, каждый переход может быть ассоциирован либо с событием,либо с событием и условием.
Допускаются и "переходы без события". В этомслучае переход совершается сразу после завершения действия, связанного ссостоянием, причем выполняется и действие, связанное с выходом из этогосостояния. Если переход условный, он состоится только в случае, еслиусловие выполнено.Имеет значение порядок выполнения условного перехода. Пустьимеется состояние S, из которого при событии Е совершается переход T сусловием C и действием А. Переход T осуществляется в такойпоследовательности:•Происходит событие Е.•Проверяется условие C.•Если C удовлетворено, то выполняется переход T и действие А.Это означает, что если условие C не выполнено, то переход не можетбыть осуществлен до тех пор, пока событие Е не произойдет еще раз и условиеC не будет проверено еще раз.
Побочные эффекты при вычислении условияили выполнении действия, назначенного на выход, не могут отменитьпереход. Например, предположим, что произошло событие Е, условие Cвыполнилось, но действие А, выполняемое при выходе из состояния S,изменило ситуацию так, что условие C перестало выполняться: переход T всеравно состоялся.Мы можем использовать еще и следующий синтаксис:•in Coolingвыражение для текущего состояния.Здесь используется имя состояния (которое может бытьквалифицированным).
Выражение истинно тогда и только тогда, когдасистема находится в указанном состоянии. Такие условия особенно полезны,когда некоторому внешнему состоянию нужно запустить переход по условию,связанному с некоторым вложенным состоянием.Можно использовать в условии и выражение, налагающее ограниченияпо времени:•timeout (Heat ing, 30) выражение ограничения по времени.Это условие выполняется, если система более 30 секунд находилась всостоянии Heating и остается в нем в момент проверки. Этот тип условияупотребляется в системах реального времени для "переходов без события", таккак защищает систему от зависания на долгое время в одном состоянии. Этовыражение можно использовать для указания нижней границы временинахождения в данном состоянии.
Если приложить временное ограничение ккаждому переходу с событием, выводящим из данного состояния, это будетравнозначно требованию, что система находится в каждом состоянии какминимум время, указанное в ограничении.12Что случится, если некое событие произойдет, а перейти в другоесостояние нельзя либо потому, что не существует перехода для данногособытия, либо не выполняется условие перехода? По умолчанию это надосчитать ошибкой: игнорирование событий обычно является признакомнеполного анализа задачи.
Вообще, для каждого состояния нужнодокументировать события, которые оно намеренно игнорирует.Вложенные состояния. Возможность вложения состояний друг вдруга придает глубину диаграммам переходов; эта ключевая особенность картсостояний Харела предотвращает комбинаторный взрыв в структуресостояний и переходов, который часто случается в сложных системах.На рис. 5-21 показаны внутренние детали состояния Cooling, то естьвложенные в него состояния; для простоты мы опустили все его действия,включая действия при входе и выходе.12Харел предложил "обобщенную завитушку" для обозначения двухсторонних границпо времени, но мы не будем обсуждать здесь его обобщения, так как условияисчерпания времени достаточно выразительны.Объемлющие состояния, такие, как Cooling, называютсясуперсостояниями, а вложенные, такие, как Running, - подсостояниями.Вложенность может достигать любой глубины, то есть подсостояние можетбыть суперсостоянием для вложенных состояний более низкого уровня.Данное суперсостояние Cooling содержит три подсостояния.