Si të ndërtojmë një biznes funksional

Discover Funksionale JavaScript u njoh nga BookAuthority si një nga librat e rinj më të mirë për programimin funksional!

Foto nga Ugur Akdemir në Unsplash

Funksionet e pastra gjenerojnë të njëjtën vlerë dalëse me të njëjtën input. Ato nuk kanë efekte anësore dhe janë më të lehta për t’u lexuar, kuptuar dhe provuar.

Duke pasur këtë në mendje, unë do të doja të krijoja një dyqan që fsheh statusin, por përdor funksionalitete të pastra në të njëjtën kohë.

pandryshueshmëria

Funksionet e pastra nuk i ndryshojnë inputet e tyre. Ato i trajtojnë vlerat e hyrjes si të pandryshueshme.

Një vlerë e pandryshueshme është një vlerë që nuk mund të ndryshohet pasi të krijohet.

Immutable.js ofron struktura të të dhënave të pandryshueshme si Lista. Një strukturë e pandryshueshme e të dhënave krijon një strukturë të re të të dhënave me çdo veprim.

Merrni parasysh kodin tjetër:

Importo {listën} nga "e pandryshueshme";
lista const = Lista (); const newList = list.push (1);

push () krijon një listë të re me elementin e ri. Lista ekzistuese nuk është ndryshuar.

Delete () kthen një listë të re në të cilën elementi në indeksin e specifikuar është hequr.

Struktura e të dhënave të listës ofron një ndërfaqe të këndshme për të punuar me listat e pandryshueshme, kështu që unë do ta përdor atë si një vlerë të statusit.

Biznesi

Dyqani administron shtetin.

Statusi është i dhënë që mund të ndryshojë. Dyqani fsheh këto të dhëna të statusit dhe ofron një grup publik të metodave për të punuar me të.

Dua të krijoj një librari duke përdorur metodat add (), remove () dhe getBy ().

Dua që të gjitha këto funksione të jenë funksione të pastra.

Ekzistojnë dy lloje të funksioneve të pastra të përdorura nga biznesi:

  • Funksionet që lexojnë dhe filtrojnë statusin. Do t’i quaja marrës.
  • Funksionet që ndryshojnë gjendjen. Unë do t'i quaj ata vendosës.

Të dy llojet e funksioneve marrin statusin si parametër të parë.

Le të shkruajmë dyqanin me funksione të pastra.

Importo {listën} nga "e pandryshueshme"; importoni pjesërisht nga "lodash / pjesërisht"; Import ndeshjePasuri nga lodash / ndeshjePasuri;
// shtoni funksionin e vendosësit (libra, libër) {kthimin e librave.push (libër); }
Hiq funksionin (librat, librin) {const index = books.findIndex (matchesProperty ("id", book.id)); librat e kthimit.shlye (indeksi); }
// pyetësi i funksionit GetterContainsBook (pyetje, libër) {if (pyetje && pyetës.text) {kthim book.title.includes (pyetje.text); } kthimi true; }
Funksioni getBy (libra, pyetje) {return libra.filtri (pjesërisht (pyetjaContainsBook, pyetës)). toArray (); }

Libraria

Statusi duhet të fshihet në objektin e biznesit. Unë nuk dua t'i dërgoj statusin objektit të biznesit nga jashtë. Në të njëjtën kohë, unë do të doja të përfitoja plotësisht nga funksionet e pastra dhe t'i përdorja ato për të përcaktuar metodat e ruajtjes.

Si mund të arrihet kjo?

Përgjigjen e pamë në Redux. Ne shkruajmë funksione të pastra dhe e lëmë bibliotekën të krijojë kujtesën dhe të përdorë funksionet e pastra.

Ja se si unë dua të përdor bibliotekën për të përcaktuar biznesin:

Importo {listën} nga "e pandryshueshme"; Import dyqan nga "./Store-toolbox";
// shtoni funksionin e vendosësit (libra, libër) {} hiqni funksionin (libra, libër) {}
// funksioni i marrjes getBy (libra, pyetje) {}
Eksporto memorien standarde ({gjendja: Lista (), Vendosësi: {shto, hiqe}, Marrësi: {getBy}};

Le të krijojmë këtë mikro-bibliotekë që do të ndërtojë dyqanin bazuar në marrësit dhe përcaktuesit e pastër.

Të gjithë marrësit dhe përcaktuesit publik zbukurohen dhe u jepet statusi si parametri i parë.

  • Vlera e kthimit të marrësve kthehet në funksionet e thirrësit.
  • Vlera e kthyer nga stetters përdoret për të ndryshuar statusin. Funksionet e telefonuesit nuk marrin statusin e ri.
Funksioni zbukurojMetodat (obj, zbukurues) {let newObject = {... obj};
Object.keys (newObject) .forEach (funksioni zbukuron Metoda (emri fn)) {if (typeof newObject [fnName] === "funksion") {newObject [fnName] = zbukurues (newObject [fnName]);}});
kthimi i riObjekti; }
Funksioni Store (storeConfig) {kthimi i funksionit () {let state = storeConfig.state;
Vendosësi i funksionit (fn) {kthimi i funksionit (... shigjetat) {gjendja = fn (gjendja, ... harqet); }; }
Marrësi i funksionit (fn) {kthimi i funksionit (... shigjetat) {kthimi fn (gjendja, ... harqet); }; }
kthimi i objektit.frirja ({... dekorojMetodat (storeConfig.getters, marrës), ... dekorojMetodat (storeConfig.setters, vendosës)}); }; }
Eksporto hapësirën standarde;

Store () krijon një funksion që kthen një objekt që përmbledh gjendjen.

Krijoni dhe përdorni objektin bookStore:

importoni BookStore nga "./BookStore";
const bookStore = Librari (); bookStore.add ({id: 1, titulli: "Si funksionon JavaScript");

Kur telefononi bookStore.add ({}), dekoruesi i thirrjeve thërret funksionin e përcaktimit të pastër add () me statusin aktual si parametër të parë dhe librin e ri si parametër të dytë. Pastaj dekoruesi vendosës përdor rezultatin për të ndryshuar vlerën e gjendjes.

Objekti

Le të analizojmë objektin e libritDyqan.

Janë në dispozicion vetëm tre metoda, të gjitha funksionet e tjera të pastra janë private.

Ndërfaqja publike e objektit nuk mund të ndryshohet nga jashtë.

Shteti është i fshehur. Klientët që përdorin objektin bookStore mund të hyjnë në status vetëm përmes metodave publike.

Përfundim

Funksionet e pastra janë më të lehta për t’u kuptuar.

Me ndihmën e një biblioteke, ne mund të krijojmë një memorie që fsheh statusin dhe përdor funksione të pastra.

Thjesht mund të shkruajmë funksionet e pastra dhe ta lëmë bibliotekën t'i përdorë ato dhe të bëjë mutacionin.

Mund të shikoni shembullin e kodit në codesandbox.io.

Discover Funksionale JavaScript u njoh nga BookAuthority si një nga librat e rinj më të mirë për programimin funksional!

Për më shumë informacion në lidhje me aplikimin e teknikave funksionale për të React, shihni Funksionale React.

Mësoni si të zbatoni parimet e modeleve të dizajnit.

Mund të më gjesh në Twitter.