State Machine - Какой лучший способ определить логическое значение для разных состояний? - PullRequest
0 голосов
/ 17 апреля 2019

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

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

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

  bool opened; 
  bool closed;

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

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

OR

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

bool opened;

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

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

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

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

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

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

0 голосов
/ 17 апреля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...