54
В большинстве случаев в системе целесообразно использовать либо только
вложенные автоматы, либо только вызываемые – это делает логику системы более
понятной. Формально говоря, эти механизмы взаимозаменяемы: каждый из них
можно эмулировать с помощью другого. При этом отметим, что для эмуляции
сохранения состояния между обращениями к вложенному автомату может
потребоваться ввести дополнительную переменную в объект управления.
Практически же, обычно несложно определить, какой из механизмов более удобен в
данной задаче при выбранном критерии автоматной декомпозиции (ниже будет
приведен пример влияния критерия декомпозиции на выбор того или иного вида
отношений между автоматами).
С другой стороны, при использовании обоих видов отношений совместно возникают
семантические неопределенности. Например, если автомат A
3
вложен в автомат A
2
,
который вызывается из автомата A
1
, должен ли A
3
сохранять свое состояние между
вызовами A
2
? На подобные вопросы автоматное программирование универсальных
ответов не дает. Поэтому разработчикам, которые решаются использовать
механизмы вложенности и вызываемости в одной системе, необходимо оговаривать
семантику их сочетания.
К вложенным и вызываемым автоматам можно обращаться везде, где разрешено
формировать выходные воздействия: в состояниях и на переходах. На практике к
вложенным автоматам чаще всего обращаются в состояниях.
Если в некоторое состояние вложен автомат и по совершении им шага объемлющий
автомат остается в том же состоянии (переходит по петле), снова происходит
обращение к этому же вложенному автомату. Таким образом, в этом случае
вложенный автомат работает почти так же, как если бы он был вызываемым, за тем
исключением, что вызываемый автомат заканчивает работу только по собственной
инициативе, а вложенный – как только после очередного шага выполнится условие
перехода объемлющего автомата в другое состояние. Несколько автоматов,
вложенных в одно состояние, работают псевдопараллельно (совершают шаги по
очереди).
Автоматы в системе могут обмениваться информацией посредством передачи
события как аргумента при вызове автомата и через общий объект управления.
Последний механизм подобен взаимодействию потоков в параллельной архитектуре
с общей памятью или обмену информацией между подпрограммами через
глобальные переменные. Этот механизм очень мощный, он мог бы быть
единственным способом взаимодействия автоматов. Однако он имеет те же
серьезные недостатки, что и глобальные переменные: отсутствие явного интерфейса
межмодульного взаимодействия и, как следствие, чрезмерная зависимость между
модулями и неспособность системы эволюционировать. Кроме того, в
рассматриваемом случае имеется еще и специфический «автоматный» недостаток.
Информация, которой обмениваются автоматы, имеет управляющую, логическую
природу. В соответствии с принципами автоматного программирования такую
информацию не следует смешивать с вычислительным состоянием объекта