Kibernetinio saugumo dilemos: Duomenų nutekėjimas
Prieššventinis skubėjimas įsibėgėja. Ieškodami dovanų savo artimiesiems, žmonės vis dažniau ryžtasi "šturmuoti" internetines parduotuves.
Peržiūrėkite trečiąją mūsų straipsnių ciklo "Funkcinio programavimo galia JavaScript" dalį. Šį kartą mūsų JavaScript ekspertas paaiškina daugiau apie Functor ir Monad Maybe.
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:
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ą.
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.
iš - grąžinti dabartinę vertę
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
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
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 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.
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)

Dabar sukurkime ankstesnį pavyzdį apie sąlygą. Jei max yra didesnis už nulį, bus vykdoma funkcija. Priešingu atveju ji grąžins 0.
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
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