RxJava

RxJava — это фреймворк от ReactiveX (RX) для реактивного программирования на Java — подхода, при котором в ответ на изменения одних сущностей автоматически меняются другие. Он используется в мобильной и веб-разработке и помогает реализовать асинхронность — поочередное выполнение действий.

Логотип RxJava

Актуальная версия RxJava на январь 2022 года — 3.x. Поддержка версий 1.x и 2.x прекращена. Фреймворк распространяется бесплатно, документация и код доступны на сервисе GitHub.

Для чего нужен RxJava

RxJava используют Android-разработчики, разработчики кроссплатформенных приложений, веб-разработчики на Java и Kotlin:

  • для создания приложений в парадигме реактивного программирования;
  • быстрого выполнения действий, которые должны происходить при изменении определенных параметров;
  • программирования реакции на события, которые происходят в результате действий пользователя или системы;
  • реализации отображения сведений на основе взаимодействия с программой;
  • обработки множественных потоков данных и программирования ответов на них;
  • большей читаемости и управляемости кода;
  • избавления от обилия коллбэков — функций, которые запускаются в ответ на действие. 

Что такое реактивное программирование

RxJava реализует подход, который называют реактивным программированием. Оно подразумевает, что программист работает с потоком данных: все состояние сущностей в коде зависит от этого потока. Когда изменяется одна переменная или объект, должны поменяться и связанные с ними функции.

Реактивное программирование объясняют на примере Excel-таблиц. Если ввести в таблицу формулу, то она выполнится на основе данных из нужных ячеек. А если поменять информацию в этих ячейках, формула автоматически пересчитается. Так же ведут себя сущности в коде при реактивном подходе. Он считается компромиссом между объектно-ориентированным и функциональным программированием.

Принципы работы фреймворка

Опора на функциональное программирование

RxJava вдохновлен идеей функционального программирования, где код представлен как набор функций. Сейчас его местами вытесняет ООП, объектно-ориентированный подход, но функциональные решения в некоторых случаях оптимальнее.

Компонуемость

Операторы RxJava можно компоновать и объединять друг с другом, в результате программирование с помощью фреймворка становится более гибким.

Интуитивный подход

Фреймворк написан таким образом, чтобы его поведение было схоже с другими «околофункциональными» решениями. Так разработчику проще понимать, чего ожидать от той или иной возможности и как можно решить задачу.

Расширяемость

В RxJava можно добавлять пользовательские операторы, расширяя ее функциональность.

Лаконичность

Фреймворк построен так, чтобы сложные задачи реакции на события можно было запрограммировать несколькими строками кода.

Ключевые компоненты RxJava

Идея фреймворка — представление кода в виде модели «Наблюдаемое и наблюдатель». В ней есть две основных сущности, которые называются Observable и Observer. Они взаимодействуют между собой — так обрабатываются события.

Observable — это «наблюдаемое». Так называется поток информации, источник данных и событий. Когда в Observable меняются данные, об этом узнает Observer.

Observer — это «наблюдатель», обработчик событий. Он наблюдает за потоком данных и выполняет действия, как только те изменились. Observable посылает ему сигнал, когда начинает или заканчивает выдавать информацию.

Сущности кода, написанного на RxJava, — это наблюдатели и наблюдаемое. При этом функция, которая наблюдает за другой, сама может быть наблюдаемым для чего-то еще.

Observable и Observer

Данные можно преобразовывать, фильтровать, соединять друг с другом или разделять. С помощью функций фреймворка можно создавать и удалять наблюдаемое, связывать с разными наблюдателями или откреплять от них.

Преимущества RxJava

Кроссплатформенность

Java и ее фреймворки по определению кроссплатформенны, то есть подходят для разработки под любые устройства и операционные системы. Это удобно, потому что для портирования проекта на другую ОС не понадобится радикально переписывать код. Это справедливо и для RxJava.

Удобное разделение задач

Чтобы код был читаемым и понятным, нужно разделять разные сущности, не смешивать их. Реактивное программирование — один из способов такого разделения. Задачи разбиваются на более мелкие, выполнение каждой из них является событием. Эти события обрабатывает наблюдатель. RxJava помогает сделать код чистым и гибким.

Отсутствие множественных коллбэков

В мобильной разработке альтернатива RxJava — коллбэки. Так называют функции, которые запускаются, когда другой блок кода завершает работу. Перед запуском им передается результат выполнения этого блока. Коллбэки — еще один способ реализовать асинхронность, выполнение задач по очереди друг за другом.

Множественные коллбэки в одном блоке кода приводят к явлению, которое называется callback hell — «ад обратных вызовов». Код становится слабо читаемым из-за излишней вложенности и обилия скобок.

Callback hell — «ад обратных вызовов»

Проект ReactiveX и, в частности, RxJava — способ избежать «ада обратных вызовов». Благодаря модели наблюдаемого и наблюдателя пользоваться коллбэками не обязательно. Реализация асинхронности становится понятнее.

Эффективное масштабирование

Проекты, написанные на RxJava, удобно трансформировать и масштабировать, особенно горизонтально. Для этого не нужно добавлять в код новые системные потоки данных, которые работают на уровне ОС и заметно расходуют память. Вместо этого можно создать больше «наблюдаемых» событий и обработчиков для них. Это не так нагружает систему, как добавление системных потоков. Код становится эффективнее.

Удобная обработка ошибок

Возможности RxJava упрощают обработку ошибок и исключений. Не нужно писать вручную обработчики ошибок. Построение программ в RxJava такое, что передавать возникшие ошибки легче, чем в ряде других решений.

Уменьшение количества переменных

Чтобы реализовать те же действия в другой парадигме, нужны специальные переменные состояния, и их в коде может быть очень много. RxJava позволяет передавать данные без обилия переменных, потому что события представляются как поток информации. Код выглядит яснее и чище, и в нем меньше «слабых мест»: обилие переменных состояния может приводить к ошибкам.

Наглядная реализация асинхронности

Подход, реализованный в RxJava, наглядно показывает, как должны работать асинхронные вычисления. Это позволяет разработчику лучше ориентироваться в коде.

Недостатки RxJava

Сложность в освоении

Концепт реактивного программирования сложен для тех, кто начинал изучать разработку с более простых подходов. Для начала работы с RxJava нужны хорошая подготовка и теоретическая база. Даже профессиональным разработчикам может понадобиться дообучение.

Неуниверсальность

RxJava может потреблять больше памяти, чем другие методы. Поэтому его применение не всегда актуально. Одни разработчики пользуются фреймворком для контроля асинхронности, другие считают, что это слишком мощный и сложный инструмент для таких задач. RxJava нужен в первую очередь для реактивного программирования. Во многих случаях лучше использовать более простые методы, например Executors.

Большое количество методов

В RxJava много сущностей и методов, которые расползаются по всему коду. Из-за этого поддерживать написанную программу может быть сложно. 

Другие термины на букву «R»

React
Redux
REST API
RFM-анализ
Roadmap
Ruby

Все термины

Освойте новую профессию

(рейтинг: 5, голосов: 4)
Добавить комментарий