Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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.

Libros relacionados

Gratis con una prueba de 30 días de Scribd

Ver todo
  • Inicia sesión para ver los comentarios

  • Sé el primero en recomendar esto

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/

×