Задать вопрос
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel

Какие задачи решает реактивное программирование?

Пытаюсь уложить в голову, что вообще такое реактивное программирование. wikipedia говорит - в общем распространение изменений, как в формулах exсel таблиц. С точки зрения ReactJS, ReduxJS - потоки данных. В первородных статьях microsoft говорится о behaviors, events и их композиции, которых достаточно. Реактивный манифест упоминает отзывчивость, отказоустойчивость и эластичность к нагрузкам. Четкой картины у меня не возникает.
Подскажите, пожалуйста, классические задачи реактивного программирования, для решения которых оно создавалось?
Надеюсь таким путем уразуметь, что это все таки такое.
  • Вопрос задан
  • 11519 просмотров
Подписаться 26 Сложный 3 комментария
Решения вопроса 3
@Hydro
C#/.NET Developer
Надеюсь, что правильно понял Ваш вопрос.

Пример

Храню в БД фото с марса в формате HD, делаю запрос на 100 фотографии, задача - показать 100 фоток последовательно на экране.

Стандартный поход: делаю запрос к базе на 100 фотографии, жду 2 секунды, получаю массив из 100 фотографии,
итератором бегаю по коллекции и показываю картинки на экране
псевдокод:

pics = GetPicsFromDatabase();
foreach(var pic in pics)
  ShowPic(pic)


Реактивный подход: делаю запрос к базе на 100 фотографии и обработчику запроса задаю коллбек, обрабатывающий следующий элемент коллекции

псевдокод:
// somecode
GetPicsFromDatabaseReactive(NextPictureHandler);
// somecode
NextPictureHandler(Image pic)
{
  ShowPic(pic)
}

В первом случае мы сами явно вытягивали следующий элемент списка (pull), а во втором случае - источник данных сам вкидывал нам следующий элемент, когда он был готов (push).
В первом случае мы ждем, пока сформируется источник данных (как правило занимаем тред) и после этого сами ручками просматриваем результат, во втором случае источник данных сам нас уведомит, когда будет готов.

Что это нам дает?
Асинхронность - в UI например это дает отзывчивость)
Масштабируемость - источник данных (коллекция картинок) и приемник (наш псевдкод, показывающий картинки) не связаны, отсутствие связи дает нам возможность подключить хоть 10 обработчиков картинок (пример один в черно-белом выводит, другой сепию накладывает и т.п.)
Отказоустойчивость достигается тем, что если сдох первый обработчик, например в его треде вылетел эксепшн, который повалил тред (прошу прощения за грубый пример), то действие выполнится резервным обработчиком (мы же их можем навешивать хоть 10, правда?)
Ответ написан
@lega
wikipedia говорит - в общем распространение изменений, как в формулах exсel таблиц

Excel - наверно самый показательный пример, когда вы меняете одну ячейку, то все зависимые ячейки пересчитываются (сами), зависимые ячейки от зависимых тоже пересчитываются и т.д. Т.е. получается такой поток/разлив информации. Для реализации исходная ячейка должна обладать списком всех зависимых ячеек (первого уровня/напрямую зависимых).

Если реализовывать такую таблицу в императивном стиле то после изменения одной ячейки нужно обходить все остальные ячейки и делать их пересчет (т.к. конечная ячейка сама тянет данные от которых зависит), после этого нужно делать ещё проход и ещё т.к. если более поздние ячейки изменяют более ранние ячейки, то ячейки зависимые от более ранних будут не актуальны. Вообщем это большая нагрузка и все будет тормозить в отличие от "точенного" изменения в реактивном стиле.
Ответ написан
Комментировать
@kttotto
пофиг на чем писать
Есть два варианта получить данные. Можно пассивным способом, это когда мы сами делаем запрос на получение и нам приходит ответ (вариант pull). И есть второй вариант, когда данные сами нас уведомляют об изменениях и выталкивают данные нам (вариант push). Реактивное приложение, это когда приложение само извещает нас об изменении своего состояния. Не мы делаем запрос и проверяем, а не изменилось ли там что-то, а приложение само нам сигнализирует. Ну и конечно эти события, эти сигналы мы соответственно можем обрабатывать.

Реактивность дает слабую связанность в первую очередь. Во-вторых, в некоторых случая это дает возможность писать более простой и понятный код. Например мы можем взять обычную коллекцию, преобразовать ее к реактивной коллекции и тогда мы будем иметь коллекцию событий об изменении данных в ней. Мы очень просто получаем только те данные, которые изменились. По этой коллекции мы можем делать выборку, фильтровать и т.д. Если бы мы это делали традиционным способом, то нам нужно было бы закэшировать текущие данные, потом делать запрос получить новые данные, потом их сравнить с кэшем и разница и будет те самые изменения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
nasnetstep
@nasnetstep
Пример из Википедии

В императивном программировании выражение

a = b + c
Означает взять текущие значения 'b' и 'c', сложить их и присвоить 'a' результат. Дальнейшие изменения параметров 'b' и 'с' не влияют на 'a'.

В реактивном программировании то же выражение:

a = b + c
Означает, что 'a' есть сумма 'b' и 'с'. Если 'b' или 'c' изменятся в будущем, это отразится на величине 'a'.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы