View
278
Download
0
Category
Preview:
Citation preview
Диаграммы состояний и C++ 1/28
http://klika-tech.com/
Диаграммы состояний и C++ 1/28
http://klika-tech.com/
Диаграммы состояний и C++или “Как разобраться с хаосом?”
Конференция C++ CoreHard Winter 2017, МинскВасилий Вяжевич
Диаграммы состояний и C++ 2/28
http://klika-tech.com/
О чем поговорим?
Трудная задача (пример из жизни)Машина состоянийРеализации на C++Выводы и вопросы
Диаграммы состояний и C++ 3/28
http://klika-tech.com/
Наглядный пример
Открыть воротаЗакрыть воротаЗапереть
Диаграммы состояний и C++ 4/28
http://klika-tech.com/
Пример из жизниvoid openTheDoor(){ if (startMotorForward()) isOpening = true; else PrintError();}
Диаграммы состояний и 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)
Диаграммы состояний и C++ 6/28
http://klika-tech.com/
А что если...…нужно “чуть-чуть” изменить структуру алгоритма?
Диаграммы состояний и C++ 7/28
http://klika-tech.com/
Будьте честными!Часто ли вы делаете блок схемы алгоритмов?Можете ли вы легко объяснить как работает Вашапрограмма?
Диаграммы состояний и C++ 8/28
http://klika-tech.com/
А какая альтернатива?StateClosed::react(const Event<Open>& event){ if (startMotorForward()) transit<StateOpening>(); else transit<StateFail>(&Door::DisplayMotorError(), event);}
Диаграммы состояний и C++ 9/28
http://klika-tech.com/
Терминология
Машина состоянийКонечный автоматДиаграмма состоянийFinite State Machine (FSM)Statechart
Диаграммы состояний и C++ 10/28
http://klika-tech.com/
Что такое Машина состояния?
Математическая модель, абстракцияМодель или подход к проектированию
Диаграммы состояний и C++ 11/28
http://klika-tech.com/
Реализации для C++
Open sourceQt (Core / QML)BoostCustom
Диаграммы состояний и C++ 12/28
http://klika-tech.com/
Свойства машин состоянийАвтономностьДетерминированность состоянийОснована на событиях (во времени)Конечность или цикличность
Диаграммы состояний и C++ 13/28
http://klika-tech.com/
ПримитивыСостояния (States)Переходы (Transitions)События (Events)Действия (Actions)
Диаграммы состояний и C++ 14/28
http://klika-tech.com/
Иерархии и ортогональные состояния
Диаграммы состояний и C++ 15/28
http://klika-tech.com/
Практическая польза
Проектирование и документированиеПомогает избежать сложного ветвленияОпределенность последовательности событий“Ограничение свободы”
Диаграммы состояний и C++ 16/28
http://klika-tech.com/
Примеры примененияПротоколы обменаСистемы самообслуживанияСистемы автоматики, управленияИнтерактивные игры
Диаграммы состояний и 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
Диаграммы состояний и 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: ...}
Диаграммы состояний и 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);
Диаграммы состояний и 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;};
Диаграммы состояний и 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 >,// +---------+------------+-----------+-------------------+> {};
Диаграммы состояний и C++ 22/28
http://klika-tech.com/
Бонусы от реализацийОтсроченные события (deferred events)История состояний (History)Сериализация машин состоянийКонтроль переходов состоянийТестирование (Unit testing)
Диаграммы состояний и C++ 23/28
http://klika-tech.com/
Отсроченные события
Диаграммы состояний и C++ 24/28
http://klika-tech.com/
История состояний
Диаграммы состояний и C++ 25/28
http://klika-tech.com/
Сериализация
Диаграммы состояний и C++ 26/28
http://klika-tech.com/
Контроль переходов
Диаграммы состояний и C++ 27/28
http://klika-tech.com/
ЗаключениеЗачем? - Формализация процесса разработки, проектированиеи документирование.Для чего? - Алгоритмы основанные на событиях.Почему FSM? - Если не знаете ничего лучше…
Диаграммы состояний и C++ 28/28
http://klika-tech.com/
Вопросы?Тема: Диаграммы состояний и С++.
Докладчик: Василий Вяжевич
Компания: Klika Tech,http://klika-tech.com/,
vviazhevich@klika-tech.com1) Внимание! Все названия переменных и алгоритмы вымышленные, любые совпадения случайны!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/
Recommended