— Что делать, если у вас много асинхронного кода и он выглядит как лапша?
— Как делать системы проще, используя подходы и принципы из мира функционального программирования.
16. • Одинаковые аргументы — одинаковый результат
• Отсутствуют наблюдаемые сайд-эффекты
Чистые функции
17. // Конкатенация строк — чистая функция
NSString *CombineStrings(NSString *l, NSString *r);
// Любая математическая операция тоже чистая
int sum(int a, int b);
@interface Collection : NSObject
// Нечистая функция — нет аргументов и
// возвращаемое значение каждый раз разное.
- (id)next;
@end
Чистые функции
21. • Набор неизменяемых значений
одного типа во времени
• Может закончится успешно или с
ошибкой
• Может и вовсе не иметь значений
Поток
22. • Создание потоков
• Преобразования одних в другие
• Подписка на значения
FRP Frameworks
23. UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
24. @“H”
Current text: H
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
25. @“H”
@“He”
Current text: H
Current text: He
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
26. @“H”
@“He”
@“Hel”
Current text: H
Current text: He
Current text: Hel
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
27. @“H”
@“He”
@“Hel”
@“Hell”Current text: H
Current text: He
Current text: Hel
Current text: Hell
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
28. @“H”
@“He”
@“Hel”
@“Hell”
@“Hello”
Current text: H
Current text: He
Current text: Hel
Current text: Hell
Current text: Hello
UITextField *field = [UITextField new];
[field.rac_textSignal
subscribeNext:^(NSString *text) {
NSLog(@"Current text: %@", text);
}];
Text Field как поток
49. Реактивное присваивание
//Неважно, как именно начался поиск, но после его
//начала фокус с поисковой строки надо убрать.
RAC(self, topBarVM.textFieldVM.focused) =
[self.searchVM.searchDidStartSignal mapReplace:@NO];
50. • В четыре раза лучше коллбэков
• В два раза лучше промисов
• Способствуют локальности кода
• Упрощают обработку ошибок в цепочках
• Избавляют от Callback Hell
Потоки — это монады
54. • Неизменяемые объекты — значения в потоке
• Потоки изолируют состояние
• Операторы — чистые функции
• Операторы изолируют взаимосвязи
Functional Reactive Programming
55. • Прозрачность кода
• Единообразие в работе с разными сущностями
• Простота асинхронного программирования
• Описание “что” надо сделать, вместо “как”
FRP на практике