953

Coroutines або RxJava - який фреймворк вибрати для свого проекту?

Ще недавно Coroutines мали досить бідну функціональність, але тепер, з додаванням StateFlow і SharedFlow, вони можуть скласти конкуренцію RxJava, тому вибір технології став не таким очевидним.

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

Плюси RxJava

➡️ Стабільність
API RxJava відрізняється високою стабільністю, а ось багато API в карутинах позначені як «експериментальні», тому тут одразу виникають питання.

➡️ Перевірена технологія
RxJava - це зрілий і перевірений часом фреймворк, який успішно застосовується у багатьох проектах. Досвідчені розробники знають весь його функціонал і всі можливі вузькі місця.

Що стосується корутин, то ця технологія досить нова, через що немає повної впевненості в тому, як вона проявить себе в тих чи інших випадках.

Плюс, якщо проект вже працює на RxJava, розробникам доведеться додатково навчатися, шукати нові підходи та адаптувати функціонал під Coroutines.

➡️ Сумісність з Java
Використовувати RxJava можна з будь-якою мовою програмування, сумісною з Java, а ось писати корутини можна лише за допомогою Kotlin. Для деяких проектів це не принципово, але для інших може стати справжнім головним болем.

➡️ Пошук багів
Не секрет, що дебати RxJava - завдання не з простих, але це ще нічого в порівнянні з пошуком багів в Coroutines. І це навіть незважаючи на те, що корутин має власні інструменти для дебага.

Плюси Coroutines

➡️ Простий API
Для кожного окремого випадку RxJava може використовувати безліч типів потоків - Observable, Flowable, Maybe, Single, Completable. У Kotlin весь цей функціонал дублюється лише двома типами: suspend fun та Flow, при цьому асинхронні вирази в ньому можуть викликатися за допомогою простих лямбда-виразів, що значно спрощує розробку. Тобто, у програмістів практично втрачається необхідність створювати однаковий код для кожного типу п'ять разів, за кількістю видів потоків.

➡️ Kotlin Multiplatform
Як відомо з назви, RxJava підтримує лише мову Java, тоді як Coroutines здатні працювати на будь-якій платформі, яка підтримує Kotlin. Отже, якщо виникне необхідність, наприклад, перевикористовувати асинхронний код між Android та iOS, то за допомогою корутину це можна зробити без проблем.

➡️ Структурована багатопоточність
На відміну від схильних до витоків потоків Rx Coroutines обробляють вхідні об'єкти навіть якщо сам програміст про них забув. Структурованість корутинів Kotlin значно полегшує управління життєвим циклом відкритих потоків.

➡️ Прості оператори
Створення кастомних операторів Rx може стати справжнім випробуванням для розробника, оскільки вимагає глибокого розуміння того, як фреймворк працює «під капотом». У Flow вони пишуться як решта коду, завдяки чому замість сотні рядків коду, часто, можна обійтися всього кількома рядками.

➡️ Продуктивність
Судячи з результатів тестування за допомогою Reactive Scrabble - стандарту для перевірки ефективності потоків, продуктивність Flow корутин значно перевершує RxJava.

➡️ Просте управління back-pressure
Коли дані видаються швидше, ніж потік, що приймає, встигає їх обробляти виникає back-pressure - надлишок вхідних подій. Для Rx це велика проблема і причина появи надлишкового і заплутаного коду у фреймворку, оскільки для запобігання надлишку випромінюючі потоки повинні постійно взаємодіяти з тими, хто приймає.

Flow корутин справляється з цим значно простіше. Якщо в якийсь момент вхідних даних стає занадто багато, він просто відкладає на час потоки, що випускають події. В результаті програмісту не потрібно так часто займатися back-pressure, що заощаджує дорогоцінний час.

➡️ Взаємозамінність
Корутини і Rx мають хорошу взаємозамінність. Завдяки перетворювачам, що поставляються Kotlin, програмісти можуть переводити проект з Rx до Flow поетапно і навіть продовжити використання Rx-бібліотек у своєму проекті, при цьому код не доведеться переписувати вручну. Крім того, Coroutines є інструменти, що дозволяють автоматично переводити застарілі потоки Rx на Flow.

Наша думка

Coroutines багато в чому перевершуює RxJava з технічної точки, і головною проблемою технології залишається її необкатаність, з усіма наслідками. Вам доведеться адаптуватися, шукати підходи, знаходити рішення, щось переписувати під себе і багато займатися дебагом — принаймні доти, доки не вивчите, як технологія поводиться в специфічних ситуаціях.

Однак це тимчасові труднощі, і якщо їх подолати, вам стануть доступні всі переваги корутин: мультиплатформенність, простий API, структурована багатопоточність та багато іншого. Тому фактично тут вибір між перевіреною стабільністю та технологічністю.

Якщо ви хочете освоїти розробку на Java та Kotlin – приходьте на курси SpaceLAB. Тут на вас чекає повністю безкоштовне навчання під кураторством досвідчених менторів з реальною можливістю працевлаштування.