Конечные автоматы обычно рассматривают как плохой дизайн в ООП?
Я слышу что много. И, после того, как я должен был работать над действительно старой, недокументированной частью C++, использующего его, я склонен соглашаться. Это была боль для отладки.
что относительно проблем удобочитаемости/пригодности для обслуживания?
FSMS никогда не следует считать плохим. Они слишком полезны, но люди, которых не привыкли к ним, часто рассмотрит их обременительными.
Существует множество способов реализации одного с OOP. Некоторые уродливы, чем другие. Ваши низкоуровневые парни будут использовать операторы переключения, прыгать в таблицах или даже «goto».
Если вы ищете более чистый способ сделать это, я бы порекомендовал Библиотеку государственного диаграммы Boost , которая построен только для реализации диаграмм состояния UML в C ++. Он использует современные методы шаблона, чтобы сделать вещи более читаемыми. Это также очень хорошо выполняет.
Не могу сказать, что они говорят.
Но OO и FSM вроде как атакуют разные проблемные домены. В домене, где взаимодействуют объекты - это требует объектно-ориентированного подхода. В домене, где мир находится в том или ином состоянии - это требует объектно-ориентированного подхода.
Реалистично, вы можете смешивать эти конструкции с/на разных уровнях абстракции, которые будут выходить чище, чем использование только одного или другого.
Конечные состоятельные машины - это инструмент для достижения определенного конца. Как любой инструмент, они также могут быть оскорблены.
Это не самые милые инструменты, но работа, в которой они хороши, - это невозможно добиться другими средствами (и обычно любой другой подход, затем обречен, чтобы быть ужасным беспорядком в тысячу раз хуже машины).
Работа работает в условиях, когда классические состояния ожидания запрещены.
Я должен прочитать сенсорный экран. Чтобы прочитать позицию, я должен обменять около 15 команд над SPI. Мне нужны хорошие 100 считываний секунды. Я должен подождать около 1 микросекунда после каждой команды, для соответствующего оживленного флага, чтобы исчезнуть, прежде чем я смогу продолжить. Существует также ряд других операций, которые должны быть достижены по одному и тому же интерфейсу, подобно настройке контрастности, изменяющиеся режимы, включение или выключение подсветки, температуру считывания. Если я выступил в то время как (busy_bit);
для каждого ожидания, я бы съел весь процессор в вопросе моментов. Если бы я сделал SCEN_YIELD ()
или Usleep (1)
, я бы никогда не достигли количества показателей, которые я хочу. Единственный способ - это конечный станок.
Но есть способы сделать конечный государственный автомат тоже приятно. Скрыть машину за кулисами и дайте разработчикам функции работать с.
Мой опыт работы до сих пор доминировал 2 системы, основанные на 3 различных конечных станках.
Код будет в два раза просто и в три раза более понятнее, если их записывается структурно или последовательно. За исключением того, что это не будет работать или будет работать с Abysmal Performance.
Я бы сказал, что машины с конечным состоянием гораздо легче отлаживать, чем другие способы решения тех же проблем (такие проблемы, как совмещение обычных языков). Что хорошего в FSM, так это то, что все в названии... у вас может быть машина с 15 состояниями, так что вы можете нарисовать диаграмму на листе бумаги, показывающую все переходы. Вы можете использовать диаграмму, чтобы выяснить полезные свойства системы, например, какие строки она принимает и как она попадает в состояние ошибки. В более сложных системах построение диаграмм часто бывает трудным или невозможным.
Даже люди, которые говорят "готос - зло", думают, что это правильный способ реализации государственных машин. (Конечно, некоторые люди думают, что "готос" - это всегда зло... но вы не можете угодить всем).
Я думаю, что если код хорошо документирован, нет проблем для реализации его использования подхода OOP. Большинство используйте C / C ++ для реализации FSM с использованием операторов переключателей, которые иногда могут поставить под угрозу читаемость, если машина большая.
Недавно мне нужно было разобрать обычный язык и реализовал FSM с использованием подхода OOP, чтение и ремонтопригодность кода была хорошей. Я имею в виду, намного лучше, чем использование крупных выключателей.
Совет, в первый момент, я реализовал PSM-предусмотренные состояния и состояния, содержащие переходы. Однако в моем случае он оказался лучшим подходом, чтобы иметь класс для представления FSM, содержащего одну коллекцию состояний и другую переходы. Мне было легче клонировать машины (это было требование для меня) и иметь меньшую функцию перехода.
Я надеюсь, что это поможет, Карлос.