(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': data().getTime(),įvykis:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, The Codest autorius - Puslapis 8 iš 13

Įvadas

Dažnai sunku išlaikyti nemodifikuojamą. Įvyniojimo modelis duomenys į konteinerį. Jis apsaugo vertybes, kad su jomis būtų galima saugiai dirbti ir nesukelti šalutinio poveikio.

Jei esate čia nauji, būtinai peržiūrėkite mano paskutines 2 dalis apie funkcinį programavimą The Codest tinklaraštis apie:

Funktorius

Jame nėra sudėtingos logikos. Pagrindinė jo užduotis - apgaubti kontekstą ir atlikti su juo iš išorės gaunamas funkcijas. Kiekvieną kartą pasikeitus vertei, perpakuojamas ir grąžinamas naujas konteinerio egzempliorius. Kviečiant žemėlapis metodą, kuris atlieka tam tikrą veiksmą, jis grąžina naują konteinerio egzempliorių su perduotos funkcijos grąžinta verte, išlaikant nekeičiamumo principą.

Deklaracija

 const Functor = value => ({ {
     map: fn => Functor(fn(value)),
     chain: fn => fn(value),
     of: () => value
 });

žemėlapis - naudinga, kai norite pakeisti konteinerio reikšmės būseną, bet dar nenorite jos grąžinti.

grandinė - naudojamas, jei norite perduoti reikšmę funkcijai nekeisdami konteinerio būsenos. Paprastai funkcijos pabaigoje žemėlapis skambučiai.

- grąžinti dabartinę vertę

Imperatyvus pavyzdys

const randomInt = (max) => Math.floor(Math.random() * (max + 1))

const randomNumber = randomInt(200) // grąžinamas skaičius nuo 0 iki 200

decrease(randomNumber) // grąžinamas skaičius (nuo 0 iki 200) - 1

Deklaratyvinis pavyzdys

const randomIntWrapper = (max) =>
Functor(max)
.map(increase) // max + 1
.map(multiplyBy(Math.random())) // Math.random() * (max + 1)
.map(Math.floor) // Math.floor(Math.random() * (max + 1))

const randomNumber = randomIntWrapper(200)

randomNumber.of() // grąžinamas skaičius nuo 0 iki 200
randomNumber.chain(decrease) // grąžina (skaičių nuo 0 iki 200) - 1

Monada

Kartais, be funkcijų, sukeliančių naują reikšmės būseną, reikia papildomos logikos, paslėptos konteineryje. Čia praverčia monada, nes ji yra plėtinys funktorius. Pavyzdžiui, jis gali nuspręsti, kas turėtų įvykti, kai reikšmė įgyja tam tikrą vertę, arba kokiu keliu turi būti atliekami kiti veiksmai.

Monada Galbūt

Monada galbūt išsprendžia verčių, kurios grąžina ne true, problemą. Kai taip atsitinka, vėlesni žemėlapis skambučiai ignoruojami, tačiau galima grąžinti alternatyvų skambinant į getOr metodas. Tai leidžia išvengti operatorių if / else, kurie populiarūs imperatyvas programavimas. Šią monadą sudaro trys konteineriai:

Nieko - paleidžiamas, kai į konteinerį patenka reikšmė, kuri nėra true, arba filtras metodas grąžina false. Jis naudojamas funkcijos vykdymui imituoti. Tai reiškia, kad šis konteineris gauna funkciją, bet jos nevykdo.

Tiesiog - tai yra pagrindinis konteineris, kuris atlieka visas funkcijas, tačiau jei reikšmė pasikeičia į klaidingą reikšmę arba filtras metodas grąžina false, jis perduos jį į Nieko konteineris.

Galbūt - Paimu pradinę vertę ir nusprendžiu, kokį konteinerį iškviesti pradžioje.

Deklaracija

const Just = value => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => value,
filter: fn => fn(value) ? Just(value) : Nothing(),
type: "just
});

const Nothing = () => ({
map: fn => Nothing(),
chain: fn => fn(),
of: () => Nothing(),
getOr: substitute => substitute,
filter: () => Nothing(),
type: "nothing
});

const Maybe = value =>
value === null || value === undefined || value.type === 'nothing'
? Nothing()
: Just(value)
lentelės metodai funktorius

Dabar sukurkime ankstesnį pavyzdį apie sąlygą. Jei max yra didesnis už nulį, bus vykdoma funkcija. Priešingu atveju ji grąžins 0.

Imperatyvus pavyzdys

const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} else {
return 0
}
}

const bookMiddlePage = 200

const randomPage = randomInt(10) || bookMiddlePage // grąžina atsitiktinį variantą
const randomPage = randomInt(-10) || bookMiddlePage // grąžina 200

Deklaratyvinis pavyzdys

const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // reikšmė false ignoruoja tolesnius iškvietimus
.map(padidinti)
.map(multiplyBy(Math.random()))
.map(Math.floor)

const bookMiddlePage = 200

// Tiesiog konteineris
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // grąžina atsitiktinį skaičių
// Nieko konteineris
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // grąžina 200


bendradarbiavimo vėliava

lt_LTLithuanian