конечные автоматы

advertisement
Технология разработки
программного обеспечения
Конечные автоматы
Введение
• В системах сильно зависимых от состояний
машины конечных состояний (конечные
автоматы) могут существенно помочь понять
логику их работы.
• На языке UML диаграмма смены состояний
называется диаграммой машины состояний.
• В UML диаграмма машины состояний (state
machine diagram) основывается на конечных
автоматах Харлея.
Определение конечного автомата
• Конечный автомат – это система, имеющая конечное
число состояний.
• В любой момент времени автомат находится только в
одном состоянии.
• Переход состояний - это изменение текущего
состояния, вызванное внешним событием.
• В ответ на поступившее событие автомат может
перейти в новое состояние или остаться в прежнем.
• То, в какое состояние перейдет автомат, зависит
как от текущего состояния, так и от события.
• Побочным результатом перехода в новое состояние
иногда является выполнение некоторого действия.
Типы диаграмм состояний
• Традиционная диаграмма смены состояний,
которая не является иерархической,
называется плоской диаграммой состояний
(flat statechart).
• Термин иерархическая диаграмма состояний
(hierarchical statechart) используется для
обозначения понятия иерархической
декомпозиции состояний.
События
• Событие (его также называют дискретным
сигналом или стимулом) - это некоторое явление,
происходящее в определенный момент времени.
• События являются атомарными (то есть не
прерываемыми) и концептуально имеют нулевую
продолжительность.
– Примеры событий:
•
•
•
•
«Карточка Вставлена в Банкомат»,
«Введен ПИН-код»,
«Нажат Тормоз»,
«Лифт Уехал».
• События могут зависеть друг от друга.
– Например, событие «Карточка Вставлена в
Банкомат» всегда предшествует событию «Введен
ПИН-код».
• С другой стороны, события бывают и
совершенно независимыми.
– Например, событие «Карточка Вставлена в
Банкомат» в Москве не зависит от события
«Карточка Вставлена в Банкомат» в Новосибирске.
Событие таймера
• Событие таймера - это особое событие,
описываемое ключевым словом after, которое
говорит, что событие происходит по истечении
промежутка времени, заданного выражением в
скобках.
– Например: after (10с) или after (промежуток времени).
• На диаграмме состояний событие таймера
вызывает выход из текущего состояния.
• Промежуток времени измеряется от момента
входа в состояние до момента выхода из него,
обусловленного событием таймера.
Состояние
• Состояние описывает некоторую конкретную
ситуацию, характеризуемую протяженностью
во времени.
• Наступление события обычно приводит к
переходу конечного автомата из одного
состояния в другое.
• Но событие может и не иметь никаких
последствий, то есть после его наступления
автомат останется в прежнем состоянии.
• Теоретически переход в новое состояние
занимает нулевое время.
• На практике время, необходимое для
перехода в новое состояние, пренебрежимо
мало по сравнению со временем,
проведенным в данном состоянии.
• Начальное состояние - это то состояние, в
котором оказывается диаграмма состояний
сразу после активизации.
Объекты, использующие конечные
автоматы и объекты
• Хотя с помощью конечных автоматов можно
построить модель всей системы, в объектноориентированном анализе и проектировании
конечный автомат включается только в
некотором объекте.
• Данный объект зависит от состояния и всегда
находится в одном из состояний,
определенных конечным автоматом.
• Конечный автомат объекта изображается в
виде диаграммы состояний.
• В объектно-ориентированной модели,
зависящие от состояния, особенности работы
системы описываются одним или
несколькими конечными автоматами, каждый
из которых инкапсулирован в отдельный
объект.
• Взаимодействие конечных автоматов
происходит опосредованно, путем обмена
сообщениями между содержащими их
объектами.
Примеры диаграмм состояний
• Использование плоских диаграмм состояний
показано на трех примерах:
1. диаграммы состояний электрической
лампочки;
2. диаграмма состояний счета;
3. диаграмма состояний банкомата ;
Пример 1: диаграммы состояний
электрической лампочки
• События обуславливают переходы состояний.
• Когда переключатель устанавливается в положение
«On» (включен), лампочке посылается событие turnOn.
– В диаграммах состояний события считаются мгновенными,
т. е. от переключателя к лампочке событие доходит
мгновенно.
• Лампочка получает событие turnOn и в ответ на него
меняет свое состояние на On.
• В этом суть автоматов – объекты могут менять
состояние при получении события.
• Лампочка переходит в состояние Off при получении
события turnOff.
• В некоторый момент может произойти событие
burnOut (лампочка перегорает).
– Оно завершает конечный автомат.
Пример 2: диаграммы состояний счета
• В данном примере показана простая
диаграмма из двух состояний: начального и
конечного.
• Когда открывается счет с положительным
балансом, событие «Счет Открыт» вызывает
переход в начальное состояние «Счет
Хороший».
• Последующие события «Вклад» и «Обычное
Снятие Денег» не изменяют состояния при
условии, что баланс счета остается
положительным.
Диаграмма состояния счета
• Однако событие «Разрешенное Снятие Денег»,
приводящее к отрицательному балансу, вызывает
переход в состояние «Превышены Расходы по
Счету».
• В этом состоянии могут произойти другие
события «Разрешенное Снятие Денег».
• Последующее событие «Долг Погашен» вызывает
обратный переход в состояние «Счет Хороший».
• Наконец, при закрытии счета производится
переход в конечное состояние, изображаемое в
виде закрашенного круга внутри не
закрашенного («бычий глаз»).
Пример 3: диаграмма состояний
банкомата
• Начальное состояние данной диаграммы –
«Простаивает».
• При получении события «Карточка Вставлена»
банкомат переходит в состояние «Ожидание
ПИН-кода», в котором ждет, пока клиент
введет ПИН-код.
• При получении события «ПИН-код Введен»
банкомат переходит в состояние «Проверка
ПИН-кода», в котором выясняет, совпадает ли
введенный клиентом ПИН-код с тем, что
хранится в базе данных банковского сервера.
• Из состояния «Проверка ПИН-кода» возможно четыре
перехода.
1.Если ПИН-коды совпадают, осуществляется переход по ветке
«Правильный ПИН-код» в состояние «Ожидание Выбора
Клиента».
2.Если ПИН-коды не совпадают, то по ветке «Неправильный
ПИН-код» осуществляется возврат в состояние «Ожидание
ПИН-кода», и система предлагает клиенту повторить ввод.
3.Если и после третьей попытки клиент указывает
неправильный код, то совершается переход «Три Неудачи» в
состояние «Конфискация».
4.если карточка оказалась утерянной или украденной, то
также совершается переход «Три Неудачи» в состояние
«Конфискация».
• Кроме того, клиент может нажать клавишу отмены,
после чего карточка будет возвращена, а транзакция
прервана.
Диаграмма состояний банкомата
• В состоянии «Ожидание Выбора Клиента»
клиент может выбрать нужную операцию,
например «Снятие Денег».
• Диаграмма состояний получает событие
«Выбрано Снятие Денег» и переходит в
состояние «Обработка Запроса на Снятие».
• Если снятие разрешено, то диаграмма
оказывается в состоянии «Выдача Наличных».
• После получения события «Наличные
Выданы» банкомат переходит в состояние
«Печать», в котором печатается чек, а затем в
состояние «Возврат».
• После возврата карточки, о чем сигнализирует
событие «Карточка Возвращена», мы
попадаем в состояние «Завершение».
• Из состояния «Завершение» производится
переход в начальное состояние
«Простаивает» после получения события
таймера.
• Событие таймера обозначается After
(«Промежуток Времени»),
– где «Промежуток Времени» - это
продолжительность нахождения в состоянии
«Завершение» (от момента входа в это состояние
до момента выхода, вызванного событием
таймера).
Действие
• С переходом состояний может быть ассоциировано
действие.
• Действие (action) - это некоторое вычисление,
осуществляемое в результате перехода в новое
состояние.
• Действие инициируется переходом.
• Оно производится, а затем заканчивается.
• Действие выполняется мгновенно в момент перехода,
то есть концептуально его продолжительность равна
нулю.
• На практике время, затрачиваемое на выполнение
действия, очень мало по сравнению с длительностью
пребывания автомата в некотором состоянии.
• На диаграмме состояний действие изображается
путем пометки перехода следующим образом:
событие [условие] / действие.
– Например, когда банкомат переходит из состояния
«Ожидание ПИН-кода» в состояние «Проверка ПИНкода» в результате события «ПИН-код Введен»,
выполняется действие «Проверить пин-код».
• Этот переход помечен так:
ПИН-код введен / Проверить пин-код.
Пример действия
• Фрагмент диаграмма состояний банкомата с
добавленными действиями.
Переход с несколькими действиями
• С переходом может быть связано несколько действий.
• Такие действия выполняются одновременно, и поэтому
между ними не должно быть никаких зависимостей.
– Например, неправильно включать два одновременных
действия:
«Рассчитать Изменение» и «Показать Изменение».
• В таком случае имеется подчиненность одного
действия другому, поскольку нельзя показать
изменение до того, как оно рассчитано.
• Для решения данной проблемы нужно ввести
промежуточное состояние «Расчет Изменения».
– действие «Рассчитать Изменение» выполняется при входе
в это состояние,
– действие «Показать Изменение» - при выходе из этого
состояния.
Деятельности
• Помимо действий в результате перехода состояния могут
выполняться деятельности.
• Деятельность (activities) - это некоторое вычисление,
выполняемое, пока автомат находится в данном состоянии.
• В отличие от действия, деятельность занимает конечное
время.
• Деятельность начинается при входе в состояние и
заканчивается при выходе из него.
• Причина изменения состояния, приводящего к
прекращению деятельности, обычно состоит в приходе
некоторого события из источника, не связанного с
деятельностью.
• Однако иногда сама деятельность инициирует событие,
приводящее к изменению состояния.
• Один из способов показать деятельность на
диаграмме состояний –
– пометить переход в состояние, где она протекает:
событие / enable деятельность,
– а также пометить переход из этого состояния:
событие / disable деятельность.
• Для сокращения записи, можно вместо слов enable и
disable ассоциировать деятельность с самим
состоянием.
• Для этого в прямоугольнике, представляющем
состояние, записывают имя состояния и имя
деятельности, разделяя их горизонтальной чертой.
• Деятельность изображают в виде
do / деятельность
(здесь do -- зарезервированное слово).
• Это означает, что деятельность начинается при входе в
состояние и завершается при выходе из него.
Диаграмма состояний системы круизконтроля с деятельностями
Действия при входе и выходе
• Некоторые действия можно записать более
кратко, если связать их с самим состоянием, а не
с переходами.
• Для это используются действия при входе и при
выходе, для которых применяются ключевые
слова: entry и exit.
– мгновенное действие, выполняемое при входе в
состояние, обозначается как entry / действие,
– мгновенное действие, выполняемое при выходе из
него, - как exit / /действие.
• Обычно действия при входе и выходе не
используются, вместо этого помечаются
переходы в данное состояние и из него.
Действие при входе
• Лучше всего применять действие при входе, в
следующих ситуациях:
– если есть несколько переходов в данное
состояние; а при каждом переходе нужно
выполнить одно и то же действие;
– действие связано именно с входом в данное
состояние, а не с выходом из предыдущего.
• В этой ситуации действие изображается
только в прямоугольнике состояния, а не на
каждом ведущем в него переходе.
• Действие при выходе удобно использовать в
случаях:
– если есть несколько переходов из данного
состояния;
– если при каждом переходе требуется одно и то же
действие;
– если действие связано именно с, выходом из
данного состояния, а не с входом в следующее.
• В такой ситуации действие изображается
только в прямоугольнике состояния, а не на
каждом исходящем из него переходе.
Пример описания действия при
входе
• На рис. действия изображены на переходах.
– действие «Индицировать Останов Системы» связано
со всеми тремя переходами в состояние Останов,
– действие «Отобразить Приветствие» - с двумя
переходами в состояние Простаивает.
Пример описания действия при
входе (2)
• Другой способ к изображению действий :
– при входе в состояние Останов выполняется
мгновенное действие «Индицировать Останов
Системы»,
– при входе в состояние «Простаивает» - мгновенное
действие «Отобразить Приветствие«
Пример описания действия при
выходе
• Рассмотрим действие «Установить Значение Требуемой Скорости»,
• Оно выполняется после увеличения скорости в состоянии «Разгон»
в ходе выполнения деятельности «Увеличить Скорость», поэтому
изображено на обоих переходах из состояния Разгон.
Пример описания действия при выходе
(2)
• Более краткая запись действия при выходе из
состояния «Разгон»:
Пример описания действия при выходе
(2)
• Деятельность «Увеличить Скорость» выполняется в течение
всего времени пребывания в состоянии «Разгон».
• При выходе из этого состояния сначала прекращается
деятельность в нем, а затем выполняется действие при
выходе.
• Деятельность, выполняемая, пока автомат находится в
данном состоянии, может сама возбуждать событие,
вызывающее переход в новое состояние.
– Например, деятельность «Возобновить Круиз-Контроль»,
которая осуществляется в состоянии «Возобновление»,
возбуждает событие «Выход на Крейсерский Режим», которое
переводит диаграмму в состояние «Крейсерский Режим».
• Выход из состояния «Возобновление» может быть
обусловлен и другим событием, в частности «Нажат
Тормоз», полученным из внешней среды.
Синтаксис состояния
• Событие keypress (нажатие клавиши) моделируется это как
внутреннее событие, которое вызывает внутренний
переход, инициирующий действие отобразить “*“.
• Два специальных действия – вход и выход –
ассоциированы со специальными событиями entry и exit.
– У этих двух событий особая семантика.
• Событие entry происходит мгновенно и автоматически при
входе в состояние.
– Это первое, что происходит, когда осуществляется вход в
состояние.
– Это событие обусловливает выполнение ассоциированного с
ним действия на входе.
• Событие exit – самое последнее, что происходит мгновенно
и автоматически при выходе из состояния.
– Обусловливает выполнение ассоциированного действия на
выходе.
Иерархические диаграммы
состояний
Иерархические диаграммы
состояний
• Цель иерархических диаграмм состоит в том,
чтобы воспользоваться основными идеями и
визуальными преимуществами, которые дают
плоские диаграммы, но в то же время
избавиться от присущих им недостатков.
• Любой иерархической диаграмме можно
поставить в соответствие плоскую, поэтому
семантически те и другие эквивалентны.
• Иерархические диаграммы состояний способ, позволяющий справиться со
сложностью модели.
Иерархическая декомпозиция состояний
• Иерархическая декомпозиция состояний:
выделение «надсостояния», которое
раскладывается на одно или несколько
взаимосвязанных «подсостоянии».
• Такая операция также называется
декомпозицией ИЛИ, так как пребывание в
некотором надсостояний означает, что
диаграмма находится в одном и только одном из
его подсостоянии.
• Обозначения UML позволя.т показать
надсостояние и подсостояния на одной или
нескольких диаграммах в зависимости от уровня
сложности.
Пример иерархической декомпозиции
состояния
• В данном примере «надсостояние»
«Обработка Ввода Клиента» состоит из
подсостояний
– «Ожидание ПИН-кода»,
– «Проверка ПИН-кода» и
– «Ожидание Выбора Клиента».
Пример иерархической диаграммы
состояния
Изображение иерархической
декомпозиции состояния
• В иерархической диаграмме надсостояние
изображается в виде внешнего прямоугольника с
закругленными углами, в левом верхнем углу
которого записывается имя надсостояния.
• Подсостояния изображаются внутренними
прямоугольниками с закругленными углами.)
• Когда система оказывается в надсостояний
обработка «Ввода Клиента», она находится в
одном и только одном из подсостоянии
– «Ожидание ПИН-кода»,
– «Проверка ПИН-кода» или
– «Ожидание Выбора Клиента».
• Отметим, что каждый переход в надсостояние
«Обработка Ввода Клиента» - это переход в
одно и только одно подсостояние диаграммы
нижнего уровня.
• Любой выход из надсостояния — это выход из
какого-то его подсостояния.
– Например, входное событие «Карточка Вставлена»
вызывает переход в подсостояние «Ожидание
пин-кода», внутреннего для надсостояния
«Обработка Ввода Клиента».
Рекомендации по разработке диаграмм
состояний
• имя состояния должно отражать такую ситуацию
или такой промежуток времени, когда в системе
что-то происходит.
– Поэтому имя часто бывает существительным или
прилагательным (например, Начало или Начальное)
либо глаголом в третьем лице («Лифт Движется»).
– Не следует употреблять для именования состояний
глаголы в неопределенной форме (например,
«Двигать Лифт»);
• в пределах одной диаграммы имена всех
состояний должны различаться.
– Наличие двух состояний с одним и тем же именем
приводит к неоднозначности;
Рекомендации по разработке диаграмм
состояний (2)
• из каждого состояния должен быть выход.
– Очень часто встречаются диаграммы, в которых
нет конечного состояния;
• плоская диаграмма в любой момент времени
находится только в одном состоянии.
– Два состояния, например Лифт Движется и Лифт
на Этаже, не могут быть активными
одновременно.
– Одно состояние должно следовать за другим;
• для иерархических диаграмм применимы
следующие правила:
– если речь идет о последовательной
иерархической диаграмме (декомпозиция ИЛИ),
то пребывание в некотором надсостояний
означает пребывание в одном и только одном из
его подсостояний;
– если используется параллельная иерархическая
диаграмма (декомпозиция И), то пребывание в
некотором надсостояний означает пребывание в
одном из подсостояний каждой диаграммы
нижнего уровня;
• не следует путать события и действия.
– Событие - это причина перехода состояний, а действие его следствие;
• событие происходит в некоторый момент времени.
– Имя события должно пояснять, что именно произошло,
например: Вызов Вверх, Дверь Закрылась;
• действие - это команда,
– например: Остановить, Закрыть Дверь, Поддерживать
Скорость;
• действие выполняется мгновенно.
• деятельность продолжается все время, пока
диаграмма находится в данном состоянии;
• с одним переходом состояний может быть
ассоциировано несколько действий.
– Концептуально все эти действия выполняются
одновременно, поэтому нельзя говорить о
порядке их выполнения.
– Следовательно, между действиями не может быть
никаких зависимостей.
– Если же зависимость существует, то необходимо
ввести промежуточное состояние;
• условие - это булевое значение.
– Если переход помечен конструкцией событие
[условие], то он происходит только тогда, когда в
момент возникновения события условие истинно.
– Условие остается истинным на протяжении конечного
промежутка времени.
– Переход «Разогнаться [Торможения Нет]»
предназначен специально для того, чтобы
предотвратить смену состояния в случае, если в
момент возникновения события «Разогнаться» нажата
педаль тормоза;
• действия, деятельности и условия
необязательны.
– Используйте их только при необходимости.
Download