JavaScript Academy · Oppitunti

Puhtaat funktiot ja sivuvaikutukset

Kirjoittakaa ennakoitavia ja testattavia funktioita.

Oppitunti 1/413 vaihetta

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 5

Deterministinen 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 20

Mikä 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 pure

Riippuvuus 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 result

Funktion 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));   // 20

Argumenttien 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 changed

Uusien 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 edge

Referentiaalinen 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); // true

Epä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, testable

Pikakertaus

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.

Aloita maksutta

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

  1. Puhtaat funktiot ja sivuvaikutukset
  2. Deklaratiivinen datan muunnos
  3. Mutoinnin välttäminen
  4. Point-free-tyyli
← Takaisin: JavaScript Academy