Джим Арлоу, Айла Нейштадт - UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование (1037782), страница 88
Текст из файла (страница 88)
События вызоваСобытие вызова (call event) – это запрос на вызов конкретной операцииэкземпляра контекстного класса.Событие вызова – это запрос на вызов конкретной операции.Сигнатура события вызова должна быть аналогичной сигнатуре операции контекстного класса автомата. Получение события вызова – это484Глава 21.
Конечные автоматыSimpleBankAccountвнутреннее событие вызовадействиеclose()InCreditвнешнее событие вызоваdeposit(m)/ balance = balance + mусловиеwithdraw(m)[balance < m]withdraw(m)[balance >= m]RejectingWithdrawalAcceptingWithdrawalentry/ logRejectedWithdrawal()entry/ balance = balance ! mвходное действиеРис. 21.11. Внутренние и внешние события вызоватриггер на выполнение операции. Таким образом, событие вызова –вероятно, самый простой тип событий.В примере на рис.
21.11 показан фрагмент конечного автомата классаSimpleBankAccount (простой банковский счет). На данный класс наложены следующие ограничения:•баланс счетов всегда должен оставаться большим или равным нулю;•запрос на снятие денег будет отклонен, если запрашиваемая суммапревышает баланс.На рисунке показаны внутренние и внешние события вызова. Они соответствуют операциям класса SimpleBankAccount.Для события вызова может быть задана последовательность действий,в которой действия перечисляются через точку с запятой.
Они определяют семантику операции и могут использовать атрибуты и операцииконтекстного класса. Если у операции есть возвращаемый тип, событие вызова имеет возвращаемое значение этого типа.21.7.2. СигналыСигнал – это однонаправленная асинхронная связь между объектами.Сигнал – это пакет информации, асинхронно передаваемый междуобъектами. Сигнал моделируется как отмеченный стереотипом класс,содержащий в своих атрибутах информацию, которая должна быть передана (рис. 21.12). У сигнала обычно нет операций, потому что онпредназначен только для передачи информации.48521.7. События«signal»RejectedWithdrawaldate : DateaccountNumber : StringrequestedAmount : doubleavailableBalance : doubleРис. 21.12.
Сигнал – это класс, отмеченный стереотипом «signal»SimpleBankAccountclose()InCreditdeposit(m)/ balance = balance + mwithdraw(m)[balance < m]withdraw(m)[balance >= m]RejectingWithdrawalAcceptingWithdrawalentry/ logRejectedWithdrawal()entry/ balance = balance ! mпосылка сигналаRejectedWithdrawalРис. 21.13. Посылка сигналаНа рис. 21.13 представлен скорректированный конечный автомат дляSimpleBankAccount.
Теперь при отклонении запроса на снятие денег сосчета посылается сигнал. Передача сигнала обозначается выпуклымпятиугольником, внутри которого указывается имя сигнала. Такой жесинтаксис используется на диаграммах деятельностей (см. раздел 15.6,где сигналы обсуждаются более подробно).Прием сигнала обозначается вогнутым пятиугольником, как показаново фрагменте конечного автомата на рис. 21.14.
В нем указана операция контекстного класса, которая принимает сигнал как параметр.прием сигналаprocessRejectedWithdrawal( a : RejectedWithdrawal )контекст: класс BankРис. 21.14. Прием сигналаПозвонить клиенту486Глава 21. Конечные автоматыПрием сигнала также можно показать на внешних или внутренних переходах с помощью стандартной нотации имяСобытия/действие, котораяобсуждалась в разделах 21.5.1 и 21.6.21.7.3.
События измененияСобытия изменения имеют место, когда значение логического выражения меняется с false на true.Событие изменения задается в виде логического выражения, как показано на рис. 21.15. Ассоциированное с событием действие выполняется, когда логическое выражение меняет значение с false на true. Всезначения логического выражения должны быть константами, глобальными переменными или атрибутами и операциями контекстногокласса. С точки зрения реализации событие изменения означает постоянную проверку логического условия при нахождении в определенном состоянии.На рис.
21.15 конечный автомат SimpleBankAccount был изменен такимобразом, что менеджер получает уведомление, если баланс счета становится равным или большим 5000. Это уведомление необходимо длятого, чтобы менеджер мог предупредить клиента о других вариантахвклада.События изменения являются срабатывающими по положительномуфронту (positive edge triggered). Это означает, что они инициируютсяпри каждом изменении значения логического выражения с false на true.SimpleBankAccountclose()InCreditdeposit(m)/ balance = balance + mbalance >= 5000 / notifyManager()логическоевыражениеwithdraw(m)[balance < m]withdraw(m)[balance >= m]RejectingWithdrawalAcceptingWithdrawalentry/ logRejectedWithdrawal()entry/ balance = balance ! mRejectedWithdrawalРис.
21.15. Событие изменения в виде логического выражения21.8. Что мы узнали487Чтобы событие изменения было инициировано, логическое выражениедолжно вернуться к значению false, а затем снова перейти к true.Срабатывание по положительному фронту – это именно то поведение,которое требуется для класса SimpleBankAccount. Действие notifyManager()(уведомить менеджера) будет инициироваться, только когда баланссчета достигнет 5000 или превысит эту сумму. Понятно, что если баланс будет колебаться вокруг 5000, менеджер получит множество уведомлений. Мы предполагаем, что у менеджера есть некоторый бизнеспроцесс для обработки такой ситуации.21.7.4. События времениСобытия времени происходят в ответ на время.События времени обычно обозначаются ключевыми словами when (когда) и after (после).
Ключевое слово when определяет конкретное время,когда событие инициируется; after определяет порог времени, после которого событие инициируется. Например: when(date = 07/10/2005) и after(3 months).На диаграмме для каждого события времени обязательно должныбыть указаны единицы измерения времени (часы, дни, месяцы и т.
д.).Все символы выражения должны быть константами, глобальными переменными или атрибутами и операциями контекстного класса.Пример на рис. 21.16 – это фрагмент автомата класса CreditAccount,имеющего ограниченные (несколько суровые) условия получения кредита. Как видите, если объект CreditAccount находится в состоянии Overdrawn (кредит превышен) в течение трех месяцев, он переходит в состояние Frozen (заморожен).Overdrawnafter( 3 months )Frozenконтекст: класс CreditAccountРис. 21.16. Фрагмент автомата класса CreditAccount с ограничением по времени21.8.
Что мы узналиВ этой главе обсуждалось построение простых конечных автоматов с помощью состояний, действий, деятельностей, событий и переходов. Мыузнали следующее:488Глава 21. Конечные автоматы••••••Конечные автоматы основаны на работе Харела.• Конечные автоматы моделируют динамическое поведение реактивного объекта.• Диаграммы состояний содержат единственный конечный автомат одного реактивного объекта.Реактивный объект обеспечивает контекст конечного автомата.• Реактивные объекты:• отвечают на внешние события;• могут генерировать внутренние события;• имеют четкий жизненный цикл, который может быть смоделирован как последовательность состояний, переходов и событий;• имеют текущее поведение, которое может зависеть от предыдущего.• Примеры реактивных объектов:• классы (самые распространенные);• прецеденты;• подсистемы;• целые системы.Существует два типа конечных автоматов:• поведенческие автоматы:• моделируют поведение контекстного классификатора;• состояния в поведенческих автоматах могут содержать нульили более действий и деятельностей;• протокольные автоматы:• моделируют протокол контекстного классификатора;• состояния в протокольных автоматах не имеют действийи деятельностей.Действия – мгновенные и непрерываемые части работы:• могут иметь место в состоянии и быть ассоциированными с внутренним переходом;• могут иметь место вне состояния и быть ассоциированнымис внешним переходом.Деятельности – части работы, которые занимают конечный промежуток времени и могут быть прерваны:• могут иметь место только в состоянии.Состояние – семантически значимое состояние объекта.• Состояние объекта определяется:• значениями атрибутов объекта;• отношениями с другими объектами;21.8.
Что мы узнали• деятельностями, осуществляемыми объектом.Синтаксис состояния:• входное действие – осуществляется немедленно при входев состояние;• выходное действие – осуществляется немедленно при выходеиз состояния;• внутренние переходы – обусловливаются событиями, недостаточно существенными для инициации перехода в новое состояние:• событие обрабатывается внутренним переходом в рамкахсостояния;• внутренняя деятельность – часть работы, которая занимаетконечный промежуток времени и может быть прервана.Переход – перемещение между двумя состояниями.• Синтаксис перехода:• событие – событие, инициирующее переход;• сторожевое условие – логическое выражение, которое должно выполниться, чтобы переход произошел;• действие – действие, которое происходит вместе с переходом;• переходное псевдосостояние – объединяет или разветвляетпереходы;• псевдосостояние выбора – направляет поток конечного автомата согласно наложенным условиям.Событие – чтото существенное, происходящее с реактивным объектом.
Типы событий:• событие вызова:• вызов необходимого набора действий;• вызов операции объекта;• сигнал:• прием сигнала – сигнал это асинхронная однонаправленнаясвязь между объектами;• событие изменения:• имеет место, когда некоторое логическое условие меняет своезначение с false на true (т. е. ребро инициируется при переходеложьистина);• событие времени:• ключевое слово after – происходит по прошествии некоторогопромежутка времени;• ключевое слово when – происходит, когда выполняется некоторое временное условие.•••48922Дополнительные аспектыконечных автоматов22.1. План главыЭту главу мы начинаем с обсуждения составных состояний.
Это состояния, содержащие вложенный конечный автомат. В разделе 22.222.2. Составные состоянияизучаем типы составных состояний22.2.1. Простые составные состояния22.2.2. Ортогональные составные состоянияизучаем состояния подавтоматов22.3. Состояния подавтоматовизучаем взаимодействие подавтоматов22.4. Взаимодействие подавтоматовизучаем предысторию22.5.
Предыстория22.5.1. Неглубокая предыстория22.5.2. Глубокая предыстория22.6. Что мы узналиРис. 22.1. План главы49122.2. Составные состояниявводится понятие вложенных конечных автоматов, или подавтоматов.Затем обсуждаются два типа составных состояний – простое составноесостояние (22.2.1) и ортогональное составное состояние (22.2.2).