Конечный автомат: Плохой дизайн?

Конечные автоматы обычно рассматривают как плохой дизайн в ООП?

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

что относительно проблем удобочитаемости/пригодности для обслуживания?

8
задан pestilence669 28 March 2010 в 23:34
поделиться

5 ответов

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

Существует множество способов реализации одного с OOP. Некоторые уродливы, чем другие. Ваши низкоуровневые парни будут использовать операторы переключения, прыгать в таблицах или даже «goto».

Если вы ищете более чистый способ сделать это, я бы порекомендовал Библиотеку государственного диаграммы Boost , которая построен только для реализации диаграмм состояния UML в C ++. Он использует современные методы шаблона, чтобы сделать вещи более читаемыми. Это также очень хорошо выполняет.

19
ответ дан 5 December 2019 в 05:03
поделиться

Не могу сказать, что они говорят.

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

Реалистично, вы можете смешивать эти конструкции с/на разных уровнях абстракции, которые будут выходить чище, чем использование только одного или другого.

5
ответ дан 5 December 2019 в 05:03
поделиться

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

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

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

Я должен прочитать сенсорный экран. Чтобы прочитать позицию, я должен обменять около 15 команд над SPI. Мне нужны хорошие 100 считываний секунды. Я должен подождать около 1 микросекунда после каждой команды, для соответствующего оживленного флага, чтобы исчезнуть, прежде чем я смогу продолжить. Существует также ряд других операций, которые должны быть достижены по одному и тому же интерфейсу, подобно настройке контрастности, изменяющиеся режимы, включение или выключение подсветки, температуру считывания. Если я выступил в то время как (busy_bit); для каждого ожидания, я бы съел весь процессор в вопросе моментов. Если бы я сделал SCEN_YIELD () или Usleep (1) , я бы никогда не достигли количества показателей, которые я хочу. Единственный способ - это конечный станок.

Но есть способы сделать конечный государственный автомат тоже приятно. Скрыть машину за кулисами и дайте разработчикам функции работать с.

Мой опыт работы до сих пор доминировал 2 системы, основанные на 3 различных конечных станках.

  1. Большой веб-портал, где на каждом шаге вы извлекаете некоторые данные из базы данных, и на основании на нем подготовит больше запросов. На последнем шаге вы используете данные для генерации HTML. Каждая задача - модуль веб-страницы - был реализован как класс PHP, наследство от двигателя. Состояние было сохранено в классах переменных. Каждый шаг был отдельной функцией. В конце шага сохраненные запросы были оптимизированы и отправлены на двигатель через кэши, и ответы были предоставлены обратно на оригинал.
  2. Встроенное устройство со многими подсистемами. Задача насоса используется. Каждый модуль регистрирует обработчик, который называется много раз в секунду от основного цикла. Обработчик может сохранить состояние в статических или классовых переменных с состояниями. Эта кооперативная многозадачность позволяет намного меньшую след памяти, чем запустить все в отдельных потоках, позволяет использовать ручную приоритетность задач, зарегистрировав их дважды, и в два раза приведет к высокому приоритету.
  3. Полуфитатор. Этот сенсорный экран. Функциональные вызовы и их состояния ожидания зарегистрированы, но каждый называется только один раз, затем удален из очереди программы. Переводчик вызывается как задача задач, выполняющая ограниченное количество функций до тех пор, пока не столкнулся с функцией, помеченной как состояние ожидания (или превышает количество функций, которые необходимо вызвать). Затем он продолжается до тех пор, пока государство ждать не исчезнет. Другие задания вспоминают задания как (иногда длинные) последовательности функций, которые будут выполнены, а затем ждать результата. Таким образом, я могу ограничить количество состояний, которым мне нужно создать до 4, где мне нужно результаты. Если команда имеет «отправить, никогда не проверяйте результат», например, «Установить контраст», им вообще не нужно дискретные состояния. Таким образом, фактические состояния «ждут события и запрашиваемые данные», «ждать измерения» и «Прочитайте результаты и назначьте их правильно».

Код будет в два раза просто и в три раза более понятнее, если их записывается структурно или последовательно. За исключением того, что это не будет работать или будет работать с Abysmal Performance.

7
ответ дан 5 December 2019 в 05:03
поделиться

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

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

2
ответ дан 5 December 2019 в 05:03
поделиться

Я думаю, что если код хорошо документирован, нет проблем для реализации его использования подхода OOP. Большинство используйте C / C ++ для реализации FSM с использованием операторов переключателей, которые иногда могут поставить под угрозу читаемость, если машина большая.

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

Совет, в первый момент, я реализовал PSM-предусмотренные состояния и состояния, содержащие переходы. Однако в моем случае он оказался лучшим подходом, чтобы иметь класс для представления FSM, содержащего одну коллекцию состояний и другую переходы. Мне было легче клонировать машины (это было требование для меня) и иметь меньшую функцию перехода.

Я надеюсь, что это поможет, Карлос.

1
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: