46
4. Наконец, введем четыре целочисленные переменные: «число часов», «число
минут», «число часов будильника», «число минут будильника». Таким образом,
совокупность значений текущего времени и времени срабатывания будильника
определяет текущее вычислительное состояние системы.
После выполнения указанных выше шагов начинается стадия реализации эмулятора
часов. Подпрограммы самого низкого уровня абстракции реализуются в терминах
переменных, хранящих вычислительное состояние. Реализация автомата становится
главной программой
6
. В большинстве случаев эту программу можно сгенерировать
автоматически из более высокоуровневого и наглядного представления автомата
(подробнее о технологии реализации в разд. 2.3).
В приведенном примере логика поведения эмулятора часов с будильником описана с
помощью автомата Мили. Выбор этой автоматной модели сделан на основе
постановки задачи: из словесного описания поведения часов следует, что они
совершают различные действия в зависимости от возникающих событий. В общем
случае в программировании с явным выделением состояний могут применяться
автоматы Мура, Мили или смешанные автоматы.
Изложенный метод проектирования имеет ряд преимуществ перед традиционной
функциональной декомпозицией сверху вниз. Помимо общих достоинств,
характерных для любого «автоматного» метода (таких как наглядное представление
логики сложного поведения), явное выделение состояний попутно привело к
частичному решению ряда проблем традиционного процедурного
программирования. Один из основных недостатков метода сверху вниз состоит в том,
что при проектировании в первую очередь задается вопрос «Что делает система?», а
ведь именно этот ее аспект более всего подвержен изменениям [29]. В результате
архитектура построенной таким образом системы обладает недостаточной
расширяемостью.
В программировании с явным выделением состояний главный вопрос – «В каких
состояниях может находиться система?» Множество управляющих состояний – более
устойчивая характеристика системы, чем ее главная функция. Поэтому архитектура,
построенная на основе управляющих состояний, является более расширяемой.
Кроме того, программирование с явным выделением состояний непосредственно
использует концепцию события. В событийной архитектуре вообще нет понятия
главной функции. Такая архитектура полностью соответствует современным
представлениям о программной системе, предоставляющей некоторое множество
услуг (сервисов).
Отметим, что в программировании с явным выделением состояний метод сверху вниз
является лишь одной из альтернатив. Известное ограничение этого метода состоит в
том, что его целесообразно применять только при проектировании всей системы от
начала до конца – с нуля. Еще одно ограничение появляется из-за специфики задач,
решаемых с помощью автоматного подхода. Объекты управления в разрабатываемых
системах часто реализуются аппаратно. В этом случае к ним нецелесообразно
6
В событийных системах говорить о главной программе не совсем корректно. В этом случае
реализация автомата играет роль главной процедуры обработки событий. В программах для
Windows, использующих WinAPI, такая процедура традиционно называется WndProc.