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

Post on 23-Jan-2018

1.742 Views

Category:

Internet

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

iOS state machine

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

•Пример

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

•Заключение

iOS state machine

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

•Пример

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

•Заключение

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

iOS state machine

Состояние

iOS state machine

Состояние

iOS state machine

Model-View-Controller

ModelView

ControllerSends user actions

Updates

Updates

Notifies

Mediator Strategy

iOS state machine

VIPER

iOS state machine

Model-View-ViewModel

ModelView

View ModelOwns

Data and user action binding

Owns and updates

Notifies

UIKit independent

iOS state machine

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

iOS state machine

iOS state machine

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

ViewController

iOS state machine

ViewController

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

iOS state machine

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

ViewController

iOS state machine

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

}

ViewController

iOS state machine

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

ViewController

iOS state machine

Недостатки

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

iOS state machine

Недостатки

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

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

iOS state machine

Недостатки

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

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

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

iOS state machine

Недостатки

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

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

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

•Негибкий

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

iOS state machine

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

•Пример

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

•Заключение

iOS state machine

GKStateGKStateMachine

iOS state machine

GKStateGKStateMachine

iOS state machine

1.class CustomState: GKState

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

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

GKState

iOS state machine

1.class CustomState: GKState

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

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

GKState

iOS state machine

GKState

1.class CustomState: GKState

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

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

iOS state machine

GKState

1.class CustomState: GKState

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

3.func didEnterWithPreviousState(previousState: GKState?)

4.func willExitWithNextState(nextState: GKState)

iOS state machine

GKStateGKStateMachine

iOS state machine

GKStateMachine

1.init(states states: [GKState])

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

iOS state machine

GKStateMachine

1.init(states states: [GKState])

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

iOS state machine

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

iOS state machine

Состояния

Received

Waiting

NoData

Error

iOS state machine

Состояния

iOS state machine

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

iOS state machine

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

let waitingDataState = WaitingDataState()

let dataAvailableState = DataAvailableState()

let dataNotAvailableState = DataNotAvailableState()

let errorState = ErrorState()

iOS state machine

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

stateMachine.enterState(WaitingDataState)

iOS state machine

Управление

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

iOS state machine

GOF

iOS state machine

State pattern

iOS state machine

GKStateMachine

func goNextWith(_ config: AnyObject)

iOS state machine

GKState

func nextStateWith(_ config: AnyObject) -> AnyClass

iOS state machine

Github

iOS state machine

GameplayKit

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

iOS state machine

GameplayKit

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

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

iOS state machine

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

•Пример

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

•Заключение

iOS state machine

Objective-C

Библиотека iOS

TransitionKit 961 5.0

Shift 127 5.0?

TBStateMachine 32 5.0

iOS state machine

Библиотека iOS

TransitionKit 961 5.0

Shift 127 5.0?

TBStateMachine 32 5.0

Objective-C

iOS state machine

Swift

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

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

iOS state machine

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

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

Swift

iOS state machine

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

•Пример

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

•Заключение

iOS state machine

Достоинства

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

iOS state machine

Достоинства

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

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

iOS state machine

Достоинства

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

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

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

iOS state machine

Достоинства

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

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

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

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

iOS state machine

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

iOS state machine

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

iOS state machine

Power OffPower OnButton click

Button click

State

Transition

Event

@sychevbrain89

Brain89

top related