Использование state machine в приложениях, Александр Сычев,...

58
Александр Сычев Разработчик iOS Использование конечного автомата в приложениях

Upload: it-people

Post on 23-Jan-2018

1.741 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

Александр Сычев Разработчик iOS

Использование конечного автомата в приложениях

Page 2: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

•Постановка задачи

•Пример

•Другие реализации

•Заключение

Page 3: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

•Постановка задачи

•Пример

•Другие реализации

•Заключение

Page 4: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

Page 5: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Состояние

Page 6: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Состояние

Page 7: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Model-View-Controller

ModelView

ControllerSends user actions

Updates

Updates

Notifies

Mediator Strategy

Page 8: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

VIPER

Page 9: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Model-View-ViewModel

ModelView

View ModelOwns

Data and user action binding

Owns and updates

Notifies

UIKit independent

Page 10: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Бизнес-логика

Page 11: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Page 12: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

// обработка данных

ViewController

Page 13: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

ViewController

IF (ОШИБКА) { // обработка ошибки } ELSE { // обработка данных }

Page 14: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

IF (ОШИБКА) { // обработка ошибки } ELSE IF (ДАННЫЕ != NULL) { // обработка данных } ELSE { // нет данных }

ViewController

Page 15: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

IF (ОЖИДАНИЕ) { // ждем данные } ELSE IF (ОШИБКА) { // обработка ошибки } ELSE IF (ДАННЫЕ != NULL) { // обработка данных } ELSE { // нет данных

}

ViewController

Page 16: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

IF (ОЖИДАНИЕ) { IF (ПОВТОРНОЕ ОЖИДАНИЕ) { // повторное ожидание } ELSE { // ждем данные } } ELSE IF (ОШИБКА) { IF (СИСТЕМНАЯ ОШИБКА) { // показать alert } ELSE { // показать toast } } ELSE IF (ДАННЫЕ != NULL) { IF (ДАННЫХ НЕМНОГО) { // обработка данных } ELSE { // обработка данных } } ELSE { // нет данных }

ViewController

Page 17: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Недостатки

•Нечитабелен

Page 18: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Недостатки

•Нечитабелен

•Высокий порог вхождения

Page 19: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Недостатки

•Нечитабелен

•Высокий порог вхождения

•Высокая сложность поддержки и развития

Page 20: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Недостатки

•Нечитабелен

•Высокий порог вхождения

•Высокая сложность поддержки и развития

•Негибкий

Page 21: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

Page 22: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

•Постановка задачи

•Пример

•Другие реализации

•Заключение

Page 23: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateGKStateMachine

Page 24: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateGKStateMachine

Page 25: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

1.class CustomState: GKState

2.func isValidNextState(stateClass: AnyClass) -> Bool

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

GKState

Page 26: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

1.class CustomState: GKState

2.func isValidNextState(stateClass: AnyClass) -> Bool

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

GKState

Page 27: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKState

1.class CustomState: GKState

2.func isValidNextState(stateClass: AnyClass) -> Bool

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

Page 28: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKState

1.class CustomState: GKState

2.func isValidNextState(stateClass: AnyClass) -> Bool

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

Page 29: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateGKStateMachine

Page 30: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateMachine

1.init(states states: [GKState])

2.func enterState(_ stateClass: AnyClass) -> Bool

Page 31: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateMachine

1.init(states states: [GKState])

2.func enterState(_ stateClass: AnyClass) -> Bool

Page 32: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

1. Опишем состояния и переходы между ними

Page 33: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Состояния

Received

Waiting

NoData

Error

Page 34: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Состояния

Page 35: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

2. Зададим параметры автомата

Page 36: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Создаем состояния

let waitingDataState = WaitingDataState()

let dataAvailableState = DataAvailableState()

let dataNotAvailableState = DataNotAvailableState()

let errorState = ErrorState()

Page 37: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Задаем начальное состояние

stateMachine.enterState(WaitingDataState)

Page 38: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Управление

enterState(WaitingDataState) … IF (ОШИБКА) { enterState(ErrorState) } ELSE IF (ДАННЫЕ != NULL) { enterState(DataAvailableState) } ELSE { enterState(DataNotAvailableState) }

Page 39: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GOF

Page 40: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

State pattern

Page 41: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKStateMachine

func goNextWith(_ config: AnyObject)

Page 42: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GKState

func nextStateWith(_ config: AnyObject) -> AnyClass

Page 43: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Github

Page 44: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GameplayKit

Достоинства • стандартная библиотека • проста в освоении • Objective-C / Swift

Page 45: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

GameplayKit

Недостатки • доступна с iOS 9.0 • реализации состояний и переходов тесно связаны

• дубликаты состояний

Page 46: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

•Постановка задачи

•Пример

•Другие реализации

•Заключение

Page 47: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Objective-C

Библиотека iOS

TransitionKit 961 5.0

Shift 127 5.0?

TBStateMachine 32 5.0

Page 48: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Библиотека iOS

TransitionKit 961 5.0

Shift 127 5.0?

TBStateMachine 32 5.0

Objective-C

Page 49: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Swift

Библиотека Swift version

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

Page 50: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Библиотека Swift version

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

Swift

Page 51: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

•Постановка задачи

•Пример

•Другие реализации

•Заключение

Page 52: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Достоинства

•Формализация

Page 53: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Достоинства

•Формализация

•Контроль потоков данных

Page 54: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Достоинства

•Формализация

•Контроль потоков данных

•Единая точка входа для логирования

Page 55: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Достоинства

•Формализация

•Контроль потоков данных

•Единая точка входа для логирования

•История операций

Page 56: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

ЗадачиЗаказ такси

Page 57: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

ЗадачиОформление заказа

Page 58: Использование state machine в приложениях, Александр Сычев, Rambler&Co, Москва

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

@sychevbrain89

Brain89