Вы находитесь на странице: 1из 58

Использование конечного

автомата в приложениях

Александр Сычев
Разработчик iOS
• Постановка задачи
• Пример
• Другие реализации
• Заключение

iOS state machine


• Постановка задачи
• Пример
• Другие реализации
• Заключение

iOS state machine


State
Event

Button click
Power On Power Off
Button click

Transition

iOS state machine


Состояние

iOS state machine


Состояние

iOS state machine


Model-View-Controller

Mediator Strategy

Sends user Controller


Updates
actions

View Updates Notifies Model

iOS state machine


VIPER

iOS state machine


Model-View-ViewModel

UIKit independent

View Model Owns and


Owns
updates

View Data and user Notifies Model


action binding

iOS state machine


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

iOS state machine


iOS state machine
ViewController

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

iOS state machine


ViewController

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

iOS state machine


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

iOS state machine


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

iOS state machine


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

iOS state machine


Недостатки

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

iOS state machine


Недостатки

• Нечитабелен
• Высокий порог вхождения

iOS state machine


Недостатки

• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития

iOS state machine


Недостатки

• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития
• Негибкий

iOS state machine


State
Event

Button click
Power On Power Off
Button click

Transition

iOS state machine


• Постановка задачи
• Пример
• Другие реализации
• Заключение

iOS state machine


GKState
GKStateMachine

iOS state machine


GKState
GKStateMachine

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


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


GKState
GKStateMachine

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 Error

NoData

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


Objective-C

Библиотека iOS

TransitionKit 961 5.0

Shift 127 5.0?

TBStateMachine 32 5.0

iOS state machine


Swift

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

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

iOS state machine


Swift

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

SwiftState 452 2.2

SwiftyStateMachine 276 2.2

Transporter 218 2.2

iOS state machine


• Постановка задачи
• Пример
• Другие реализации
• Заключение

iOS state machine


Достоинства

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

iOS state machine


Достоинства

• Формализация
• Контроль потоков данных

iOS state machine


Достоинства

• Формализация
• Контроль потоков данных
• Единая точка входа для логирования

iOS state machine


Достоинства

• Формализация
• Контроль потоков данных
• Единая точка входа для логирования
• История операций

iOS state machine


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

iOS state machine


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

iOS state machine


State
Event

Button click
Power On Power Off
Button click

Transition

@sychevbrain89

Brain89

iOS state machine

Оценить