Генерация классов на основе конечных автоматов повышения

Я разрабатываю сетевой сервер, который потенциально может иметь сотни состояний и действий/событий. До сих пор мне удавалось справляться с простыми операторами переключения, но теперь я чувствую потребность в конечном автомате, который я могу настроить извне с помощью текстового/xml-файла.

Что вы предлагаете для существующей конечной машины С++, которая позволяет мне настраивать состояния/события из файла извне?

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

Какие есть другие варианты?


person rjoshi    schedule 23.03.2010    source источник


Ответы (2)


Если вы хотите быть гибким, вам следует искать конечный автомат Qt http://doc.qt.nokia.com/4.6/statemachine-api.html

person Rodrigo Pinho Pereira de Souza    schedule 16.08.2010
comment
Конечный автомат QT кажется интересным, но у него есть коммерческая лицензия. - person rjoshi; 26.09.2010
comment
У них также есть лицензия с открытым исходным кодом. Во всяком случае, я не понимаю, почему некоторые люди считают коммерческую лицензию проблемой. - person Rodrigo Pinho Pereira de Souza; 26.12.2010

QP (http://www.state-machine.com) — это еще один вариант, который, на мой взгляд, весьма удобен для разработки на основе моделей. Недавно я прочитал семестровую диссертацию, которая подтверждает мое мнение: http://security.hsr.ch/mse/projects/2011_Code_Generator_for_UML_State_Machines.pdf

Теоретически вы также можете использовать интерфейс eUML boost::msm, который имеет очень бесшумный синтаксис. вот тривиальный пример из boost:

BOOST_MSM_EUML_TRANSITION_TABLE(( 
Playing  == Stopped + play [some_guard] / (some_action , start_playback) ,
Open     == Stopped + open_close/ open_drawer                            ,
Stopped  == Stopped + stop                                               ,
Empty    == Open    + open_close / close_drawer                          ,
Open     == Empty   + open_close / open_drawer                           ,
Stopped  == Empty   + cd_detected [good_disk_format] / store_cd_info
),transition_table)  

Я не знаю, насколько серьезно относиться к «экспериментальному» статусу eUML, у меня пока с этим проблем не было.

person odinthenerd    schedule 23.10.2012