117
описано наиболее мощное из существующих на сегодняшний день
инструментальных средств, поддерживающих объектно-ориентированное
программирование с явным выделением состояний – UniMod [69].
3.3.1. Шаблоны реализации автоматизированных классов
Как было упомянуто выше, существует большое число образцов проектирования,
предназначенных для объектно-ориентированной реализации конечных автоматов в
частности и сущностей со сложным поведением в целом. В их основе лежат уже
известные читателю два способа описания автоматов в программе: статический (при
помощи инструкций выбора и ветвления) и динамический (при помощи таблиц).
Появление полиморфизма подтипов позволяет вместо явного создания таблицы
переходов и выходов автомата использовать для этих целей таблицу полиморфных
вызовов, в том или ином виде встроенную в любой объектно-ориентированный язык
программирования для диспетчеризации вызовов компонентов. С точки зрения
разработчика использование полиморфизма для реализации сложного поведения
гораздо удобнее, чем создание таблицы вручную.
Образцы проектирования сложного поведения отличаются также способом
представления элементов автоматной модели: состояний, событий, действий,
переходов. С этой точки зрения одним крайним случаем является «обертывание»
автоматной функции в класс, знакомое нам по предыдущей главе. При этом
состояния и события описываются целочисленными константами. Это решение
обладает высоким быстродействием, но крайне низкой гибкостью.
На другом полюсе находится, так называемый, шаблон FSM Framework [53], в
соответствии с которым для каждого элемента автоматной модели строится
отдельный класс. При этом класс состояния содержит таблицу, ключами в которой
являются события, а значениями – переходы. Класс перехода содержит ссылку на
целевое состояние и действие. Этот шаблон обеспечивает наибольшую гибкость,
однако построенная таким способом программа громоздка и не очень эффективна по
времени и памяти. Между двумя полюсами лежат различные комбинации описания
элементов автоматной модели с помощью целочисленных констант, подпрограмм и
классов. Изучить все многообразие образцов проектирования можно, обратившись к
работам [53, 54].
В этой книге рассмотрим только два шаблона реализации сложного поведения,
которые кажутся авторам наиболее универсальными и согласованными с моделью
автоматизированного объекта управления. В контексте этой модели довольно
естественно отождествлять события с компонентами автоматизированного класса.
Таким образом, вопрос о представлении событий не возникает. Кроме того, как
показывает опыт, для большинства задач не требуется обеспечивать возможность
динамической конфигурации автомата. Поэтому отдается предпочтения
статическому описанию функций переходов и действий. Методы реализации будем
рассматривать на примере автоматизированного класса Alarm_Clock,
описывающего часы с будильником, причем в целях повышения модульности
выделим объект управления в отдельный класс.
Наш первый пример показывает, как можно превратить реализацию сущности со
сложным поведением из процедурной в объектно-ориентированную, сделав минимум
изменений. Часы с будильником теперь представляют собой отдельный класс,