Was sind reine Funktionen in JavaScript?

Reine Funktionen sind die Bausteine ​​der funktionalen Programmierung. Sie werden fĂŒr Einfachheit und Testbarkeit geliebt.

In diesem Artikel finden Sie eine Checkliste , anhand derer Sie feststellen können, ob eine Funktion rein ist oder nicht.

Bild

Checkliste


Eine Funktion muss zwei Bedingungen erfĂŒllen, um als „rein“ zu gelten:

- Jedes Mal, wenn die Funktion dasselbe Ergebnis zurĂŒckgibt, wenn sie mit denselben Argumenten aufgerufen wird

- keine Nebenwirkungen

Lassen Sie uns genauer betrachten.

1. Der gleiche Eingang => Der gleiche Ausgang


Vergleichen Sie dies:

const add = (x, y) => x + y; add(2, 4); // 6 

Mit diesem:

 let x = 2; const add = (y) => { x += y; }; add(4); // x === 6 (the first time) 

Im ersten Fall wird der Wert basierend auf den angegebenen Parametern zurĂŒckgegeben, unabhĂ€ngig davon, wo / wann Sie ihn aufrufen.

Wenn Sie 2 und 4 addieren, erhalten Sie immer 6.

Nichts beeinflusst das Ergebnis.

Unreine Funktionen = inkonsistente Ergebnisse

Das zweite Beispiel gibt nichts zurĂŒck. Er verlĂ€sst sich auf die allgemeine Bedingung, um seine Arbeit auszufĂŒhren, indem er die Variable außerhalb seines Feldes erhöht.

Dieses Modell ist ein Albtraum fĂŒr Entwickler.

Der gemeinsam genutzte Status fĂŒhrt eine ZeitabhĂ€ngigkeit ein. Sie erhalten unterschiedliche Ergebnisse, je nachdem, wann Sie die Funktion aufgerufen haben. Das erste Mal ist das Ergebnis 6, das nĂ€chste Mal 10 und so weiter.

Was ist besser?

In welchem ​​Fall erhalten Sie weniger Fehler, die nur unter bestimmten Bedingungen auftreten?

In welchem ​​Fall ist es wahrscheinlicher, dass Sie in einer Multithread-Umgebung erfolgreich sind, in der ZeitabhĂ€ngigkeiten das System beschĂ€digen können?

Auf jeden Fall in der ersten.

2. Keine Nebenwirkungen


Bild

Dieser Test ist eine Checkliste fĂŒr sich.

Beispiele fĂŒr Nebenwirkungen:

  1. Änderung der Eingabeparameter
  2. console.log
  3. HTTP-Aufrufe (AJAX / fetch)
  4. DateisystemÀnderung
  5. DOM-Anfragen

TatsĂ€chlich bezieht sich jede von einer Funktion ausgefĂŒhrte Arbeit nicht auf die Berechnung des Endergebnisses.

Ich rate Ihnen, sich das Video von Bob Martin anzuschauen.

Hier ist eine "schmutzige" Funktion mit einem Nebeneffekt.

 const impureDouble = (x) => { console.log('doubling', x); return x * 2; }; const result = impureDouble(4); console.log({ result }); 

console.log hier ist ein Nebeneffekt, aber es wird nicht schaden. Bei gleichen Daten erhalten wir immer noch die gleichen Ergebnisse.

Dies kann jedoch zu Problemen fĂŒhren.

Objektwechsel „unrein“

 const impureAssoc = (key, value, object) => { object[key] = value; }; const person = { name: 'Bobo' }; const result = impureAssoc('shoeSize', 400, person); console.log({ person, result }); 

Die Personenvariable wurde fĂŒr immer geĂ€ndert, da die Funktion durch eine Zuweisungsanweisung deklariert wurde.

Geteilter Zustand bedeutet, dass die Auswirkungen von unreinem Assoc nicht mehr vollstĂ€ndig erkennbar sind. Um die Auswirkungen auf das System zu verstehen, mĂŒssen Sie jetzt jede Variable verfolgen, die es jemals berĂŒhrt hat, und den Verlauf kennen.

Geteilter Zustand = ZeitabhÀngigkeiten.

Wir können impureAssoc löschen, indem wir einfach ein neues Objekt mit den gewĂŒnschten Eigenschaften zurĂŒckgeben.

"Wir reinigen es"

 const pureAssoc = (key, value, object) => ({ ...object, [key]: value }); const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

PureAssoc gibt jetzt das Testergebnis zurĂŒck, sodass Sie sich keine Sorgen machen mĂŒssen, wenn es sich an anderer Stelle Ă€ndert.

Es könnte so gemacht werden:

 const pureAssoc = (key, value, object) => { const newObject = { ...object }; newObject[key] = value; return newObject; }; const person = { name: 'Bobo' }; const result = pureAssoc('shoeSize', 400, person); console.log({ person, result }); 

Das Ändern der Eingabe kann gefĂ€hrlich sein, aber das Ändern der Kopie ist kein Problem. Das Endergebnis ist eine testbare, vorhersehbare Funktion, die unabhĂ€ngig davon funktioniert, wo und wann Sie sie aufrufen.

Änderungen sind auf diesen kleinen Bereich beschrĂ€nkt, und Sie geben den Wert immer noch zurĂŒck.

Zusammenfassung

  • Eine Funktion ist rein, wenn sie keine Nebenwirkungen hat und jedes Mal dasselbe Ergebnis zurĂŒckgibt, wenn sie mit denselben Argumenten aufgerufen wird.
  • Zu den Nebenwirkungen gehören: Ändern der Eingabe, HTTP-Aufrufe, Schreiben auf die Festplatte, Ausgabe auf dem Bildschirm.
  • Sie können die Eingabeparameter sicher klonen und dann Ă€ndern. Lassen Sie das Original einfach unverĂ€ndert.
  • Die Verteilungssyntax (... Syntax) ist der einfachste Weg, Objekte und Arrays zu klonen.

Source: https://habr.com/ru/post/de437512/


All Articles