Для устойчивого развития проекта требуется правильная организация потоков данных и управления. Если на эту задачу не обращать внимания и положиться на случай, то со временем в программном коде появляются места с запутанной логикой, в которых даже опытному разработчику тяжело сориентироваться.
В своем докладе я покажу и расскажу, как с помощью такой абстракции, как конечный автомат, решить задачу управления сложным объектом со множеством внутренних состояний (контроллер нагруженного экрана, сервис получения данных из разных источников и т.д.) и как при этом не потеряться во множестве переходов. На наглядном примере я познакомлю слушателей с достоинствами и недостатками выбранного подхода и помогу определиться, когда его стоит, а когда не стоит применять.
23. iOS state machine
23
IF (error) {
// обработка ошибки
} ELSE {
// обработка данных
}
ViewController
24. iOS state machine
24
IF (error) {
// обработка ошибки
} ELSE IF (data != NULL) {
// обработка данных
} ELSE {
// нет данных
}
ViewController
25. iOS state machine
25
IF (isWaiting) {
// ждем данные
} ELSE IF (error) {
// обработка ошибки
} ELSE IF (data != NULL) {
// обработка данных
} ELSE {
// нет данных
}
ViewController
26. iOS state machine
IF (isWaiting) {
IF (isWaitingAgain) {
// повторное ожидание
} ELSE {
// ждем данные
}
} ELSE IF (error) {
IF (systemError) {
// показать alert
} ELSE {
// показать toast
}
} ELSE IF (data != NULL) {
IF (data.length < 10) {
// обработка данных
} ELSE {
// обработка данных
}
} ELSE {
// нет данных
}
ViewController
26
28. iOS state machine
Недостатки
• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития
• Негибкий
• Нет защиты от фиктивных состояний
28
29. iOS state machine
Недостатки
29
• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития
• Негибкий
• Нет защиты от фиктивных состояний
30. iOS state machine
Недостатки
30
• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития
• Негибкий
• Нет защиты от фиктивных состояний
31. iOS state machine
Недостатки
31
• Нечитабелен
• Высокий порог вхождения
• Высокая сложность поддержки и развития
• Негибкий
• Нет защиты от фиктивных состояний
48. iOS state machine
Создаем состояния
let waitingDataState = WaitingDataState()
let dataAvailableState = DataAvailableState()
let dataNotAvailableState = DataNotAvailableState()
let errorState = ErrorState()
48
77. iOS state machine
Достоинства
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций
77
78. iOS state machine
Достоинства
78
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций
79. iOS state machine
Достоинства
79
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций
80. iOS state machine
Достоинства
80
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций
81. iOS state machine
Достоинства
81
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций
82. iOS state machine
Достоинства
82
• Формализация
• Тестируемость
• Контроль потоков данных
• Контроль ошибок
• Единая точка входа для логирования / статистики
• История операций