Píšte bezpečnejšie a čistejšie kódy využitím sily „Nemennosť“

Nezmeniteľnosť je jedným zo stavebných kameňov funkčného programovania. Umožňuje vám písať bezpečnejšie a čistejšie kódy. Na niektorých príkladoch v jazyku JavaScript vám ukážem, ako môžete dosiahnuť nemennosť.

Podľa Wikipédie (zdroj):

Nemenný objekt (nemenný objekt) je objekt, ktorého stav nie je možné po vytvorení zmeniť. Toto je na rozdiel od premenlivého objektu (premenlivého objektu), ktorý je možné po vytvorení upraviť. V niektorých prípadoch sa objekt považuje za nemenný, aj keď sa niektoré interne používané atribúty zmenia, ale stav objektu sa z vonkajšieho hľadiska javí ako nemenný.

Nezmeniteľné polia

Polia sú dobrým východiskovým bodom na získanie pochopenia toho, ako nemennosť v skutočnosti funguje. Pozrime sa.

const arrayA = [1, 2, 3];arrayA.push(4); const arrayB = arrayA;arrayB.push(5); console.log(arrayA); // [1, 2, 3, 4, 5]console.log(arrayB); // [1, 2, 3, 4, 5]

Tento príklad priraďuje poleB k odkazu na poleA , takže metóda push pridáva hodnotu 5 do oboch premenných. Náš kód nepriamo mutuje ďalšie hodnoty, čo nie je to, čo chceme robiť. Porušuje sa tým zásada nemennosti.

Náš príklad môžeme vylepšiť tak, aby bol nemenný, pomocou funkcie rezu a správanie sa kódu sa líši.

const arrayA = [1, 2, 3];arrayA.push(4); const arrayB = arrayA.slice(0);arrayB.push(5); console.log(arrayA); // [1, 2, 3, 4]console.log(arrayB); // [1, 2, 3, 4, 5]

To je presne to, čo chceme. Kód nemutuje ostatné hodnoty.

Pamätajte si: Keď na pridanie hodnoty do poľa použijete push, dôjde k mutácii poľa. Chcete sa vyhnúť mutovaniu premenných, pretože to môže vo vašom kóde spôsobiť vedľajšie účinky. Funkcia rezu vráti kópiu poľa.

Funkcie

Teraz viete, ako zabrániť mutovaniu ďalších hodnôt. Ako by ste napísali funkcie, aby boli „čisté“? Pure je ďalšie slovo, ktoré sa nazýva funkcia, ktorá nemá žiadne vedľajšie účinky a nezmení stav.

Pozrime sa na funkciu, ktorá využíva rovnaký princíp z príkladu polí. Najskôr vytvoríme funkciu, ktorá mutuje inú hodnotu, potom vylepšíme funkciu tak, aby bola „čistá“.

const add = (arrayInput, value) => { arrayInput.push(value); return arrayInput;};
const array = [1, 2, 3]; console.log(add(array, 4)); // [1, 2, 3, 4]console.log(add(array, 5)); // [1, 2, 3, 4, 5]

Takže opäť mutujeme náš vstup, ktorý vytvára nepredvídateľnú funkciu. Vo svete funkčného programovania existuje zlaté pravidlo okolo funkcií: funkcia s rovnakým vstupom by mala vždy vrátiť rovnaký výsledok .

Vyššie uvedená funkcia porušuje zlaté pravidlo. Zakaždým, keď sa volá naša funkcia add , mutuje premennú poľa a výsledok je iný.

Pozrime sa, ako môžeme zmeniť implementáciu našej funkcie pridania tak, aby bola nemenná.

const add = (arrayInput, value) => { const copiedArray = arrayInput.slice(0); copiedArray.push(value); return copiedArray;}; const array = [1, 2, 3];
const resultA = add(array, 4);console.log(resultA); // [1, 2, 3, 4]
const resultB = add(array, 5);console.log(resultB); // [1, 2, 3, 5]

Teraz môžeme našu funkciu zavolať viackrát a na základe vstupu môžeme očakávať, že výstup bude rovnaký. Je to preto, že už nemutujeme premennú poľa . Túto funkciu môžeme nazvať „čistou funkciou“.

Poznámka: Môžete tiež použiť concat , namiesto rezu a tlačiť .

Takže: arrayInput.concat (hodnota);

Na skrátenie tejto funkcie môžeme použiť syntax šírenia, ktorá je k dispozícii v ES6.

const add = (arrayInput, value) => […arrayInput, value];

Súbežnosť

Aplikácie NodeJS používajú koncept nazývaný súbežnosť. Súbežná operácia znamená, že dva výpočty môžu dosiahnuť pokrok bez ohľadu na druhý. Ak existujú dve vlákna, druhý výpočet nemusí na postup čakať na dokončenie prvého.

NodeJS umožňuje súbežnosť s cyklom udalostí. Smyčka udalostí opakovane berie udalosť a spúšťa všetkých spracovateľov udalostí, ktorí ju počúvajú, jednu po druhej. Tento model umožňuje aplikácii NodeJS spracovať obrovské množstvo požiadaviek. Ak sa chcete dozvedieť viac, prečítajte si tento článok o cykle udalostí.

Čo má nemennosť spoločné so súbežnosťou? Pretože viaceré operácie môžu súčasne meniť hodnotu mimo rozsah funkcie, vytvára to nespoľahlivý výstup a spôsobuje neočakávané výsledky. Dávajte pozor na funkciu, ktorá mutuje premenné mimo jej rozsahu, pretože to môže byť skutočne nebezpečné.

Ďalšie kroky

Nezmeniteľnosť je dôležitý koncept, ktorý musíte pochopiť na svojej ceste za osvojením funkčného programovania. Možno by ste sa mali pozrieť na knihu ImmutableJS, ktorú vytvorili vývojári na Facebooku. Knižnica poskytuje určité nemenné dátové štruktúry, ako sú Mapa , Súbor a Zoznam .

Immutable.js, trvalé dátové štruktúry a zdieľanie štruktúr

Prečo používať súbor Immutable.js namiesto bežného objektu JavaScriptu? Funkcie vyššej objednávky medium.com : Používanie filtra, mapovania a zmenšovania pre udržovateľnejší kód

Funkcie vyššieho poradia vám môžu pomôcť vylepšiť hru JavaScriptu tým, že váš kód urobí deklaratívnejším. To je ... medium.freecodecamp.org

Kliknite na ikonu? nižšie, aby ostatní ľudia videli tento článok tu na médiu. Vďaka za prečítanie.