Разработка MDA-приложения с использованием машин состояний

Цель работы– научиться использовать машины состояний при создании MDA-приложений.

Введение

Автоматы

Работа объектов программы описывается с помощью автоматов (или машин состояний). Существует хорошо развитая теория автоматов, в которой изучают­ся вопросы их построения и анализа работы.

Автомат — это элемент системы, который характеризуется двумя базо­выми понятиями: состояние и переход.

Каждый автомат в определенный момент времени может находиться в одном из допустимых состояний. Число этих состояний, возможно, бесконечно. Задан так­же набор правил, по которому допускается переход из одних множеств состояний в другие.

Схожесть автоматной модели с программированием в том, что переменные (ячейки памяти) в каждый момент работы процессора всегда хранят конкретные значения из допустимых диапазонов значений. Эти значения фактически являют­ся состояниями переменных.

Разрешенные над значениями переменных вычислительные операции при­водят к переходу этих переменных в новые состояния (в новые значения). Этот алгоритмический принцип может быть распространен на большое число управ­ленческих задач. В общем случае автоматный подход позволяет описать любую, сколь угодно сложную последовательность операций.

Познакомимся с базовыми правилами работы автоматов в языке UML.

– Автомат в определенный момент времени может находиться только в одном состоянии. Это правило соответствует принципу императивного програм­мирования, согласно которому любая переменная в каждый момент време­ни (такт процессора, шаг работы программы) хранит только одно из множе­ства допустимых значений.

– Число состояний автомата конечно.

– Из текущего состояния автомат может перейти только в одно следующее состояние. Не исключено, что это состояние выбирается из нескольких доступных вариантов.

– В рамках диаграммы у каждого состояния должен быть предшественник (за исключением начального состояния). Это правило запрещает размещение на диаграмме состояний, никак не связанных друг с другом.

– В определенном состоянии автомат может находиться сколь угодно долго. Переходы между состояниями считаются мгновенными.

– На диаграмме состояний не регистрируется путь (история состояний), при­ведший автомат в текущее состояние (в отличие от диаграмм последова­тельности и кооперации). Это правило показывает, что по текущему значе­нию переменной нельзя определить те значения (состояния), в которых она находилась ранее.

Состояния

Конкретное состояние (в общем случае – статический срез системы) формируется инструментом State (Состояние). На диаграмме оно изображается в виде прямоугольника с закругленными углами. Состояние имеет имя, начинающееся с заглавной буквы. Под ним могут записываться условие и действия. Условия про­веряются, а действия выполняются, когда автомат находится в соответствующем состоянии.

Отметим принятые правила оформления элементов диаграммы состояний. Элемент State представляет не действие, а описание статического состо­яния, в котором автомат может находиться неограниченно долго. Автомат может переходить из текущего состояния в другие состояния при выполнении опреде­ленных действий пользователя или условий, которые должны быть выполнены. Действия и условия отображаются только на линиях переходов между состояни­ями.

Подавтоматы

Внутри каждого состояния разрешается формировать собственный автомат (под­автомат) – мини-диаграмму состояний. Благодаря этому возможно проектиро­вать систему постепенно, раскрывая отдельные ее элементы по мере необходимо­сти.

Подавтомат – это автомат, вложенный в другой автомат и описываю­щий поведение конкретного состояния.

Диаграммы состояний

Диаграммы состояний (State Machine Diagram) стали новым типом диаграмм в версии UML 2.0. Они особенно важны для разработчика, использующего среду Delphi. Дело в том, что в последней версии Delphi 2006 имеется технология моде­лирования ЕСО III. Она расширена средствами визуального построения алго­ритмов. С помощью этих средств описывается работа разных элементов модели. Ранее для описания модели и генерации исходного кода на языке Delphi приме­нялись лишь статические диаграммы классов. Теперь задействованы и диаграм­мы состояний.

Диаграмма состояний – это средство, описывающее логику функциониро­вания автоматов (машин состояний).

В основу диаграмм состояний положена концепция автоматов. Доказано, что с помощью таких автоматов можно запрограммировать произвольный алгоритм любой сложности, если его можно также записать на императивном языке программирования.

Диаграмма состояний всегда относится к конкретному классу и описыва­ет его внутреннее функционирование. На диаграмме конкретное состояние ото­бражается с помощью элемента Sate. Начальное и конечное состоя­ния – элементы Initial (Начальное) и Final (Конечное) – представлены на диаграмме сплошным кружком. Кружок, соответствующий конечному состоянию, обведен каймой. Фактически, это псевдосостояния, не возникающие при реальной работе. Начальное и конечное состояния лишь наглядно задают последовательность вхо­да в первое рабочее состояние и выхода из последнего рабочего состояния.

Отдельное состояние может охватывать последовательность действий. Состо­яние, охватывающее другие состояния, называют суперсостоянием, а вложенные в него состояния – подсостояниями. Такой иерархический подход к организации состояний позволяет формировать одинаковое реакции подсостояний на уровне одного суперсостояния. Пусть, например, имеется стандартное аварийное состоя­ние и стандартный переход в него по команде отмены. Для каждого из множества состояний диаграммы можно указать этот переход индивидуально, а можно объ­единить их в суперсостояние. Тогда переход в аварийное состояние представля­ется на диаграмме всего одной линией, исходящей из элемента, представляющего суперсостояние.

Каждое из состояний на диаграмме не обязано пассивно ожидать внешне­го события, приводящего к переходу основного объекта в следующее состояние. Состояние может вести определенную деятельность. Соответствующая деятель­ность задается свойством состояния Do activity (Выполнение деятельности). Нужная деятельность уже должна быть задана в проекте, например на одной из диаграмм деятельности. Подобное состояние, когда до него доходит очередь, начинает эту деятельность и ожидает ее завершения, фактически отображая не статическое состояние, а выполнение процесса. Этот процесс может быть прерван, что вызо­вет переход в другое состояние. Если он закончится успешно, также выполнится соответствующий переход.

В диаграммах состояний UML 2.0 можно описывать историческое состояние. Обычная история состояния и глубокая история представлены как отдельные элементы: Shallow History (Обычная история состояния) и Deep History (Глубокая история).

Элемент Junction (Слияние) визуализирует слияние и разделение потоков управ­ления. Он представляет собой промежуточный узел, по внешнему виду аналогич­ный начальному элементу Initial. В таком узле собираются, а потом вновь расхо­дятся потоки управления. В диаграммах состояний можно также задействовать условный элемент Choice (Выбор).