Диаграммы состояний и c++

28
Диаграммы состояний и C++ 1/28 http://klika-tech.com/ Диаграммы состояний и C++ 1/28 http://klika-tech.com/ Диаграммы состояний и C++ или “Как разобраться с хаосом?” Конференция C++ CoreHard Winter 2017, Минск Василий Вяжевич

Upload: corehardby

Post on 12-Apr-2017

278 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Диаграммы состояний и c++

Диаграммы состояний и C++ 1/28

http://klika-tech.com/

Диаграммы состояний и C++ 1/28

http://klika-tech.com/

Диаграммы состояний и C++или “Как разобраться с хаосом?”

Конференция C++ CoreHard Winter 2017, МинскВасилий Вяжевич

Page 2: Диаграммы состояний и c++

Диаграммы состояний и C++ 2/28

http://klika-tech.com/

О чем поговорим?

Трудная задача (пример из жизни)Машина состоянийРеализации на C++Выводы и вопросы

Page 3: Диаграммы состояний и c++

Диаграммы состояний и C++ 3/28

http://klika-tech.com/

Наглядный пример

Открыть воротаЗакрыть воротаЗапереть

Page 4: Диаграммы состояний и c++

Диаграммы состояний и C++ 4/28

http://klika-tech.com/

Пример из жизниvoid openTheDoor(){ if (startMotorForward()) isOpening = true; else PrintError();}

Page 5: Диаграммы состояний и c++

Диаграммы состояний и 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++

Диаграммы состояний и C++ 6/28

http://klika-tech.com/

А что если...…нужно “чуть-чуть” изменить структуру алгоритма?

Page 7: Диаграммы состояний и c++

Диаграммы состояний и C++ 7/28

http://klika-tech.com/

Будьте честными!Часто ли вы делаете блок схемы алгоритмов?Можете ли вы легко объяснить как работает Вашапрограмма?

Page 8: Диаграммы состояний и c++

Диаграммы состояний и 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++

Диаграммы состояний и C++ 9/28

http://klika-tech.com/

Терминология

Машина состоянийКонечный автоматДиаграмма состоянийFinite State Machine (FSM)Statechart

Page 10: Диаграммы состояний и c++

Диаграммы состояний и C++ 10/28

http://klika-tech.com/

Что такое Машина состояния?

Математическая модель, абстракцияМодель или подход к проектированию

Page 11: Диаграммы состояний и c++

Диаграммы состояний и C++ 11/28

http://klika-tech.com/

Реализации для C++

Open sourceQt (Core / QML)BoostCustom

Page 12: Диаграммы состояний и c++

Диаграммы состояний и C++ 12/28

http://klika-tech.com/

Свойства машин состоянийАвтономностьДетерминированность состоянийОснована на событиях (во времени)Конечность или цикличность

Page 13: Диаграммы состояний и c++

Диаграммы состояний и C++ 13/28

http://klika-tech.com/

ПримитивыСостояния (States)Переходы (Transitions)События (Events)Действия (Actions)

Page 14: Диаграммы состояний и c++

Диаграммы состояний и C++ 14/28

http://klika-tech.com/

Иерархии и ортогональные состояния

Page 15: Диаграммы состояний и c++

Диаграммы состояний и C++ 15/28

http://klika-tech.com/

Практическая польза

Проектирование и документированиеПомогает избежать сложного ветвленияОпределенность последовательности событий“Ограничение свободы”

Page 16: Диаграммы состояний и c++

Диаграммы состояний и C++ 16/28

http://klika-tech.com/

Примеры примененияПротоколы обменаСистемы самообслуживанияСистемы автоматики, управленияИнтерактивные игры

Page 17: Диаграммы состояний и c++

Диаграммы состояний и 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++

Диаграммы состояний и 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++

Диаграммы состояний и 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++

Диаграммы состояний и 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++

Диаграммы состояний и 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++

Диаграммы состояний и C++ 22/28

http://klika-tech.com/

Бонусы от реализацийОтсроченные события (deferred events)История состояний (History)Сериализация машин состоянийКонтроль переходов состоянийТестирование (Unit testing)

Page 23: Диаграммы состояний и c++

Диаграммы состояний и C++ 23/28

http://klika-tech.com/

Отсроченные события

Page 24: Диаграммы состояний и c++

Диаграммы состояний и C++ 24/28

http://klika-tech.com/

История состояний

Page 25: Диаграммы состояний и c++

Диаграммы состояний и C++ 25/28

http://klika-tech.com/

Сериализация

Page 26: Диаграммы состояний и c++

Диаграммы состояний и C++ 26/28

http://klika-tech.com/

Контроль переходов

Page 27: Диаграммы состояний и c++

Диаграммы состояний и C++ 27/28

http://klika-tech.com/

ЗаключениеЗачем? - Формализация процесса разработки, проектированиеи документирование.Для чего? - Алгоритмы основанные на событиях.Почему FSM? - Если не знаете ничего лучше…

Page 28: Диаграммы состояний и c++

Диаграммы состояний и 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/