Событие перехода — это тот входной символ (стимул), который вкупе с текущим
состоянием автомата определяет следующее состояние.
В UML предусматривается несколько типов событий (разд. 4.2.4). Само слово
"событие" невольно вызывает следующую ассоциацию: существует некий внешний
по отношению к автомату мир, в котором время от времени происходят события (в
общечеловеческом смысле этого слова), автомату становится известно о
произошедшем событии и он реагирует на событие путем перехода в определенное
состояние. Эта ассоциация вполне правомерна, если речь идет о моделировании
жизненного цикла объекта в программе, управляемой событиями. Действительно: в
этом случае основной тип событий — это события вызова методов объекта. Объект
реагирует на них, выполняя тела методов и меняя значения своих атрибутов
(состояние). Однако, данная ассоциация далеко не единственно возможная (хотя и
самая распространенная в объектно-ориентированном программировании).
Автомату не важен источник событий: важна последовательность, в которой
события поступают на вход автомата, вынуждая его реагировать. Например,
последовательность символов в слове входного алфавита A (см. разд. 4.1.1) также
рассматривается как последовательность событий. Для автомата существенно, что
первое событие предшествует второму, а почему это происходит: потому ли что
первое событие произошло раньше или же потому что расположено левее — это не
важно. Таким образом, конечные автоматы, в том числе машины состояний UML,
подходят для моделирования поведения не только событийно-управляемых
программ, но и любого другого типа управления.
86
UML допускает наличие переходов без событий — такой переход называется
переходом по завершении.
Переход по завершении – это переход без событий.
Семантика перехода по завершении такова. Имеется одно неявное, а потому
безымянное событие, которое наступает при завершении внутренней активности в
состоянии (если никакой внутренней активности не предусмотрено, то это событие
наступает немедленно после перехода автомата в данное состояние). Поскольку
событие завершения является безымянным, оно никак не отображается на
диаграмме: в тексте, сопутствующем
переходу, просто отсутствует первая часть,
относящаяся к событию перехода. В остальном переходы по завершении ничем не
отличаются от простых переходов: они могут содержать сторожевые условия,
может быть несколько исходящих переходов по завершении для данного состояния
(с альтернативными сторожевыми условиями), для переходов по завершении
можно определять последовательности действий при переходе и т. д.
Следует, однако, иметь в виду, что при частом использовании переходов по
завершении легче допустить и труднее обнаружить ошибку модели, порождающую
неопределенное поведение. Простой пример: допустим, что имеется состояние, для
которого определено несколько исходящих переходов по завершении (с разными
сторожевыми условиями) и не определено других переходов по событиям.
Допустим, что ни один из переходов по завершении не сработает, ввиду того, что
86
Обратите внимание, что в схеме кода конечного автомата, приведенной в конце разд. 5.1.1,
используется обычный последовательный поток управления.