Использование state machine в приложениях, Александр Сычев,...
Transcript of Использование state machine в приложениях, Александр Сычев,...
Александр Сычев Разработчик 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