Kiberdrošības dilemmas: Datu noplūde
Pirmssvētku steiga ir pilnā sparā. Meklējot dāvanas saviem mīļajiem, cilvēki arvien biežāk ir gatavi "šturmēt" interneta veikalus.
Iepazīstieties ar mūsu rakstu sērijas Power of functional programming in JavaScript trešo daļu. Šoreiz mūsu JavaScript eksperts skaidro vairāk par Functor un Monad Maybe.
Bieži vien ir grūti uzturēt nemodificējamu. Ietīšanas modelis dati konteinerā nāk palīgā. Tas nodrošina vērtības tā, lai darbs ar tām būtu drošs un nerastos blakusparādības.
Ja esat šeit jauns, pārliecinieties, ka pārbaudījāt manas pēdējās 2 daļas par funkcionālo programmēšanu par The Codest blogs par:
Tam nav sarežģītas loģikas. Tās galvenais uzdevums ir ietīt kontekstu un veikt funkcijas, ko tā saņem no ārpuses. Katru reizi, kad mainās vērtība, tiek pārpakots un atdots jauns konteinera gadījums. Izsaucot karte metode, kas veic konkrētu darbību, tā atgriež jaunu konteinera gadījumu ar vērtību, ko atdod nodotā funkcija, vienlaikus saglabājot nemodificēšanas principu.
const Functor = value => ({ {
map: fn => Functor(fn(value)),
chain: fn => fn(value),
of: () => value
});
karte - noderēs, ja vēlaties mainīt konteinera vērtības stāvokli, bet vēl nevēlaties to atgriezt.
ķēde - izmanto, ja vēlaties nodot vērtību funkcijai, nemainot konteinera stāvokli. Parasti beigās karte zvani.
no - atgriezt pašreizējo vērtību
const randomInt = (max) => Math.floor(Math.random() * (max + 1))
const randomNumber = randomInt(200) // atgriež skaitli no 0 līdz 200
reduce(randomNumber) // atgriež (skaitli no 0 līdz 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() // atgriež skaitli no 0 līdz 200
randomNumber.chain(reduce) // atgriež (skaitli no 0 līdz 200) - 1
Dažreiz papildus funkcijām, kas izraisa vērtības jauno stāvokli, ir nepieciešama papildu loģika, kas ir paslēpta konteinerā. Šajā gadījumā noder monada, jo tā ir paplašinājums funktors. Tā var, piemēram, izlemt, kas notiks, ja vērtībai būs noteikta vērtība, vai kāds ceļš jāizvēlas nākamajām darbībām.
Monādes varbūt atrisina problēmu ar vērtībām, kas neatgriež true. Ja tā notiek, turpmākie karte izsaukumi tiek ignorēti, bet tas ļauj atgriezt alternatīvu, izsaucot getOr metode. Tas ļauj izvairīties no if / else operatoru izmantošanas, kas ir populāri metodēs. imperatīvs programmēšana. Šī monāde sastāv no trim konteineriem:
Nekas - darbojas, kad konteinerā iekrīt vērtība, kas nav true, vai filtrs metode atgriež false. To izmanto, lai simulētu funkcijas izpildi. Tas nozīmē, ka šis konteiners saņem funkciju, bet neizpilda to.
Tikai - tas ir galvenais konteiners, kas veic visas funkcijas, bet, ja vērtība mainās uz nepatiesu vērtību vai filtrs metode atgriež false, tā to nodos vienumam Nekas konteiners.
Varbūt - Es ņemu sākotnējo vērtību un izlemju, kādu konteineru izsaukt sākumā.
const Just = vērtība => ({
map: fn => Maybe(fn(value)),
chain: fn => fn(value),
of: () => value,
getOr: () => value,
filter: fn => fn(value) ? Just(value) : Nekas(),
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'
? nekas()
: Just(value)

Tagad izveidosim iepriekšējo piemēru par nosacījumu. Ja max ir lielāks par nulli, funkcija tiks izpildīta. Pretējā gadījumā tā atgriezīs 0.
const randomInt = (max) => {
if(max > 0) {
return Math.floor(Math.random() * (max + 1))
} citādi {
return 0
}
}
const bookMiddlePage = 200
const randomPage = randomInt(10) || bookMiddlePage // atgriež nejaušības principu
const randomPage = randomInt(-10) || bookMiddlePage // atgriež 200
const randomIntWrapper = (max) =>
Maybe(max)
.filter(max => max > 0) // vērtība false ignorē turpmākos izsaukumus
.map(palielināt)
.map(multiplyBy(Math.random()))
.map(Math.floor)
const bookMiddlePage = 200
// Tikai konteiners
const randomPage = randomIntWrapper(10).getOr(bookMiddlePage) // atgriež nejaušo lapu
// Nekas konteiners
const randomPage = randomIntWrapper(-10).getOr(bookMiddlePage) // atgriež 200