#boolean #state-machine
#логическое #конечный автомат
Вопрос:
У меня возник следующий вопрос, который некоторое время мучает меня. Я новичок в моделировании конечных автоматов, поэтому был бы очень признателен за вашу помощь, идеи и предложения.
Допустим, у меня есть «Клапан», который может находиться в состоянии «открыт» или «закрыт». Теперь, когда я моделирую конечный автомат.
Должен ли я определять два логических значения для каждого состояния?
bool opened;
bool closed;
Следовательно, я должен использовать оба логических значения для каждого состояния?
Пример: состояние «открыто» будет иметь логические значения —> открыто = 1 и закрыто = 0;
или
Могу ли я просто определить только одну логическую переменную?
bool opened;
Пример: состояние «открыто» будет иметь только одно логическое значение -> открыто = 1, а в состоянии «закрыто» оно будет иметь логическое значение открыто = 0;
Какова наилучшая практика здесь? Какие преимущества использования двух логических значений по сравнению с одним логическим значением? Я могу представить, что в этом случае слишком много переменных должно быть определено и сбрасываться каждый раз, когда состояние переходит в другое состояние.
Заранее благодарю вас
Комментарии:
1. Одна переменная лучше, это меньше кода, присвоение одной логической переменной является атомарной операцией (почти на любом языке)
2. Звучит странно иметь переменные, содержащие информацию о состоянии в конечном автомате. Разве «открыто» и «закрыто» не должны быть двумя состояниями?
Ответ №1:
Если два состояния являются взаимоисключающими, нет смысла иметь избыточную переменную состояния, которую вам нужно будет поддерживать. Одно логическое значение уже предоставляет вам два возможных состояния.
В зависимости от языка вы можете ввести псевдоним, чтобы вы могли ссылаться на одно и то же состояние под разными именами, чисто для эстетических целей, и компилятор удалит избыточность. Но опять же, это может быть скорее неприятностью, чем чем-то действительно полезным.
Вы хотите иметь дополнительные переменные состояния, когда вам нужно иметь дело с независимыми состояниями или когда вы хотите описать подсостояния.
Ответ №2:
Я думаю, вы могли бы вообще не использовать логическое значение для представления состояния объекта. Большинство объектов будут иметь более двух состояний, и если вы используете логические флаги, вы получите множество из них. Это может затруднить тестирование и проверку того, что код работает должным образом все время. Я работал с кем-то, у кого было 22 логических флага в одном классе. Это означало, что класс имеет более 4 миллионов возможных состояний.
Обычно я использую перечисление для представления состояния класса. Клапан может быть открыт или закрыт, но что, если он неисправен и его невозможно использовать? Я могу легко добавить больше состояний в перечисление, увеличивая количество состояний на 1, но если я использую логическое значение, я буду экспоненциально увеличивать количество возможных состояний при добавлении дополнительных флагов.
Я бы также рекомендовал использовать библиотеку конечных автоматов вместо ручной обработки состояния в вашем собственном коде. Доступно много библиотек конечных автоматов, я использую (и вношу свой вклад) библиотеку конечных автоматов без состояния на Github.