Puhtaat funktiot ja sivuvaikutukset
Kirjoittakaa ennakoitavia ja testattavia funktioita.
Puhtaat funktiot ja sivuvaikutukset on ilmainen JavaScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu JavaScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.
Mikä tekee funktiosta puhtaan
Puhdasta funktiota koskee kaksi ominaisuutta: samoilla syötteillä se palauttaa aina saman tuloksen eikä aiheuta havaittavia sivuvaikutuksia. Puhtaat funktiot ovat ennakoitavia ja helposti testattavia.
function add(a, b) {
return a + b;
}
console.log(add(2, 3));
console.log(add(2, 3)); // always 5Deterministinen tulos
Puhtaus tarkoittaa deterministisyyttä. Samojen argumenttien on aina tuotettava sama tulos, eikä tulos saa riippua piilotilasta, ajasta tai satunnaisuudesta.
function double(n) {
return n * 2;
}
console.log(double(10)); // always 20Mikä on sivuvaikutus
Sivuvaikutus on kaikki, mitä funktio tekee arvon palauttamisen lisäksi: lokiin kirjoittaminen, ulkoisen tilan muuttaminen, tallennukseen kirjoittaminen, verkkokutsut tai argumenttien muuttaminen.
let total = 0;
function impureAdd(n) {
total += n; // side effect: mutates outer state
return total;
}
console.log(impureAdd(5));
console.log(impureAdd(5)); // 5 then 10, not pureRiippuvuus ulkoisesta tilasta
Myös muuttuvan ulkoisen tilan lukeminen rikkoo puhtauden, koska tulos muuttuu, vaikka argumentti pysyy samana.
let rate = 1.5;
function priceImpure(x) {
return x * rate; // depends on outside variable
}
console.log(priceImpure(10)); // 15
rate = 2;
console.log(priceImpure(10)); // 20 - different resultFunktion tekeminen puhtaaksi
Välittäkää kaikki funktion tarvitsemat tiedot argumentteina. Tällöin sen tulos riippuu vain syötteistä.
function price(x, rate) {
return x * rate;
}
console.log(price(10, 1.5)); // 15
console.log(price(10, 2)); // 20Argumenttien muuttaminen tekee funktiosta epäpuhtaan
Funktiolle välitetyn olion tai taulukon muuttaminen on sivuvaikutus, jonka kutsuja voi havaita. Puhtaat funktiot eivät muuta syötteitään.
function impurePush(arr, x) {
arr.push(x); // mutates caller array
return arr;
}
const a = [1, 2];
impurePush(a, 3);
console.log(a); // [1, 2, 3] - caller changedUusien arvojen palauttaminen
Puhdas versio muodostaa ja palauttaa uuden arvon sen sijaan, että se muuttaisi syötettä.
function pureAppend(arr, x) {
return [...arr, x];
}
const a = [1, 2];
const b = pureAppend(a, 3);
console.log(a); // [1, 2] unchanged
console.log(b); // [1, 2, 3]Miksi puhtaudesta on hyötyä
Puhtaat funktiot ovat erittäin helppoja testata (ei alustuksia eikä mock-objekteja), turvallisia välimuistittaa (memoisoida) ja turvallisia suorittaa missä järjestyksessä tahansa tai rinnakkain. Ne helpottavat koodin paikallista päättelyä.
function square(n) { return n * n; }
console.log([1, 2, 3].map(square)); // [1, 4, 9]Epäpuhtauden eristäminen
Kaikkia sivuvaikutuksia ei voi välttää: sovellusten on kirjattava lokiin, haettava tietoja ja piirrettävä sisältöä. Tavoitteena on siirtää vaikutukset reunoille ja pitää ydintoiminta puhtaana.
function computeTotal(items) {
return items.reduce((s, i) => s + i.price, 0);
}
const total = computeTotal([{ price: 5 }, { price: 7 }]);
console.log(total); // 12 - pure core, log at the edgeReferentiaalinen läpinäkyvyys
Puhtaan kutsun voi korvata sen tuloksella muuttamatta ohjelman toimintaa. add(2, 3) ja 5 ovat keskenään vaihdettavissa missä tahansa. Tätä ominaisuutta kutsutaan referentiaaliseksi läpinäkyvyydeksi.
function add(a, b) { return a + b; }
const x = add(2, 3) + add(2, 3);
const y = 5 + 5;
console.log(x === y); // trueEpäpuhtauden tunnistaminen
Kiinnittäkää huomiota seuraaviin merkkeihin: console, Math.random, Date.now, ulompien muuttujien arvon määritykset tai argumenttien muuttaminen. Mikä tahansa näistä tekee funktiosta epäpuhtaan.
function pureRoll(seed) {
return (seed * 1103515245 + 12345) % 100;
}
console.log(pureRoll(42)); // deterministic, testablePikakertaus
Puhtaiden funktioiden tunnistaminen.
Kertaus
Puhtaat funktiot ovat deterministisiä ja vapaita sivuvaikutuksista: ne eivät muuta ulkoista tilaa tai argumentteja eivätkä suorita I/O-toimintoja. Välittäkää riippuvuudet argumentteina ja palauttakaa uusia arvoja muuttamisen sijaan. Puhtaus mahdollistaa testattavuuden, memoisaation, referentiaalisen läpinäkyvyyden ja turvallisen rinnakkaisen suorittamisen. Pitäkää ydin puhtaana ja siirtäkää vaikutukset reunoille.
Opi JavaScript tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 59
- Oppitunnit
- 200
Usein kysytyt kysymykset
Onko oppitunti ”Puhtaat funktiot ja sivuvaikutukset” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa JavaScript Academy-oppimispolun 3 oppituntia, myös oppitunnin “Puhtaat funktiot ja sivuvaikutukset”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Puhtaat funktiot ja sivuvaikutukset”?
Kirjoittakaa ennakoitavia ja testattavia funktioita. Harjoittelet JavaScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni JavaScript Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin JavaScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Puhtaat funktiot ja sivuvaikutukset”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä JavaScript Academy-oppitunnilla?
Kyllä. Jokainen JavaScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Puhtaat funktiot ja sivuvaikutukset
- Deklaratiivinen datan muunnos
- Mutoinnin välttäminen
- Point-free-tyyli