О главе
Когда функциональность расширяется, и в разное время при разных условиях устройство выполняет разные задачи, т.е. находится в разных состояниях (англ. state), то целесообразнее использовать автомат. Не будем углубляться в теорию, а рассмотрим такой подход на примере.
Возьмем некоторое устройство, например, часы с датчиком температуры. Время и температуру они отображают посредством семисегментного индикатора, а в качестве элементов управления используются кнопка и энкодер.
Опишем желаемую логику работы. По умолчанию часы должны показывать время, т. е. при запуске устройства на дисплее отображаются часы и минуты — назовем это состояние STATE_SHOW_TIME
. При прокрутке энкодера по часовой стрелке яркость дисплея увеличивается, а против часовой, наоборот, уменьшается. Изменение яркости работает отдельно от логики всей остальной программы во всех возможных состояниях. При нажатии на кнопку на дисплее начинает отображаться температура (состояние STATE_SHOW_TEMPERATURE
). Если ничего не происходит, то по истечении 30 секунд устройство вновь переключается в состояние STATE_SHOW_TIME
и отображает время. В противном случае, если кнопка была нажата снова, устройство может перейти в два возможных состояния: либо вернуться к отображению времени (STATE_SHOW_TEMPERATURE
), либо перейти к настройке. Условие перехода в следующий режим — это яркость экранаwhy. Пусть при минимальной яркости часы переходят в режим настройки часов (STATE_ADJUST_HOURS
). Прокручивая ручку энкодера, пользователь будет либо увеличивать, либо уменьшать значение часов. Когда настройка часов завершена, по нажатию на кнопку устройство переходит в режим настройки минут (STATE_ADJUST_MINUTES
). После повторного нажатия кнопки устройство начинает показывать время.
Не самое элегантное решение, но что делать 🙂
Всё поведение устройства можно описать графом состояний.
Выразить такую диаграмму в виде кода можно разными способами, рассмотрим их.