Asynchrónne programovanie je dnes už bežná vec. Množstvo spracovaných údajov sa zväčšuje. Čas na ich spracovanie má byť čo najkratší. Zároveň je už dnes komunikácia po sieti úplne bežná, a to je jedno z najčastejších asynchrónnych operácií vôbec. Bola len otázka času než sa začnú objavovať metódy, knižnice a frameworky, ktoré budú brať asynchrónne programovanie ako základ ich fungovania. Jednou z takých je aj Reactive Extension.

Reactive Extension (RE) nie je názov knižnice, nástroja alebo frameworku. Nie je to ani štandard. Je to pojem, ktorý pomenováva spôsob práce s asynchrónnymi správami. Ak sa pokúsite nájsť na internete definíciu, tak zistíte, že ich je niekoľko, ale v zásade sa pohybujú okolo toho istého. Zjednodušene by sa dalo povedať, že RE je

Model práce s asynchrónnym správami.

Ak by sme sa chceli trochu odviazať, tak môžeme povedať, že RE je:

Vzor Observer na stereoidoch.

A takto by sme sa mohli pokúšať ďalej zadefinovať, čo to RE je, ale lepšie ako niekoľko definícií je ukázať si to.

RE bolo implementované do niekoľkých knižníc pre rôzne jazyky, pričom ich zoznam sa dá nájsť na GitHube. Základný princíp je pre všetky ale rovnaký, preto je jedno, či si napríklad zvolíte RxJS alebo RxJava.

Na začiatok krátky úvod do Observer návrhového vzoru. Observer (alebo slovensky Pozorovateľ) je vzor, ktorého hlavným účelom je rozdistribuovanie udalosti medzi viacero prihlásených klientov. Klient sa prihlási na odber udalosti pre nejakú tému, a vždy keď dôjde k takejto udalosti, tak je o tom notifikovaný. Toto je v podstate základný princíp RE.

Všetko sa točí okolo rozhrania Observer a Observable. Observer je rozhranie pre tú časť kódu, ktorá udalosti generuje. Na druhej strane je kód, ktorý udalosti konzumuje, a tomu je určené rozhranie Observable. Sú to v podstate dve strany tej istej mince.

Observable je rozhranie, ktorého hlavná metóda je subscribe. Cez ňu sa vie klient prihlásiť na odber udalostí k danej téme (jedna téma = jedno Observable rozhranie). V RxJS (v ktorom budem ukazovať aj ďalšie príklady) to môže vyzerať takto:

X.subscribe(() => {
console.log('Event');
},
() => {
console.log('Error');
},
() => {
console.log('Complete');
});

Do metódy subscribe som ako prvý parameter poslal anonymnú metódu, ktorá zaloguje do konzoly reťazec Event. To je callback funkcia, ktorá je volaná pri každej udalosti. Ako ste si určite všimli, okrem nej som tam poslal ďalšie dve funkcie. Tá druhá je reakcia na to, ak dôjde na strane producenta udalostí k chybe (teda error callback funkcia). A tá posledná je funkcia volaná, keď observer ukončí generovanie udalosti (teda complete callback funkcia). To je jedna z odlišností medzi RE a Observable vzorom – v RE Observer vie posielať informáciu aj o tom, že došlo k chybe alebo že skončil.

Nikoho teda asi neprekvapí, že rozhranie Observera obsahuje tieto tri kľúčové metódy:

observer.onNext(...)

observer.onError(...)

observer.onCompleted(...)

Týmito metódami na strane producenta posielam dáta, pričom framework sa následne postará, že callbacky klientov sú volané.

Zatiaľ to nevyzerá na žiaden zázrak. API pre producenta, API pre konzumenta, posielanie nejakých údajov. Čo teda RE ešte dokáže:

  • udalosti prichádzajúce cez subscribe sú ako sled (prúd) udalostí, ktorý viem filtrovať, transformovať a akumulovať
  • producent môže byť lazy (cold) – t.j. jeho kód sa spustí, len keď má nejakého konzumenta, čo môže šetriť systémové prostriedky
  • viem vytvoriť objekt Subject, ktorý implementuje obe rozhrania (Observable aj Observer) naraz, a tým napríklad vytvoriť adaptér pre existujúce Observable rozhranie, ktoré sa nespráva podľa mojich predstáv
  • viem spájať výsledky viacerých nezávislých Observable do jedného prúdu udalosti alebo naopak rozdeľovať jeden prúd udalostí na viacero samostatných podľa podmienky
  • viem pracovať so Schedulermi, čo sú objekty, ktoré umožňujú nastavovať prúd udalostí v čase, a tak riadiť konkurenčnosť ich spracovania
  • a mnoho ďalších vecí …

RE je teda základný koncept, okolo ktorého sa nabalilo mnoho užitočnej funkcionality. Pekné na tom je, že základná myšlienka ostáva jednoduchá, a tak sa dá knižnica veľmi rýchlo jednoducho používať. A keď sa v nej človek rozpozerá, je schopný absorbovať ďalšie zložitejšie témy. Druhou výhodou je, že je implementovaný vo viacerých jazykoch, a to z pohľadu používateľa rovnako. Ak sa ho teda naučíte používať v jednom, tak veľmi ľahko prejdete do iného jazyka. Dá sa povedať, že reaktívne programovanie sa už uchytilo v mainstreame tvorby softvéru, a teda treba čakať, že rôzne jeho formy tu s nami budú nejakú dobu (samozrejme, len kým nepríde niečo lepšie). RE je jedna takáto forma, ktorá je ľahká na použitie a pritom spĺňa hneď niekoľko požiadaviek kladených na reaktívne programovanie.