**Redux** on avatud lähtekoodiga JavaScripti raamistik rakenduse oleku haldamiseks. Tavapäraselt kasutatakse Reduxi koos teiste levinud JavaScripti raamistikega, mida kasutatakse kasutajaliideste loomiseks (nt React või Angular). Redux on loodud inspireerituna Facebooki Fluxi arhitektuurist. Selle loojad on Dan Abramov ja Andrew Clark.

Kirjeldus
---------

Redux on väike raamistik lihtsa ning piiratud rakendusliidesega, mis on disainitud konteineris rakenduse olekupuu hoiustamiseks. Selle tööpõhimõte sarnaneb funktsionaalse programmeerimise ideega taandada rekursiivselt konkreetse funktsiooni abil andmed soovitud kujule. Olekupuu andmed ei ole otse modifitseeritavad, vaid uuenevad rakenduse oleku muutudes automaatselt.

Selle tööpõhimõte on saanud inspiratsiooni funktsionaalse programmeerimise keelest Elm.

Ajalugu
-------

Dan Abramov ja Andrew Clark lõid Reduxi raamistiku aastal 2015. Abramov alustas Reduxi esmase implementatsiooni kirjutamist parajasti siis, kui ta valmistus esinema React Europeäi konverentsil. Tema huvialaks oli juba tollal, kuidas uuendada rakendust ilma seda uuesti laadimata. Abramov on öelnud, et tema eesmärgiks oli implementeerida idee Fluxi loogika muutmisest. Selle implementeerimine lubaks tal ajas rännata. See lubaks kasutada rakenduse tulevasi muudatusi koodis.

Abramovit inspireeris Fluxi struktuuri ja taandava funktsiooni sarnasus. Ta vaatles Fluxi kui aegamisi töötavat taandavat funktsiooni: konteinerid koguvad ja kohandavad endas sisalduvaid andmeid vastavalt programmi tegevustele. Tema eesmärgiks oli seda kontseptsiooni edasi arendada: "Mis juhtuks siis, kui Fluxi mälu ei oleks lihtsalt mälu, vaid taandav funktsioon?"

Abramov võttis ühendust Andrew Clarkiga võimaliku koostöö osas. Clark on nimelt Fluxi implementatsiooni Flummoxi autor. Kõige muu seas tunnustab Abramov Clarki, et viimane tegi võimalikuks Reduxi tööriistade süsteemi kasutamise, aitas Abramovil luua sidusa rakendusliidese ning implementeeris laienduses vaja minevat, nagu vahetarkvara ja mälu võimendamine.

Tööpõhimõte
-----------

Reduxi tööpõhimõte (*action* – aktsioon; *reducer –* taandav funktsioon; *store –* konteiner; *UI –* kasutajaliides)
Reduxi tegevused algavad rakenduse renderdusega rakenduse olemasoleva olekupuu põhjal. Kui kasutaja teeb mõne rakenduse olekupuud mõjutava tegevuse (näiteks klõpsab nuppu või sisestab tekstiväljale teksti), siis kutsutakse välja aktsioonid. Aktsioonid sisaldavad informatsiooni tehtud tegevuse kohta ning need saadetakse pärast töötlemist edasi konteinerisse. Taandav funktsioon võtab aktsioonist saadud andmed ning uuendab nende põhjal rakenduse olekupuud.

Eelised
-------

Reduxi kasutamisel on mitmeid eeliseid:

* prognoositav väljund – rakendusel on alati ainult üks olekupuu;
* hooldatavus – väljundi prognoositavus ning kindel struktuur muudavad koodi haldamise lihtsamaks;
* struktuur – Reduxi struktuur on üsnagi range, mistõttu kood on ühtne ja lihtsasti jälgitav;
* arendaja tööriistad – arendajad saavad kõiki rakenduse muudatusi jälgida reaalajas vastavate laienduste kaudu;
* serveris renderdus – paremaks kasutajakogemuseks kasutab Redux renderduseks kliendipoolset serverit;
* kogukond – Reduxil on põhjalik dokumentatsioon;
* testimise lihtsus – väikeste funktsioonidena loodud kood on lihtsasti testitav.

Viited
------

1. 1 2 3 4  "An Introduction To Redux". *Smashing Magazine*. Vaadatud 04.11.2018.
2. 1 2 3  Dan Abramov. "The History of React and Flux with Dan Abramov". *Three Devs and a Maybe*. Vaadatud 04.11.2018.
3. ↑  Dan Abramov. "Progression, Curiosity and Burnout with Dan Abramov". *TylerMcGinnis.com*. Vaadatud 04.11.2018.
4. ↑  Nish Tahir. "Lessons Learned Implementing Redux on Android". Vaadatud 05.11.2018.