Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Александр Сычев
Разработчик iOS
Использование конечного
автомата в приложениях
iOS state machine
•Постановка задачи
•Пример
•Другие реализации
•Заключение
iOS state machine
•Постановка задачи
•Пример
•Другие реализации
•Заключение
iOS state machine
Power OffPower On
Button 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 Model
Owns
Data and user
action binding
Owns and
updates
Notifies
UI...
iOS state machine
Бизнес-логика
iOS state machine
iOS state machine
// обработка данных
ViewController
iOS state machine
ViewController
IF (ОШИБКА) {
// обработка ошибки
} ELSE {
// обработка данных
}
iOS state machine
IF (ОШИБКА) {
// обработка ошибки
} ELSE IF (ДАННЫЕ != NULL) {
// обработка данных
} ELSE {
// нет данны...
iOS state machine
IF (ОЖИДАНИЕ) {
// ждем данные
} ELSE IF (ОШИБКА) {
// обработка ошибки
} ELSE IF (ДАННЫЕ != NULL) {
// ...
iOS state machine
IF (ОЖИДАНИЕ) {
IF (ПОВТОРНОЕ ОЖИДАНИЕ) {
// повторное ожидание
} ELSE {
// ждем данные
}
} ELSE IF (ОШИ...
iOS state machine
Недостатки
•Нечитабелен
iOS state machine
Недостатки
•Нечитабелен
•Высокий порог вхождения
iOS state machine
Недостатки
•Нечитабелен
•Высокий порог вхождения
•Высокая сложность поддержки и развития
iOS state machine
Недостатки
•Нечитабелен
•Высокий порог вхождения
•Высокая сложность поддержки и развития
•Негибкий
iOS state machine
Power OffPower On
Button click
Button click
State
Transition
Event
iOS state machine
•Постановка задачи
•Пример
•Другие реализации
•Заключение
iOS state machine
GKState
GKStateMachine
iOS state machine
GKState
GKStateMachine
iOS state machine
1.class CustomState: GKState
2.func isValidNextState(stateClass: AnyClass) -> Bool
3.func didEnterWithPr...
iOS state machine
1.class CustomState: GKState
2.func isValidNextState(stateClass: AnyClass) -> Bool
3.func didEnterWithPr...
iOS state machine
GKState
1.class CustomState: GKState
2.func isValidNextState(stateClass: AnyClass) -> Bool
3.func didEnt...
iOS state machine
GKState
1.class CustomState: GKState
2.func isValidNextState(stateClass: AnyClass) -> Bool
3.func didEnt...
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
NoData
Error
iOS state machine
Состояния
iOS state machine
2. Зададим параметры автомата
iOS state machine
Создаем состояния
let waitingDataState = WaitingDataState()
let dataAvailableState = DataAvailableState(...
iOS state machine
Задаем начальное состояние
stateMachine.enterState(WaitingDataState)
iOS state machine
Управление
enterState(WaitingDataState)
…
IF (ОШИБКА) {
enterState(ErrorState)
} ELSE IF (ДАННЫЕ != NULL...
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 On
Button click
Button click
State
Transition
Event
@sychevbrain89
Brain89
Upcoming SlideShare
Loading in …5
×

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

1,751 views

Published on

Выступление на конференции DUMP-2016.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Александр Сычев Разработчик iOS Использование конечного автомата в приложениях
  2. 2. iOS state machine •Постановка задачи •Пример •Другие реализации •Заключение
  3. 3. iOS state machine •Постановка задачи •Пример •Другие реализации •Заключение
  4. 4. iOS state machine Power OffPower On Button click Button click State Transition Event
  5. 5. iOS state machine Состояние
  6. 6. iOS state machine Состояние
  7. 7. iOS state machine Model-View-Controller ModelView ControllerSends user actions Updates Updates Notifies Mediator Strategy
  8. 8. iOS state machine VIPER
  9. 9. iOS state machine Model-View-ViewModel ModelView View Model Owns Data and user action binding Owns and updates Notifies UIKit independent
  10. 10. iOS state machine Бизнес-логика
  11. 11. iOS state machine
  12. 12. iOS state machine // обработка данных ViewController
  13. 13. iOS state machine ViewController IF (ОШИБКА) { // обработка ошибки } ELSE { // обработка данных }
  14. 14. iOS state machine IF (ОШИБКА) { // обработка ошибки } ELSE IF (ДАННЫЕ != NULL) { // обработка данных } ELSE { // нет данных } ViewController
  15. 15. iOS state machine IF (ОЖИДАНИЕ) { // ждем данные } ELSE IF (ОШИБКА) { // обработка ошибки } ELSE IF (ДАННЫЕ != NULL) { // обработка данных } ELSE { // нет данных } ViewController
  16. 16. iOS state machine IF (ОЖИДАНИЕ) { IF (ПОВТОРНОЕ ОЖИДАНИЕ) { // повторное ожидание } ELSE { // ждем данные } } ELSE IF (ОШИБКА) { IF (СИСТЕМНАЯ ОШИБКА) { // показать alert } ELSE { // показать toast } } ELSE IF (ДАННЫЕ != NULL) { IF (ДАННЫХ НЕМНОГО) { // обработка данных } ELSE { // обработка данных } } ELSE { // нет данных } ViewController
  17. 17. iOS state machine Недостатки •Нечитабелен
  18. 18. iOS state machine Недостатки •Нечитабелен •Высокий порог вхождения
  19. 19. iOS state machine Недостатки •Нечитабелен •Высокий порог вхождения •Высокая сложность поддержки и развития
  20. 20. iOS state machine Недостатки •Нечитабелен •Высокий порог вхождения •Высокая сложность поддержки и развития •Негибкий
  21. 21. iOS state machine Power OffPower On Button click Button click State Transition Event
  22. 22. iOS state machine •Постановка задачи •Пример •Другие реализации •Заключение
  23. 23. iOS state machine GKState GKStateMachine
  24. 24. iOS state machine GKState GKStateMachine
  25. 25. iOS state machine 1.class CustomState: GKState 2.func isValidNextState(stateClass: AnyClass) -> Bool 3.func didEnterWithPreviousState(previousState: GKState?) 4.func willExitWithNextState(nextState: GKState) GKState
  26. 26. iOS state machine 1.class CustomState: GKState 2.func isValidNextState(stateClass: AnyClass) -> Bool 3.func didEnterWithPreviousState(previousState: GKState?) 4.func willExitWithNextState(nextState: GKState) GKState
  27. 27. iOS state machine GKState 1.class CustomState: GKState 2.func isValidNextState(stateClass: AnyClass) -> Bool 3.func didEnterWithPreviousState(previousState: GKState?) 4.func willExitWithNextState(nextState: GKState)
  28. 28. iOS state machine GKState 1.class CustomState: GKState 2.func isValidNextState(stateClass: AnyClass) -> Bool 3.func didEnterWithPreviousState(previousState: GKState?) 4.func willExitWithNextState(nextState: GKState)
  29. 29. iOS state machine GKState GKStateMachine
  30. 30. iOS state machine GKStateMachine 1.init(states states: [GKState]) 2.func enterState(_ stateClass: AnyClass) -> Bool
  31. 31. iOS state machine GKStateMachine 1.init(states states: [GKState]) 2.func enterState(_ stateClass: AnyClass) -> Bool
  32. 32. iOS state machine 1. Опишем состояния и переходы 
 между ними
  33. 33. iOS state machine Состояния Received Waiting NoData Error
  34. 34. iOS state machine Состояния
  35. 35. iOS state machine 2. Зададим параметры автомата
  36. 36. iOS state machine Создаем состояния let waitingDataState = WaitingDataState() let dataAvailableState = DataAvailableState() let dataNotAvailableState = DataNotAvailableState() let errorState = ErrorState()
  37. 37. iOS state machine Задаем начальное состояние stateMachine.enterState(WaitingDataState)
  38. 38. iOS state machine Управление enterState(WaitingDataState) … IF (ОШИБКА) { enterState(ErrorState) } ELSE IF (ДАННЫЕ != NULL) { enterState(DataAvailableState) } ELSE { enterState(DataNotAvailableState) }
  39. 39. iOS state machine GOF
  40. 40. iOS state machine State pattern
  41. 41. iOS state machine GKStateMachine func goNextWith(_ config: AnyObject)
  42. 42. iOS state machine GKState func nextStateWith(_ config: AnyObject) -> AnyClass
  43. 43. iOS state machine Github
  44. 44. iOS state machine GameplayKit Достоинства • стандартная библиотека • проста в освоении • Objective-C / Swift
  45. 45. iOS state machine GameplayKit Недостатки • доступна с iOS 9.0 • реализации состояний и переходов тесно связаны • дубликаты состояний
  46. 46. iOS state machine •Постановка задачи •Пример •Другие реализации •Заключение
  47. 47. iOS state machine Objective-C Библиотека iOS TransitionKit 961 5.0 Shift 127 5.0? TBStateMachine 32 5.0
  48. 48. iOS state machine Библиотека iOS TransitionKit 961 5.0 Shift 127 5.0? TBStateMachine 32 5.0 Objective-C
  49. 49. iOS state machine Swift Библиотека Swift version SwiftState 452 2.2 SwiftyStateMachine 276 2.2 Transporter 218 2.2
  50. 50. iOS state machine Библиотека Swift version SwiftState 452 2.2 SwiftyStateMachine 276 2.2 Transporter 218 2.2 Swift
  51. 51. iOS state machine •Постановка задачи •Пример •Другие реализации •Заключение
  52. 52. iOS state machine Достоинства •Формализация
  53. 53. iOS state machine Достоинства •Формализация •Контроль потоков данных
  54. 54. iOS state machine Достоинства •Формализация •Контроль потоков данных •Единая точка входа для логирования
  55. 55. iOS state machine Достоинства •Формализация •Контроль потоков данных •Единая точка входа для логирования •История операций
  56. 56. iOS state machine Задачи Заказ такси
  57. 57. iOS state machine Задачи Оформление заказа
  58. 58. iOS state machine Power OffPower On Button click Button click State Transition Event @sychevbrain89 Brain89

×