Джим Арлоу, Айла Нейштадт - UML 2 и Унифицированный процесс. Практический объектно-ориентированный анализ и проектирование (1037782), страница 87
Текст из файла (страница 87)
В сущности, автомат этого класса совсем неинтересен, поскольку все возможные состояния могут быть смоделированы однимединственным состоянием.То есть предпосылкой моделирования в виде автомата должно бытьналичие семантики «отличия, которое различает» состояния. Конечные автоматы должны повышать ценность модели. Примеры такихавтоматов будут даны в этой и следующей главах.21.5.1. Синтаксис состоянияUMLсинтаксис состояния представлен на рис. 21.4.Каждое состояние поведенческого автомата может содержать нульили более действий и деятельностей.
У состояний протокольных автоматов нет действий или деятельностей.Действия являются мгновенными и непрерывными.Действия считаются мгновенными и непрерываемыми, тогда как деятельности занимают конечное время и могут быть прерваны. Каждоедействие в состоянии ассоциируется с внутренним переходом, инициируемым событием. В состоянии может быть любое число действийи внутренних переходов.Внутренний переход позволяет зафиксировать тот факт, что произошло чтото, заслуживающее отражения в модели, но не обуславливаю47921.6. Переходыимя состояниявходное и выходноедействиявнутренниепереходывнутренняядеятельностьEnteringPasswordentry/ показать диалог для ввода пароляexit/ проверить парольkeypress/ отобразить “*”help/ вывести подсказкуdo/ принять парольсинтаксис действия: имяСобытия/некотороеДействиесинтаксис деятельности: do/некотораяДеятельностьРис. 21.4.
Синтаксис состояниящее (или не настолько важное, чтобы моделировать это как) переходв новое состояние. Например, на рис. 21.4 нажатие одной из клавишклавиатуры, конечно, является заслуживающим внимания событием,но оно не приводит к переходу из состояния EnteringPassword (ввод пароля). Мы моделируем это как внутреннее событие keypress (нажатие клавиши), которое обусловливает внутренний переход, инициирующийдействие отобразить “*“.Два специальных действия – вход и выход – ассоциированы со специальными событиями entry и exit.
У этих двух событий особая семантика. Событие entry происходит мгновенно и автоматически при входев состояние. Это первое, что происходит, когда осуществляется входв состояние. Это событие обусловливает выполнение ассоциированного с ним действия на входе. Событие exit – самое последнее, что происходит мгновенно и автоматически при выходе из состояния.
Обусловливает выполнение ассоциированного действия на выходе.Деятельности длятся конечный промежуток времени и могут быть прерваны.Деятельности, с другой стороны, длятся конечный промежуток времени и могут быть прерваны по получении события. Деятельность обозначается ключевым словом do (делать). В отличие от действий, которые всегда завершаются, потому что они атомарны, деятельность можно прервать до того, как завершилось ее выполнение.21.6. ПереходыUMLсинтаксис переходов для поведенческих автоматов представленна рис.
21.5.Переходы показывают движение между состояниями.480Глава 21. Конечные автоматыПоведенческий автоматсобытие1, событие2 [сторожевоеУсловие]/ действиеABРис. 21.5. Синтаксис переходов для поведенческих автоматовСинтаксис переходов в поведенческом автомате прост и может использоваться для внешних переходов (изображаются стрелками) или внутренних переходов (изображаются вложенными в состояние). Каждыйпереход имеет три необязательных элемента.1.
Нуль или более событий – определяют внешнее или внутреннеепроисшествие, которое может инициировать переход.2. Нуль или одно сторожевое условие – логическое выражение, которое должно быть выполнено (иметь значение true), прежде чем может произойти переход. Условие указывают после событий.3. Нуль или более действий – часть работы, ассоциированная с переходом и выполняемая при срабатывании перехода.Рисунок 21.5 можно прочитать так: «При возникновении (события1ИЛИ события2), если (сторожевоеУсловие является истинным), выполнитьдействие и немедленно перейти в состояние B».В действиях могут использоваться переменные, область действия которых – конечный автомат.
Например:actionPerformed( actionEvent )/ command = actionEvent.getActionCommand()В приведенном примере actionPerformed( actionEvent ) – событие, генерируемое нажатием кнопки в Java GUI. При получении этого событиявыполняется действие по сохранению имени кнопки в переменнойcommand.Синтаксис переходов протокольных автоматов немного другой, какпоказано на рис. 21.6.Протокольный автомат {protocol}[предусловие] событие1, событие2/ [постусловие]CDРис. 21.6. Синтаксис переходов для протокольных автоматов48121.6.
Переходы•Здесь нет действия, поскольку задается протокол, а не реализация.•Сторожевое условие заменено предусловиями и постусловиями. Обратите внимание, что предусловие указывается перед событиями,а постусловие – после слэша.Как в поведенческих, так и в протокольных автоматах переход, осуществляемый без события, называют автоматическим переходом (auto+matic transition). Автоматический переход не ожидает события и срабатывает при выполнении его сторожевого условия или предусловия.21.6.1.
Соединение переходов – переходноепсевдосостояниеПереходные псевдосостояния объединяют или разветвляют переходы.Переходы могут быть соединены переходными псевдосостояниями(junction pseudo+states). Это точки слияния или ветвления переходов.Они изображаются в виде закрашенных кружков с одним или болеевходными переходами и одним или более исходящими переходами.Пример на рис. 21.7 показывает конечный автомат для класса Loan,который был представлен в разделе 18.12.2. Loan моделирует получение книги в библиотеке. Конечный автомат Loan имеет простой узелслияния.
Это наиболее распространенное использование переходныхпсевдосостояний.У переходного псевдосостояния может быть несколько выходных переходов. В этом случае каждый исходящий переход должен быть защищен взаимоисключающим сторожевым условием, обеспечивающим возможность срабатывания только одного перехода. Примерпредставлен на рис. 21.8. Здесь конечный автомат для класса Loan былрасширен, чтобы обработать случай, когда выдача книги может бытьпродлена. Бизнесправило состоит в том, что для продления срока возврата выданная книга должна быть предъявлена библиотеке.
Такимобразом, события returnBook попрежнему действительны.Loanпростой узел слиянияOnLoanreturnBookpayFine[after maximumDuration]OverdueTerminatedreturnBookFineDueРис. 21.7. Конечный автомат класса Loan имеет простой узел слияния482Глава 21. Конечные автоматыLoan[extend]OnLoanreturnBookTerminated[!extend]узел слиянияи ветвления[after maximumDuration]OverduepayFinereturnBookFineDueРис. 21.8. Конечный автомат класса Loan имеет узел слияния и ветвления21.6.2.
Ветвление переходов – псевдосостояние выбораДля представления простого ветвления без слияния необходимо использовать псевдосостояние выбора (choice pseudo+state), как показанона рис. 21.9.Псевдосостояние выбора направляет поток конечного автомата согласно заданным условиям.Псевдосостояние выбора позволяет направлять поток конечного автомата согласно условиям, заданным для исходящих переходов.
НаприBankLoanUnpaidacceptPaymentпсевдосостояние выбора[payment > balance][payment < balance][payment = balance]OverPaidmakeRefundFullyPaidPartiallyPaidacceptPaymentРис. 21.9. Реализация ветвления без слияния с помощью псевдосостояниявыбора48321.7. Событиямер, на рис. 21.9 показан поведенческий автомат простого класса BankLoan (банковская ссуда). При получении события acceptPayment (принятплатеж) объект BankLoan переходит из состояния Unpaid (не оплачен)в одно из трех состояний – FullyPaid (полностью оплачен), OverPaid (переплачен) или PartiallyPaid (частично оплачен) – в зависимости от соотношения объема платежа (payment) и неоплаченного баланса BankLoan.Условия, налагаемые на исходящие переходы псевдосостояния выбора, должны быть взаимоисключающими, чтобы гарантировать в любой момент времени срабатывание только одного из них.21.7.
СобытияСобытия инициируют переходы.UML определяет событие как «описание заслуживающего вниманияпроисшествия, занимающего определенное положение во времении пространстве». События инициируют переходы в автоматах. Событиямогут быть указаны вне состояний на переходах, как на рис. 21.10, иливнутри состояний, как на рис. 21.11.OffturnOffturnOnсобытиеOnРис. 21.10. События указаны вне состояний на переходахСуществует четыре семантически различных типа событий:• событие вызова;• сигнал;• событие изменения;• событие времени.21.7.1.