Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Finite State Machines and C++

Finite-state machine introduction and motivation. Overview of few existing finite-state machines C++ implementations (Qt, Boost, etc.). Overview of using Boost.Statechart library. Best practices using Boost.Statechart and C++ code samples.

  • Login to see the comments

  • Be the first to like this

Finite State Machines and C++

  1. 1. Диаграммы состояний и C++ 1/28 http://klika-tech.com/ Диаграммы состояний и C++ 1/28 http://klika-tech.com/ Диаграммы состояний и C++ или “Как разобраться с хаосом?” Конференция C++ CoreHard Winter 2017, Минск Василий Вяжевич
  2. 2. Диаграммы состояний и C++ 2/28 http://klika-tech.com/ О чем поговорим? Трудная задача (пример из жизни) Машина состояний Реализации на C++ Выводы и вопросы
  3. 3. Диаграммы состояний и C++ 3/28 http://klika-tech.com/ Наглядный пример Открыть ворота Закрыть ворота Запереть
  4. 4. Диаграммы состояний и C++ 4/28 http://klika-tech.com/ Пример из жизни void openTheDoor() { if (startMotorForward()) isOpening = true; else PrintError(); }
  5. 5. Диаграммы состояний и C++ 5/28 http://klika-tech.com/ Через XX-цать недель void openTheDoor() { while (!isOpened && !fail && !close) { if (isOpened || isOpening) { return; } else if ((closed && !locked && !isOpening) || (!closed && !opened && !isOpening)) { if (poweredOn && startMotorForward()) isOpening = true; } else if (locked && closed) { displayLockedMessage(); return; } Sleep(100); } if (close) closeTheDoor(); } А что если… 1)
  6. 6. Диаграммы состояний и C++ 6/28 http://klika-tech.com/ А что если... …нужно “чуть-чуть” изменить структуру алгоритма?
  7. 7. Диаграммы состояний и C++ 7/28 http://klika-tech.com/ Будьте честными! Часто ли вы делаете блок схемы алгоритмов? Можете ли вы легко объяснить как работает Ваша программа?
  8. 8. Диаграммы состояний и C++ 8/28 http://klika-tech.com/ А какая альтернатива? StateClosed::react(const Event<Open>& event) { if (startMotorForward()) transit<StateOpening>(); else transit<StateFail>(&Door::DisplayMotorError(), event); }
  9. 9. Диаграммы состояний и C++ 9/28 http://klika-tech.com/ Терминология Машина состояний Конечный автомат Диаграмма состояний Finite State Machine (FSM) Statechart
  10. 10. Диаграммы состояний и C++ 10/28 http://klika-tech.com/ Что такое Машина состояния? Математическая модель, абстракция Модель или подход к проектированию
  11. 11. Диаграммы состояний и C++ 11/28 http://klika-tech.com/ Реализации для C++ Open source Qt (Core / QML) Boost Custom
  12. 12. Диаграммы состояний и C++ 12/28 http://klika-tech.com/ Свойства машин состояний Автономность Детерминированность состояний Основана на событиях (во времени) Конечность или цикличность
  13. 13. Диаграммы состояний и C++ 13/28 http://klika-tech.com/ Примитивы Состояния (States) Переходы (Transitions) События (Events) Действия (Actions)
  14. 14. Диаграммы состояний и C++ 14/28 http://klika-tech.com/ Иерархии и ортогональные состояния
  15. 15. Диаграммы состояний и C++ 15/28 http://klika-tech.com/ Практическая польза Проектирование и документирование Помогает избежать сложного ветвления Определенность последовательности событий “Ограничение свободы”
  16. 16. Диаграммы состояний и C++ 16/28 http://klika-tech.com/ Примеры применения Протоколы обмена Системы самообслуживания Системы автоматики, управления Интерактивные игры
  17. 17. Диаграммы состояний и C++ 17/28 http://klika-tech.com/ Реализации cust. Qt 2) MSM 3) StCh 4) NSF 5) Static + - + + - Hierarchy - + - + - Table - + + - - History - + - + + Ortogonal - + - + + Serialize + + + + + Cust. - реализация через оператор switch/case StCh - Boost.Statechart NSF - UML North State Framework
  18. 18. Диаграммы состояний и C++ 18/28 http://klika-tech.com/ switch/case static int currentState = CLOSED; switch (currentState) { case CLOSED: if (event == OPEN) currentState = OPENED; else if (event == LOCK) currentState = LOCKED; break; case OPENED: if (event == CLOSE) currentState = CLOSED; break; case LOCKED: ... }
  19. 19. Диаграммы состояний и C++ 19/28 http://klika-tech.com/ Qt State Machine Framework QStateMachine Door; QState *stateOpened = new QState(); QState *stateClosed = new QState(); QState *stateLocked = new QState(); stateOpened->addTransition(ctrl, SIGNAL(close()), stateClosed); stateClosed->addTransition(ctrl, SIGNAL(open()), stateOpened); stateLocked->addTransition(ctrl, SIGNAL(lockTrigger()), stateClosed); stateClosed->addTransition(ctrl, SIGNAL(lockTrigger()), stateLocked);
  20. 20. Диаграммы состояний и C++ 20/28 http://klika-tech.com/ Boost.Statechart struct Open : sc::event<Open> {}; struct Close : sc::event<Close> {}; struct LockTrigger : sc::event<LockTrigger> {}; struct Opened : sc::simple_state<Opened, Door> { typedef sc::transition<Close, Closed> reactions; }; struct Closed : sc::simple_state<Closed, Door> { typedef mpl::list<sc::transition<Open, Opened> sc::transition<LockTrigger, Locked> > reactions; }; struct Locked : sc::simple_state<Locked, Door> { typedef sc::transition<LockTrigger, Closed> reactions; };
  21. 21. Диаграммы состояний и C++ 21/28 http://klika-tech.com/ Boost Meta State Machine struct transition_table : mpl::vector< // Start Event Target Action // +---------+------------+-----------+-------------------+ a_row< Closed , open , Opened , &door_::motorFwd >, a_row< Closed , lock , Locked , &door_::lock >, a_row< Locked , lock , Closed , &door_::unlock >, a_row< Opened , close , Closed , &door_::motorBack >, // +---------+------------+-----------+-------------------+ > {};
  22. 22. Диаграммы состояний и C++ 22/28 http://klika-tech.com/ Бонусы от реализаций Отсроченные события (deferred events) История состояний (History) Сериализация машин состояний Контроль переходов состояний Тестирование (Unit testing)
  23. 23. Диаграммы состояний и C++ 23/28 http://klika-tech.com/ Отсроченные события
  24. 24. Диаграммы состояний и C++ 24/28 http://klika-tech.com/ История состояний
  25. 25. Диаграммы состояний и C++ 25/28 http://klika-tech.com/ Сериализация
  26. 26. Диаграммы состояний и C++ 26/28 http://klika-tech.com/ Контроль переходов
  27. 27. Диаграммы состояний и C++ 27/28 http://klika-tech.com/ Заключение Зачем? - Формализация процесса разработки, проектирование и документирование. Для чего? - Алгоритмы основанные на событиях. Почему FSM? - Если не знаете ничего лучше…
  28. 28. Диаграммы состояний и C++ 28/28 http://klika-tech.com/ Вопросы? Тема: Диаграммы состояний и С++. Докладчик: Василий Вяжевич Компания: Klika Tech, http://klika-tech.com/, vviazhevich@klika-tech.com 1) Внимание! Все названия переменных и алгоритмы вымышленные, любые совпадения случайны! 2) http://doc.qt.io/qt-5/statemachine.html 3) http://www.boost.org/doc/libs/1_63_0/libs/msm/doc/HTML/index.html 4) http://www.boost.org/doc/libs/1_63_0/libs/statechart/doc/index.html 5) http://northstatesoftware.github.io/NorthStateFramework-cpp/

×