Top Banner
Functional Reactive Programming
50

Functional Reactive Programming

Aug 06, 2015

Download

Software

Serg Buglakov
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional Reactive Programming

Functional Reactive Programming

Page 2: Functional Reactive Programming

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

Page 3: Functional Reactive Programming

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

Page 4: 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

Page 5: Functional Reactive Programming

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

Page 6: Functional Reactive Programming

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

DBApp

Page 7: Functional Reactive Programming

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

DB

API

Storage

Cache

App

App

Page 8: Functional Reactive Programming

• Данные с сервера

Page 9: Functional Reactive Programming

• Данные с сервера

• Геолокация

Page 10: Functional Reactive Programming

• Данные с сервера

• Геолокация

• IO

Page 11: Functional Reactive Programming

• Данные с сервера

• Геолокация

• IO

• CPU tasks

Page 12: Functional Reactive Programming

• Данные с сервера

• Геолокация

• IO

• CPU tasks

• Пользовательский ввод

Page 13: Functional Reactive Programming

Решения?• mutex, semaphore, etc

Page 14: Functional Reactive Programming

Решения?• mutex, semaphore, etc

• green threads

Page 15: Functional Reactive Programming

Решения?• mutex, semaphore, etc

• green threads

• Future/Promise

Page 16: Functional Reactive Programming

Решения?• mutex, semaphore, etc

• green threads

• Future/Promise

• Stream? WTF?

Page 17: Functional Reactive Programming
Page 18: Functional Reactive Programming

Поток

• набор значений одного типа во времени

• завершение с ошибкой или успехом

• может не иметь значений

Page 19: Functional Reactive Programming

Поток• ps aux | grep firefox | awk '{print $2}'

• сетевые соединения

• звук и видео

• запросы и ответы сервера

Page 20: Functional Reactive Programming

UITextField

textField.rac_textSignal

UITextField *field = [UITextField new]; [field.rac_textSignal subscribeNext:^(NSString *text) { NSLog(@"Current text: %@", text); }];

Text Field как поток

Page 21: Functional Reactive Programming

UITextField

textField.rac_textSignal

UITextField *field = [UITextField new]; [field.rac_textSignal subscribeNext:^(NSString *text) { NSLog(@"Current text: %@", text); }];

Text Field как поток@“H”

Page 22: Functional Reactive Programming

UITextField

textField.rac_textSignal

UITextField *field = [UITextField new]; [field.rac_textSignal subscribeNext:^(NSString *text) { NSLog(@"Current text: %@", text); }];

Text Field как поток@“H”

@“He”

Page 23: Functional Reactive Programming

UITextField

textField.rac_textSignal

UITextField *field = [UITextField new]; [field.rac_textSignal subscribeNext:^(NSString *text) { NSLog(@"Current text: %@", text); }];

Text Field как поток@“H”

@“He”

@“Hel”

Page 24: Functional Reactive Programming

UITextField

textField.rac_textSignal

UITextField *field = [UITextField new]; [field.rac_textSignal subscribeNext:^(NSString *text) { NSLog(@"Current text: %@", text); }];

Text Field как поток@“H”

@“He”

@“Hel”

@“Hell”

Page 25: Functional Reactive Programming

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”

Page 26: Functional Reactive Programming

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Button

Кнопка как поток

Page 27: Functional Reactive Programming

Button

UIControlEventTouchDown

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 28: Functional Reactive Programming

Button

UIControlEventTouchDown

UIControlEventTouchDragInside

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 29: Functional Reactive Programming

Button

UIControlEventTouchDown

UIControlEventTouchDragInside

UIControlEventTouchDragExit

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 30: Functional Reactive Programming

Button

UIControlEventTouchDown

UIControlEventTouchDragInside

UIControlEventTouchDragExit

UIControlEventTouchDragOutside

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 31: Functional Reactive Programming

Button

UIControlEventTouchDown

UIControlEventTouchDragInside

UIControlEventTouchDragExit

UIControlEventTouchDragOutside

UIControlEventTouchDragEnter

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 32: Functional Reactive Programming

Button

UIControlEventTouchDown

UIControlEventTouchDragInside

UIControlEventTouchDragExit

UIControlEventTouchDragOutside

UIControlEventTouchDragEnter

UIControlEventTouchUpInside

Кнопка как поток

UIButton[button rac_signalForControlEvents:UIControlEventAllTouchEvents]

Page 33: Functional Reactive Programming

Пример

Page 34: Functional Reactive Programming

Пример

Page 35: Functional Reactive Programming

Пример

Page 36: Functional Reactive Programming

Пример

Page 37: Functional Reactive Programming

Пример

Page 38: Functional Reactive Programming

Пример

Page 39: Functional Reactive Programming

Пример

Page 40: Functional Reactive Programming

Пример

Page 41: Functional Reactive Programming

Пример

Page 42: Functional Reactive Programming

Пример

Page 43: Functional Reactive Programming

Пример

Page 44: Functional Reactive Programming

Binding

Page 45: Functional Reactive Programming

• В четыре раза лучше коллбэков • В два раза лучше промисов • Способствуют локальности кода • Упрощают обработку ошибок в цепочках • Избавляют от Callback Hell

Page 46: Functional Reactive Programming

• Прозрачность кода • Единообразие в работе с разными сущностями • Простота асинхронного программирования • Описание “что” надо сделать, вместо “как”

Page 47: Functional Reactive Programming

Цена• Память/производительность

• Трудно построчно отлаживать

• Большой стек вызовов

• Нет готовых специалистов

Page 48: Functional Reactive Programming
Page 49: Functional Reactive Programming

Ссылки• Reactive Manifesto

• RxJS

• Соловьёв о FRP+ClojureScript

• Haskell

• lmgtfy

Page 50: Functional Reactive Programming

Вопросы?

Сергей Буглаков @ReDetection

XIAG AG