SlideShare a Scribd company logo
Functional
Reactive
Programming
Асинхронность это сложно
Асинхронность это сложно
[task1 setCompleted:^(id result1){
[task2 setCompleted:^(id result2){
[task3 setCompleted^(id result3){
[task4 setCompleted:^(id result4){
[task5 setCompleted:^(id result5){
//Сделать что-то с result5
NSLog(@"Ура! %@", result5);
}]; [task5 start];
}]; [task4 start];
}]; [task3 start];
}]; [task2 start];
}]; [task1 start];
Callback Hell
Асинхронность
это сложно
волюция backendов
DBApp
волюция backendов
DB
API
Storage
Cache
App
App
• Данные с сервера
• Данные с сервера
• Геолокация
• Данные с сервера
• Геолокация
• IO
• Данные с сервера
• Геолокация
• IO
• CPU tasks
• Данные с сервера
• Геолокация
• IO
• CPU tasks
• Пользовательский ввод
Решения?
• mutex, semaphore, etc
Решения?
• mutex, semaphore, etc
• green threads
Решения?
• mutex, semaphore, etc
• green threads
• Future/Promise
Решения?
• mutex, semaphore, etc
• green threads
• Future/Promise
• Stream? WTF?
Поток
• набор значений одного типа во времени
• завершение с ошибкой или успехом
• может не иметь значений
Поток
• ps aux | grep firefox | awk '{print $2}'
• сетевые соединения
• звук и видео
• запросы и ответы сервера
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
@“Hell”
UITextField
textField.rac_textSignal
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
@“H”
@“He”
@“Hel”
@“Hell”
@“Hello”
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
Кнопка как поток
Button
UIControlEventTouchDown
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Button
UIControlEventTouchDown
UIControlEventTouchDragInside
UIControlEventTouchDragExit
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchUpInside
Кнопка как поток
UIButton
[button rac_signalForControlEvents:UIControlEventAllTouchEvents]
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Пример
Binding
• В четыре раза лучше коллбэков
• В два раза лучше промисов
• Способствуют локальности кода
• Упрощают обработку ошибок в цепочках
• Избавляют от Callback Hell
• Прозрачность кода
• Единообразие в работе с разными сущностями
• Простота асинхронного программирования
• Описание “что” надо сделать, вместо “как”
Цена
• Память/производительность
• Трудно построчно отлаживать
• Большой стек вызовов
• Нет готовых специалистов
Ссылки
• Reactive Manifesto
• RxJS
• Соловьёв о FRP+ClojureScript
• Haskell
• lmgtfy
Вопросы?
Сергей Буглаков
@ReDetection
XIAG AG

More Related Content

Similar to Functional Reactive Programming

Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подхода
Igor Kashkuta
 
7 кашкута
7 кашкута7 кашкута
7 кашкутаCodeFest
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
Глеб Тарасов
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
Dmitriy Kuragin
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
Positive Hack Days
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
Dev2Dev
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Scala for android
Scala for androidScala for android
Scala for android
Alexander Rusin
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
CocoaHeads
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java scriptNoveo
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Вадим Воробьев
 

Similar to Functional Reactive Programming (20)

Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подхода
 
7 кашкута
7 кашкута7 кашкута
7 кашкута
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Формальные методы защиты приложений
Формальные методы защиты приложенийФормальные методы защиты приложений
Формальные методы защиты приложений
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Scala for android
Scala for androidScala for android
Scala for android
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Web internship java script
Web internship   java scriptWeb internship   java script
Web internship java script
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
 

Functional Reactive Programming