76
вложены в состояние «Соединено». Наиболее абстрактное состояние «Включено»
разделено пунктирной линией на два ортогональных компонента.
В рамках нотации диаграмм переходов обе концепции: и последовательное
уточнение логики, и задание независимых логических измерений – поддерживаются
механизмом вложенных автоматов (хотя в графах переходов для компактного
изображения однотипных переходов могут использоваться групповые состояния
(рис. 2.24), которые в этом смысле эквивалентны суперсостояниям). Семантически
суперсостояние с несколькими вложенными состояниями на диаграмме переходов
эквивалентно состоянию с единственным вложенным в него автоматом, а
суперсостояние с несколькими ортогональными компонентами – состоянию с
несколькими вложенными автоматами (или нескольким параллельно работающим
автоматам на верхнем уровне иерархии).
С точки зрения синтаксиса, решение, используемое в диаграммах переходов, имеет
важное преимущество. В отличие от вложенных состояний, вложенные автоматы
специфицируются отдельно от объемлющего автомата, и для каждого из них
строится свой граф переходов. Это решение более масштабируемое (при росте
размера системы диаграммы не становятся неограниченно большими) и более
приспособленное для повторного использования (обращение к одному и тому же
вложенному автомату в разных местах не требует повторения его спецификации).
При этом отметим, что в языке UML поддерживаются вложенные диаграммы
состояний, однако их поддержка появилась только в UML 2.0 [38].
В заключение отметим, что, несмотря на разночтения в нотациях, подход Statemate и
программирование с явным выделением состоянии концептуально очень близки. К
сожалению, попав в объектно-ориентированный мир – в язык UML, диаграммы
состояний не заняли подобающего им положения. Вместо формальной спецификации
логики сложного поведения, достаточно выразительной для автоматической
генерации по ней кода, диаграммы состояний превратились в еще один вид
иллюстраций, которые иногда включают в техническую документацию системы.
Причина этого, по мнению авторов, в недостаточно глубоком осмыслении роли
автоматного описания поведения в объектно-ориентированном программировании.
Попытка такого осмысления, результатом которой являются концепции объектно-
ориентированного программирования с явным выделением состояний, сделана
авторами в главе 3. При этом следует отметить, что возможность автоматической
генерации кода с учетом диаграмм поведения появилась в рамках концепции
исполняемый UML [39, 40], что потребовало значительной доработки языка UML.
2.3. Реализация
В данном разделе обсуждаются вопросы программной реализации различных
автоматных моделей, а также рассматривается реализация систем со сложным
поведением в целом в рамках процедурного программирования с явным выделением
состояний. В разд. 2.3.1 внимание уделяется задачам логического управления, а в
разд. 2.3.2 класс рассматриваемых задач расширяется до произвольных систем со
сложным поведением. Задачи логического управления снова, как и в предыдущих
разделах, рассматриваются отдельно по нескольким причинам. Во-первых, они
имеют ярко выраженные особенности: отсутствие событий, автоматы активны,
взаимодействие путем обмена номерами состояний. Во-вторых, логическое
управление – традиционная область применения автоматного программирования и,