Диаграммы состояний и c++
TRANSCRIPT
![Page 1: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/1.jpg)
Диаграммы состояний и C++ 1/28
http://klika-tech.com/
Диаграммы состояний и C++ 1/28
http://klika-tech.com/
Диаграммы состояний и C++или “Как разобраться с хаосом?”
Конференция C++ CoreHard Winter 2017, МинскВасилий Вяжевич
![Page 2: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/2.jpg)
Диаграммы состояний и C++ 2/28
http://klika-tech.com/
О чем поговорим?
Трудная задача (пример из жизни)Машина состоянийРеализации на C++Выводы и вопросы
![Page 3: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/3.jpg)
Диаграммы состояний и C++ 3/28
http://klika-tech.com/
Наглядный пример
Открыть воротаЗакрыть воротаЗапереть
![Page 4: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/4.jpg)
Диаграммы состояний и C++ 4/28
http://klika-tech.com/
Пример из жизниvoid openTheDoor(){ if (startMotorForward()) isOpening = true; else PrintError();}
![Page 5: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/5.jpg)
Диаграммы состояний и 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)
![Page 6: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/6.jpg)
Диаграммы состояний и C++ 6/28
http://klika-tech.com/
А что если...…нужно “чуть-чуть” изменить структуру алгоритма?
![Page 7: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/7.jpg)
Диаграммы состояний и C++ 7/28
http://klika-tech.com/
Будьте честными!Часто ли вы делаете блок схемы алгоритмов?Можете ли вы легко объяснить как работает Вашапрограмма?
![Page 8: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/8.jpg)
Диаграммы состояний и C++ 8/28
http://klika-tech.com/
А какая альтернатива?StateClosed::react(const Event<Open>& event){ if (startMotorForward()) transit<StateOpening>(); else transit<StateFail>(&Door::DisplayMotorError(), event);}
![Page 9: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/9.jpg)
Диаграммы состояний и C++ 9/28
http://klika-tech.com/
Терминология
Машина состоянийКонечный автоматДиаграмма состоянийFinite State Machine (FSM)Statechart
![Page 10: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/10.jpg)
Диаграммы состояний и C++ 10/28
http://klika-tech.com/
Что такое Машина состояния?
Математическая модель, абстракцияМодель или подход к проектированию
![Page 11: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/11.jpg)
Диаграммы состояний и C++ 11/28
http://klika-tech.com/
Реализации для C++
Open sourceQt (Core / QML)BoostCustom
![Page 12: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/12.jpg)
Диаграммы состояний и C++ 12/28
http://klika-tech.com/
Свойства машин состоянийАвтономностьДетерминированность состоянийОснована на событиях (во времени)Конечность или цикличность
![Page 13: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/13.jpg)
Диаграммы состояний и C++ 13/28
http://klika-tech.com/
ПримитивыСостояния (States)Переходы (Transitions)События (Events)Действия (Actions)
![Page 14: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/14.jpg)
Диаграммы состояний и C++ 14/28
http://klika-tech.com/
Иерархии и ортогональные состояния
![Page 15: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/15.jpg)
Диаграммы состояний и C++ 15/28
http://klika-tech.com/
Практическая польза
Проектирование и документированиеПомогает избежать сложного ветвленияОпределенность последовательности событий“Ограничение свободы”
![Page 16: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/16.jpg)
Диаграммы состояний и C++ 16/28
http://klika-tech.com/
Примеры примененияПротоколы обменаСистемы самообслуживанияСистемы автоматики, управленияИнтерактивные игры
![Page 17: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/17.jpg)
Диаграммы состояний и C++ 17/28
http://klika-tech.com/
Реализацииcust. Qt2) MSM3) StCh 4) NSF5)
Static + - + + -Hierarchy - + - + -
Table - + + - -History - + - + +
Ortogonal - + - + +Serialize + + + + +
Cust. - реализация через оператор switch/caseStCh - Boost.Statechart
NSF - UML North State Framework
![Page 18: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/18.jpg)
Диаграммы состояний и C++ 18/28
http://klika-tech.com/
switch/casestatic 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: ...}
![Page 19: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/19.jpg)
Диаграммы состояний и C++ 19/28
http://klika-tech.com/
Qt State Machine FrameworkQStateMachine 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);
![Page 20: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/20.jpg)
Диаграммы состояний и C++ 20/28
http://klika-tech.com/
Boost.Statechartstruct 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;};
![Page 21: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/21.jpg)
Диаграммы состояний и C++ 21/28
http://klika-tech.com/
Boost Meta State Machinestruct 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 >,// +---------+------------+-----------+-------------------+> {};
![Page 22: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/22.jpg)
Диаграммы состояний и C++ 22/28
http://klika-tech.com/
Бонусы от реализацийОтсроченные события (deferred events)История состояний (History)Сериализация машин состоянийКонтроль переходов состоянийТестирование (Unit testing)
![Page 23: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/23.jpg)
Диаграммы состояний и C++ 23/28
http://klika-tech.com/
Отсроченные события
![Page 24: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/24.jpg)
Диаграммы состояний и C++ 24/28
http://klika-tech.com/
История состояний
![Page 25: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/25.jpg)
Диаграммы состояний и C++ 25/28
http://klika-tech.com/
Сериализация
![Page 26: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/26.jpg)
Диаграммы состояний и C++ 26/28
http://klika-tech.com/
Контроль переходов
![Page 27: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/27.jpg)
Диаграммы состояний и C++ 27/28
http://klika-tech.com/
ЗаключениеЗачем? - Формализация процесса разработки, проектированиеи документирование.Для чего? - Алгоритмы основанные на событиях.Почему FSM? - Если не знаете ничего лучше…
![Page 28: Диаграммы состояний и c++](https://reader031.vdocuments.site/reader031/viewer/2022021814/58abcaf71a28ab68068b5ad1/html5/thumbnails/28.jpg)
Диаграммы состояний и C++ 28/28
http://klika-tech.com/
Вопросы?Тема: Диаграммы состояний и С++.
Докладчик: Василий Вяжевич
Компания: Klika Tech,http://klika-tech.com/,
[email protected]) Внимание! Все названия переменных и алгоритмы вымышленные, любые совпадения случайны!2) http://doc.qt.io/qt-5/statemachine.html3) http://www.boost.org/doc/libs/1_63_0/libs/msm/doc/HTML/index.html4) http://www.boost.org/doc/libs/1_63_0/libs/statechart/doc/index.html5) http://northstatesoftware.github.io/NorthStateFramework-cpp/