functional reactive programming

50
Functional Reactive Programming

Upload: serg-buglakov

Post on 06-Aug-2015

226 views

Category:

Software


0 download

TRANSCRIPT

Functional Reactive Programming

15Асинхронность это сложно

16Асинхронность это сложно

[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

Асинхронность это сложно

4Эволюция backendов

DBApp

5Эволюция 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