Конечный автомат — каков наилучший способ определить логическое значение для разных состояний?

#boolean #state-machine

#логическое #конечный автомат

Вопрос:

У меня возник следующий вопрос, который некоторое время мучает меня. Я новичок в моделировании конечных автоматов, поэтому был бы очень признателен за вашу помощь, идеи и предложения.

Допустим, у меня есть «Клапан», который может находиться в состоянии «открыт» или «закрыт». Теперь, когда я моделирую конечный автомат.

Должен ли я определять два логических значения для каждого состояния?

   bool opened; 
  bool closed;
 

Следовательно, я должен использовать оба логических значения для каждого состояния?

Пример: состояние «открыто» будет иметь логические значения —> открыто = 1 и закрыто = 0;

или

Могу ли я просто определить только одну логическую переменную?

 bool opened;
 

Пример: состояние «открыто» будет иметь только одно логическое значение -> открыто = 1, а в состоянии «закрыто» оно будет иметь логическое значение открыто = 0;

Какова наилучшая практика здесь? Какие преимущества использования двух логических значений по сравнению с одним логическим значением? Я могу представить, что в этом случае слишком много переменных должно быть определено и сбрасываться каждый раз, когда состояние переходит в другое состояние.

Заранее благодарю вас

Комментарии:

1. Одна переменная лучше, это меньше кода, присвоение одной логической переменной является атомарной операцией (почти на любом языке)

2. Звучит странно иметь переменные, содержащие информацию о состоянии в конечном автомате. Разве «открыто» и «закрыто» не должны быть двумя состояниями?

Ответ №1:

Если два состояния являются взаимоисключающими, нет смысла иметь избыточную переменную состояния, которую вам нужно будет поддерживать. Одно логическое значение уже предоставляет вам два возможных состояния.

В зависимости от языка вы можете ввести псевдоним, чтобы вы могли ссылаться на одно и то же состояние под разными именами, чисто для эстетических целей, и компилятор удалит избыточность. Но опять же, это может быть скорее неприятностью, чем чем-то действительно полезным.

Вы хотите иметь дополнительные переменные состояния, когда вам нужно иметь дело с независимыми состояниями или когда вы хотите описать подсостояния.

Ответ №2:

Я думаю, вы могли бы вообще не использовать логическое значение для представления состояния объекта. Большинство объектов будут иметь более двух состояний, и если вы используете логические флаги, вы получите множество из них. Это может затруднить тестирование и проверку того, что код работает должным образом все время. Я работал с кем-то, у кого было 22 логических флага в одном классе. Это означало, что класс имеет более 4 миллионов возможных состояний.

Обычно я использую перечисление для представления состояния класса. Клапан может быть открыт или закрыт, но что, если он неисправен и его невозможно использовать? Я могу легко добавить больше состояний в перечисление, увеличивая количество состояний на 1, но если я использую логическое значение, я буду экспоненциально увеличивать количество возможных состояний при добавлении дополнительных флагов.

Я бы также рекомендовал использовать библиотеку конечных автоматов вместо ручной обработки состояния в вашем собственном коде. Доступно много библиотек конечных автоматов, я использую (и вношу свой вклад) библиотеку конечных автоматов без состояния на Github.