Управляющие объекты, зависящие от состояния Поведение управляющего объекта, зависящего от состояния, различно в каждом из возможных состояний. Для определения такого объекта применяется конечный автомат, и графически он изображается на диаграмме состояний. В этом разделе мы лишь слегка коснемся управляющих объектов, зависящих от состояния. Управляющий объект, зависящий от состояния, получает входные события, которые вызывают переходы между состояниями, и генерирует выходные события, управляющие работой других объектов. Выходное событие зависит не только от входного, но и от текущего состояния объекта. Примером управляющего объекта, зависящего от состояния, служит объект Управление Банкоматом (рис. 12), определяемый с помощью диаграммы состояний. Из рисунка видно, что этот объект управляет двумя объектами интерфейса устройства Интерфейсом Устройства Печати Чеков и Интерфейсом Устройства Выдачи Наличных. рис 12 Объекты прикладной логики Объекты бизнес-логики Они определяют логику обработки приложением запросов клиентов. Их назначение заключается в инкапсуляции бизнес-правил, которые могут изменяться независимо друг от друга. Пример объекта бизнес-логики - Менеджер Транзакций Снятия - приведен на рис. 11. Он обслуживает запросы клиентов на снятие денег. Например, первое бизнес-правило может состоять в том, что после снятия на счету клиента должно остаться не менее 50 долларов. Второе правило гласит, что по дебетовой карточке клиент не имеет права снимать более 250 долларов в день. Менеджер Транзакций Снятия обращается к объекту Счет, чтобы удостовериться в выполнении условий первого правила. Для проверки второго правила он запрашивает объект Дебетовая Карточка, который хранит накопительный итог сумм, снятых клиентом банкомата в течение дня. Если хотя бы одно правило не выполняется, запрос на снятие денег отклоняется. Для выполнения бизнес-правил объект бизнес-логики обычно должен взаимодействовать с сущностными объектами. В этом отношении он напоминает объект-координатор. Однако, если в обязанности координатора входит управление работой других объектов, объект бизнес-логики отвечает, прежде всего, за выполнение бизнес-правил. Объекты-алгоритмы Объект-алгоритм инкапсулирует алгоритм, применяемый в данной предметной области. Такие объекты чаще всего встречаются в приложениях реального времени, а также научных и инженерных задачах в тех случаях, когда в предметной области имеется нетривиальный алгоритм, который может изменяться независимо от других ее аспектов. Простые алгоритмы обычно реализуются как операции сущностного объекта, работающие с хранящимися в нем данными. Во многих научных и инженерных приложениях алгоритмы уточняются итеративно, поскольку их совершенствование, например с точки зрения производительности и точности вычислений, не зависит от данных. 1 Объект-алгоритм часто инкапсулирует данные, необходимые для выполнения алгоритма. Это могут быть начальная информация, промежуточные результаты или пороговые данные, например максимальные и минимальные значения. Объект-алгоритм обычно взаимодействует с другими объектами. В этом отношении он напоминает объект-координатор. Но в отличие от координатора, который должен управлять другими объектами, назначение объекта-алгоритма состоит, прежде всего, в инкапсуляции и выполнении алгоритма. Подсистемы Система разбивается на подсистемы, которые содержат объекты, функционально зависящие друг от друга. Смысл разбиения заключается в том, чтобы сильно связанные между собой объекты поместить в одну подсистему, а слабо связанные оставить в разных. Подсистема это составной или агрегатный объект, содержащий простые объекты. Может быть несколько подсистем одного и того же типа Для изображения всей системы и разбиения ее на подсистемы мы будем использовать пакеты. Пакеты для изображения подсистем Для представления подсистем разрешается задействовать пакеты. Так, в одном пакете можно показать всю систему, разбитую на подсистемы, каждая из которых изображается в виде вложенного пакета. В примере на рис.15 банковская система представляет собой один пакет, состоящий их двух подсистем: Подсистема Банкомата и Подсистема Банковского Сервера. Обе подсистемы показаны в виде пакетов, вложенных в пакет, который описывает систему в целом. Допустимо также показать отношения между пакетами, в частности описать зависимости пакетов друг от друга. На диаграмме пакетов зависимости изображаются пунктирными линиями. рис 15 На рисунке показана декомпозиция банковской системы на подсистемы, которые изображены в виде агрегатных классов. Между посистемой Банковского Сервера и Подсистемой Банкомата существует ассоциация один-ко-многим. Все внешние классы взаимодействуют только с Подсистемой Банкомата и связаны с ней ассоциацией один-к-одному. 2 Конечные автоматы и диаграммы состояний Конечные автоматы используются для моделирования динамических аспектов системы. Многие системы и, в частности, системы реального времени очень сильно зависят от состояния. Это означает, что их работа определяется не только поступающими на вход данными, но и тем, что происходило с системой раньше. Для описания конечных автоматов применяются диаграммы и таблицы перехода состояний. Диаграмма перехода состояний - это представление конечного автомата в виде графа, вершины которого соответствуют состояниям, а ребра - переходам между ними. Таблица переходов состояний - это табличное представление конечного автомата. В системах с высокой степенью зависимости от состояния диаграммы или таблицы переходов состояний могут оказаться очень полезными для понимания функционирования системы. Такая спецификация конечного автомата зачастую более точна и понятна, чем словесное описание. В нотации UML диаграмму перехода состояний называют просто диаграммой состояний (statechart diagram). Конечные автоматы Конечный автомат - это автомат с конечным числом состояний. В любой момент времени он находится только в одном состоянии. Переход состояний – это изменение текущего состояния, вызванное внешним событием. В ответ на поступившее событие автомат может перейти в новое состояние или остаться в прежнем. То, в какое состояние перейдет автомат, зависит как от текущего состояния, так и от события. Побочным результатом перехода в новое состояние иногда бывает выполнение некоторого действия. События и состояния Прежде чем приводить примеры диаграмм состояний, расскажем об основных концепциях события и состояния. События Событие (его также называют дискретным сигналом или стимулом) - это некоторое явление, происходящее в определенный момент времени. Событие атомарно (то есть не прерываемо) и концептуально имеет нулевую продолжительность. Примеры событий: Карточка Вставлена в Банкомат, Введен ПИН-код, Нажат Тормоз, Лифт Уехал. События могут зависеть друг от друга. Например, событие Карточка Вставлена в Банкомат всегда предшествует событию Введен ПИН-код. С другой стороны, события бывают и совершенно независимыми. Например, событие Карточка Вставлена в Банкомат в Вене не зависит от события Карточка Вставлена в Банкомат в Ричмонде. Событие таймера - это особое событие, описываемое ключевым словом after, которое говорит, что событие происходит по истечении промежутка времени, заданного выражением в скобках, например: after ( 1 0 с ) или after {промежуток времени). На диаграмме состояний событие таймера вызывает выход из данного состояния. Промежуток времени измеряется от момента входа в состояние до момента выхода из него, обусловленного событием таймера. СОСТОЯНИЯ Состояние описывает некоторую конкретную ситуацию, характеризуемую протяженностью во времени. Наступление события обычно приводит к переходу конечного автомата из одного состояния в другое. Но событие может и не иметь никаких последствий, то есть после его наступления автомат останется в прежнем состоянии. Теоретически переход в новое состояние занимает нулевое время. На практике время, необходимое для перехода в новое состояние, пренебрежимо мало по сравнению со временем, проведенным в данном состоянии. Начальное состояние - это то состояние, в котором оказывается диаграмма состояний сразу после активизации. Конечные автоматы и объекты Хотя с помощью конечных автоматов можно построить модель всей системы, в объектноориентированном анализе и проектировании конечный автомат инкапсулируется в некотором объекте. Другими словами, этот объект зависит от состояния и всегда находится в одном из 3 состояний, определенных конечным автоматом. Конечный автомат объекта изображается в виде диаграммы состоянии. В объектно-ориентированной модели зависящие от состояния аспекты системы описываются одним или несколькими конечными автоматами, каждый из которых инкапсулирован в отдельный объект. Взаимодействие конечных автоматов опосредованно, путем обмена сообщениями между содержащими их объектами. Условия, или переменная состояния, определяет некий аспект системы, который способен оставаться истинным или ложным на протяжении конечного промежутка времени. Т. о., оно представляется значением булевской переменной. Например, допустимо определить условие торможения, принимающее два значения: Нажат Тормоз или Тормоз Отпущен. Первоначальное условие принимает значение Торможения Нет. Когда происходит событие Нажат Тормоз, означающее, что водитель поставил ногу на педаль тормоза, условие изменяется на Торможение Есть. При возникновении события Тормоз Отпущен условие вновь принимает значение Торможения Нет. Событие занимает пренебрежимо малое время, но условие сохраняет значение в течение конечного промежутка времени. Примеры диаграмм состояний Использование плоских диаграмм состояний показано на двух примерах: диаграмма состояний счета, диаграмма состояний банкомата. Пример диаграммы состояний счета В первом примере показана простая диаграмма из двух состояний: начального и конечного (рис. 1). Когда открывается счет с положительным балансом, событие Счет Открыт вызывает переход в начальное состояние Счет Хороший. Последующие события Вклад и Обычное Снятие Денег не изменяют состояния при условии, что баланс счета остается положительным. Однако событие Разрешенное снятие Денег, приводящее к отрицательному балансу, вызывает переход в состояние Превышены Расходы по Счету. В этом состоянии могут произойти другие события Разрешенное Снятие Денег. Последующее событие Долг Погашен вызывает обратный переход в состояние Счет Хороший. Наконец, при закрытии счета производится переход в конечное состояние, изображаемое в виде закрашенного круга внутри незакрашенного («бычий глаз»). рис 1 Пример диаграммы состояний банкомата Рассмотрим показанный на рис. 2 пример диаграммы состояний банкомата. Начальное состояние для нее - Простаивает. При получении события Карточка вставлена банкомат переходит в состояние Ожидание ПИН-кода, в котором ждет, пока клиент введет ПИН-код. При получении события ПИН-код Введен банкомат переходит в состояние Проверка ПИН-кода, в котором выясняет, совпадает ли веденный клиентом ПИН-код с тем, что хранится в базе данных банковского сервера. Из состояния Проверка ПИН-кода возможно четыре перехода. Если ПИН-коды совпадают, осуществляется переход по ветке Правильный ПИН-код в состояние Ожидание Выбора Клиента. Если ПИН-коды не совпадают, то по ветке Неправильный ПИН-код осуществляется возврат в состояние Ожидание ПИН-кода, и система предлагает клиенту повторить ввод. Если и после третьей попытки клиент указывает неправильный код, то совершается переход Три Неудачи в состояние Конфискация. Туда же мы попадаем, если 4 карточка оказалась утерянной или украденной. Кроме того, клиент может нажать клавишу отмены, после чего карточка будет возвращена, а транзакция прервана. рис 2 В состоянии Ожидание Выбора Клиента клиент может выбрать нужную операцию, например снятие денег. Диаграмма состояний получает событие Выбрано Снятие Денег и переходит в состояние Обработка Запроса на Снятие. Если снятие разрешено, то диаграмма оказывается в состоянии Выдача Наличных. После получения события Наличные Выданы банкомат переходит в состояние Печать, в котором печатается чек, а затем в состояние Возврат. После возврата карточки, о чем сигнализирует событие Карточка Возвращена, мы попадаем в состояние Завершение. Из состояния Завершение производится переход в начальное состояние Простаивает после получения события таймера. Событие таймера обозначается After (Промежуток Времени, где Промежуток Времени - это продолжительность нахождения в состоянии Завершение (от момента входа в это состояние Д момента выхода, вызванного событием таймера). Действия С переходом состояний может быть ассоциировано действие. Действие – это некоторое вычисление, осуществляемое в результате перехода в новое состояние. Действие инициируется переходом. Оно производится, а затем заканчивается. Действие выполняется мгновенно в момент перехода, то есть концептуально, продолжительность равна нулю. На практике время, затрачиваемое на выполнение действия, очень мало по сравнению с длительностью пребывания автомата в некотором состоянии. На диаграмме состояний действие изображается путем пометки перехода следующим образом: событие [условие] / действие. Например, когда банкомат переходит из состояния Ожидание ПИН-кода в состояние Проверка ПИН-кода в результате события ПИН-код Введен, выполняется действие Проверить ПИН-код. Этот переход помечен так: ПИН-код введен / Проверить ПИН-код. Данный пример показан на рис. 3, содержащем частичную диаграмму состояния банкомата (см. рис. 2) с добавленными действиями. С переходом может быть ассоциировано несколько действий. Эти действия выполняются одновременно, следовательно, между ними не должно быть никаких зависимостей. Например, было бы неправильно включать два одновременных действия: Рассчитать Изменение и Показать 5 Изменение. В таком случае имеется подчиненность одного действия другому, поскольку нельзя показать изменение до того, как оно рассчитано. Для решения данной проблемы введите промежуточное состояние Расчет Изменения. Действие Рассчитать Изменение выполняется при в это состояние, а действие Показать Изменение - при выходе из него. рис 3 Деятельности Помимо действий в результате перехода состояния могут выполняться деятельности. Деятельность (activities) - это некоторое вычисление, выполняемое, пока автомат находится в данном состоянии. В отличие от действия, деятельность занимает конечное время. Деятельность начинается при входе в состояние и заканчивается при входе из него. Причина изменения состояния, приводящего к прекращению деятельности, обычно состоит в приходе некоторого события из источника, не связанного с деятельностью. Однако иногда сама деятельность возбуждает событие, приводящее к изменению состояния. Один из способов показать деятельность на диаграмме состояний - пометить переход в состояние, где она протекает: событие / enable деятельность, а также переход из этого состояния: событие / disable деятельность. Однако, чтобы сократить запись, можно вместо слов enable и disable ассоциировать деятельность с самим состоянием. Для этого в прямоугольнике, представляющем состояние, записывают имя состояния и имя деятельности, разделяя их горизонтальной чертой. Деятельность изображают в виде do / деятельность (здесь do - зарезервированное слово). Это означает, что деятельность начинается при входе в состояние и завершается при выходе из него. Действия при входе и выходе Некоторые действия можно записать более кратко, если ассоциировать их с самим состоянием, а не с переходом. Это так называемые действия при входе и при выходе, для которых зарезервированы слова entry и exit. Мгновенное действие, выполняемое при входе в состояние, обозначается как entry / действие, а мгновенное действие, выполняемое при выходе из него, - как exit / действие. Обычно в действиях при входе и выходе нужды не возникает, вместо этого помечаются переходы в данное состояние и из него. Лучше всего применять действие при входе, когда: есть несколько переходов в данное состояние; при каждом переходе нужно выполнить одно и то же действие; действие связано именно с входом в данное состояние, а не с выходом предыдущего. В этой ситуации действие изображается только в прямоугольнике состояния а не на каждом ведущем в него переходе. Действие при выходе удобно в случаях, когда: 6 есть несколько переходов из данного состояния; при каждом переходе требуется одно и то же действие; действие связано именно с входом из данного состояния, а не с входом в следующее. Иерархические диаграммы состояний Одним из недостатков плоских диаграмм состояний является чрезмерно большое число состояний и переходов, в результате диаграммы становятся громоздкими и их трудно читать. Применение условий, действий при входе и выходе и деятельностей позволяет сделать диаграмму менее громоздкой, но этого часто недостаточно. Принципиально иной способ упростить диаграммы и одновременно повысить степень их выразительности связан с введением в рассмотрение надсостояний и иерархической декомпозиции диаграмм. При таком подходе надсостояние на некотором уровне диаграммы раскладывается на несколько подсостояний, принадлежащих более низким уровням. Цель иерархических диаграмм состоит в том, чтобы воспользоваться основными идеями и визуальными преимуществами, которые дают плоские диаграммы, но в то же время избавиться от присущих им недостатков. Следует отметить, что любой иерархической диаграмме можно поставить в соответствие плоскую, поэтому семантически те и другие эквивалентны. Иерархическая декомпозиция состояний Существенного упрощения диаграмм состояний можно достичь за счет использования иерархической декомпозиции состояний, когда надсостояние раскладывается на одно или несколько взаимосвязанных 7 подсостояний. Иногда такую операцию называют декомпозицией ИЛИ, так как пребывание в некотором надсостоянии означает, что диаграмма находится в одном и только одном из его подсостояний. Нотация позволяет показать надсостояние и подсостояния на одной или нескольких диаграммах в зависимости от уровня сложности. Пример иерархической декомпозиции состояния приведен на рис. 4. Здесь надсостояние Обработка Ввода Клиента состоит из подсостояний Ожидание ПИН-кода, Проверка ПИН-кода и Ожидание Выбора Клиента. (В иерархически диаграмме надсостояние изображается в виде внешнего прямоугольника закругленными углами, в левом верхнем углу которого записывается имя надостояния. Подсостояния изображаются внутренними прямоугольниками с закругленными углами.) Когда система оказывается в надсостоянии Обработка вода Клиента, она находится в одном и только одном из подсостояний Ожидание ПИН-кода, Проверка ПИН-кода или Ожидание Выбора Клиента. Отсюда и термин «декомпозиция ИЛИ». Отметим, что каждый переход в надсостояние Обработка Ввода Клиента - это переход в одно и только одно подсостояние диаграммы нижнего уровня. Любой выход из надсостояния - это выход из какого-то его подсостояния. Так, вход-событие Карточка Вставлена вызывает переход в подсостояние Ожидание ПИН-Кода, внутреннего для надсостояния Обработка Ввода Клиента. рис 4 Параллельные диаграммы состояний Поддерживается также еще один вид иерархических диаграмм состояний декомпозиция И, позволяющая разложить одно состояние на два или более параллельных подсостояний. Два параллельных подсостояния отделяются друг от друга пунктирной линией. Рассмотрим случай надсостояния на диаграмме, разложенной на две параллельные диаграммы более низкого уровня. Когда диаграмма верхнего уровня находится в надсостоянии, она одновременно находится в некотором подсостояний первой диаграммы нижнего уровня и в некотором подсостояний второй диаграммы нижнего уровня. Название «параллельные диаграммы» наводит на мысль о том, что в объекте, описываемом диаграммой состояний, протекает некая параллельная деятельность, но это необязательно: декомпозиция И удобна для показа различных аспектов одного объекта, которые 8 могут и не быть параллельными. Для обозначения параллельной диаграммы, на которой изображены состояния, относящиеся к различным сторонам функционирования объекта, применяется термин ортогональная диаграмма состояний. Проектирование объектов с одним потоком управления проще, для отражения параллелизма следует использовать несколько параллельно исполняемых объектов. Поэтому нотация параллельных диаграмм рекомендуется для изображения ортогональных диаграмм, показывающих различные аспекты объекта, но не параллелизм внутри него. Если же необходимо отразить именно параллелизм, удобнее взять два отдельных объекта и для каждого определить собственную диаграмму состояний. Ортогональными диаграммами состояний можно воспользоваться в примере банкомата для изображения условий. Это показано на рис. 5, где диаграмма Управление Банкоматом разложена на две ортогональные диаграммы: Обработка и Условие Запроса на Останов. Обе диаграммы изображены внутри диаграммы верхнего уровня и разделены пунктирной линией. рис 5 Отметим, что в любой момент времени надсостояние Управление Банкоматом находится ровно в одном из подсостояний диаграммы Обработка и в одном из подсостояний диаграммы Условие Запроса на Останов. Условие Запроса на Останов - это простая диаграмма всего с двумя состояниями, показывающими, имел место запрос на останов банкомата или нет. При этом начальным в ней является состояние Останов Не Запрошен. Событие Останов вызывает переход в состояние Останов Запрошен, а событие Запуск - переход в состояние Останов Не Запрошен. На диаграмме Обработка (см. рис. 4) изображены состояния, через которые проходит банкомат, выполняя обработку запроса клиента. Диаграмма Управление Банкоматом объединяет диаграммы Обработка и Условие Запроса на Останов. Отсюда термин «декомпозиция И». 9