У приложения может быть несколько конечных автоматов, для каждого из которых определяется собственный набор вариантов поведения приложения, подлежащих структуризации. Приложение, для которого конечные автоматы не определены, в действительности является приложением с множеством конечных автоматов; каждая переменная, определенная на уровне приложения, по сути дела сама является конечным автоматом, и любой код может получить доступ к состоянию и изменить его. Конечные автоматы используются для формирования набора взаимосвязанных переменных или вариантов поведения и их логической организации, облегчающей обработку состояний. Конечные автоматы — суть организованное поведение.
На рис. 5.1 в схематическом виде представлен конечный автомат обучающей игры, позволяющей изучать иностранные слова путем выбора одного из предлагаемых вариантов ответа. Поведение приложения разбито на пять логических состояний. Эти логические состояния существуют независимо от того, будут ли они выбраны нами для введения их определений в конечный автомат. Конечный автомат — это просто формальное описание того, как работает приложение. Она позволяет нам ясно представлять себе различные состояния, в которых может находиться приложение в процессе взаимодействия с ним пользователя.
Другим способом представления состояний приложения является построение диаграммы переходов. Эта диаграмма содержит список дискретных состояний, в которых может находиться приложение, а также возможные варианты переходов между состояниями. Список возможных состояний и вариантов перехода из одного состояния в другое для нашего приложения представлен в табл. 5.1.
Рис. 5.1.
Таблица 5.1. Варианты изменения состояний для словарной игры с множественным выбором
Состояние | Внешний ввод | Следующее состояние |
---|---|---|
StartScreen | Пользователь выбрал вариант "Next Question" | AskQuestion |
StartScreen | Пользователь выбрал вариант "Correct Answer" | Запрещенный переход! |
StartScreen | Пользователь выбрал вариант "Incorrect Answer" | Запрещенный переход! |
StartScreen | Пользователь выбрал вариант "End Game" | Запрещенный переход! |
AskQuestion | Пользователь выбрал вариант "Next Question" | Запрещенный переход! |
AskQuestion | Пользователь выбрал вариант "Correct Answer" | CongratulateUser |
AskQuestion | Пользователь выбрал вариант "Incorrect Answer" | ScoldUser |
AskQuestion | Пользователь выбрал вариант "End Game" | Запрещенный переход! |
CongratulateUser | Пользователь выбрал вариант "Next Question" | AskQuestion |
CongratulateUser | Пользователь выбрал вариант "Correct Answer" | Запрещенный переход! |
CongratulateUser | Пользователь выбрал вариант "Incorrect Answer" | Запрещенный переход! |
CongratulateUser | Пользователь выбрал вариант "End Game" | StartScreen |
ScoldUser | Пользователь выбрал вариант "Next Question" | AskQuestion |
ScoldUser | Пользователь выбрал вариант "Correct Answer" | Запрещенный переход! |
ScoldUser | Пользователь выбрал вариант "Incorrect Answer" | Запрещенный переход! |
ScoldUser | Пользователь выбрал вариант "End Game" | StartScreen |