Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
компьютерная техника (конспектировать ).docx
Скачиваний:
69
Добавлен:
05.11.2018
Размер:
1.56 Mб
Скачать

9.3 Механизм конечного автомата архитектуры

Механизм конечного автомата архитектуры обеспечивается в трех архитектурных классах: Переходе, Конечной Модели Состояния (КМС) и Активном Экземпляре.

Инкапсулированные данные

Класс Переход (рис.9.3.1) инкапсулирует данные, которые описывают каждый переход для всех моделей состояний в программе. Каждый экземпляр Перехода соответствует ячейке (отличной от ячейки "не может произойти") в таблице переходов в состояния.

Рис.9.3.1. Диаграмма класса для класса Переход.

  • Если ячейка представляет собой ячейку "новое состояние", то новым состоянием переменной экземпляра является номер состояния, находящийся в ячейке.

  • Если ячейка представляет собой ячейку "событие игнорируется", то новым состоянием является ноль.

Класс КМС, показанный на рис.9.3.2, служит для связывания всех экземпляров Перехода, которые составляют одну модель состояний. Точная физическая структура данных, применяемая в КМС и Переходе, будет зависеть от используемой среды разработки (языков и библиотек классов). Мы предполагаем, что структура данных подобна показанной на рис.9.3.4. Вполне возможно, что это может быть успешно ^достигнуто размещением КМС как потомка класса Список.

Активный Экземпляр (рис.9.3.3) является абстрактным классом, из которого все экземпляры, имеющие конечные автоматы, наследуют их текущее состояние.

Теория операции: прохождение конечного автомата

Когда прикладной класс принимает событие (см. раздел 9.7), он вызывает операцию Активный Экземпляр. Совершить Событие (рис.9.3.5). В этом вызове прикладной класс передает входными параметрами номер полученного события и дескрипторы как КМС, которую необходимо пройти, так и экземпляра, который получил событие, как показано на рис.9.3.6. Затем операция Совершить Событие использует текущее состояние активного экземпляра и вызывает операцию КМС.Пройти, передавая как входные параметры текущее состояние, полученное событие и дескриптор КМС, которая проходится.

Рис.9.3.2. Диаграмма класса для класса Конечная модель состояний.

Рис.9.3.3. Диаграмма класса для класса Активного экземпляра.

Рис.9.3.4. Структуры данных для КМС и классов Перехода.

Рис.9.3.5.Зависимости, связанные с совершением события.

Операция КМС.Пройти (рис.9.3.7), в свою очередь, представляет каждый переход определенного КМС на рассмотрение внешнему модулю Переход.Соответствовать, до тех пор пока он не сообщит, что обнаружен переход, соответствующий номеру события и текущему состоянию (выражается значением "истина" выходного параметра "соответствовать"), и что известно соответствующее значение для новою состояния. Операция КМС.Пройти теперь возвращает новое состояние Активному Экземпляру.Совершить Событие, которое модифицирует состояние активного экземпляра и возвращает его значение вызывающему прикладному классу.

Рис.9.3.6. Схема структуры класса для класса Активного экземпляра.

Если операция КМС.Пройти исчерпает список переходов без получения успешного ответа из модуля Переход. Соответствовать, то это значит, что мы столкнулись с ячейкой "не может произойти" из таблицы переходов в состояния. Это указывает на то, что произошла ошибка либо в анализе, либо в реализации.

Соответствующий способ обработки ошибки зависит в некоторой степени от природы прикладного класса. Нам следует ожидать, что операция КМС.Пройти выдаст сообщение, указывающее, что произошла ошибка. Вполне возможно, что КМС.Пройти может затем прервать выполнение программы. В качестве альтернативного варианта он мог бы возвратить управление Активному Экземпляру. Совершить Событие, чтобы дополнительная информация (какой экземпляр модели состояний сбойный) могла быть выведена с целью отладки программы. Обратите внимание, что такой вывод может быть трудноинтерпретируемым: во многих реализациях дескриптор - только указатель, поэтому программисты не всегда смогут определить, какой экземпляр модели состояний сбойный. Более удачное решение помещает отсрочивающуюся операцию, называемую Не Может Произойти Встретилось В Активном Экземпляре. Затем операция Активный Экземпляр. Совершить Событие может осуществить полиморфный вызов Не может произойти встретилось для передачи управления прикладному порожденному классу, в котором может быть обеспечен ясный вывод текста.