Warum werden bei dieser Implementierung einer reinen Funktion keine externen Abhängigkeiten berücksichtigt?

2 Antworten

16

Meine Erklärung für die Funktionsreinheit in JavaScript ist, dass es keine binäre "reine" oder "unreine" gibt, sondern eher ein Vertrauensspektrum, dass sich eine Funktion vorhersagbar verhält. Es gibt alle Arten von Tricks, die gespielt werden können, um eine Funktion zu erzeugen, die rein zu sein scheint, zum Beispiel wenn man ein Objekt mit einem Side-Getter übergibt.

Wenn wir also erkennen, dass es bei der Reinheit um den Grad des Vertrauens geht, können wir dann fragen, wie zuversichtlich ich bin, dass sich eine Funktion so verhält, wie ich es erwarte? Wenn diese Funktion auf eine andere Funktion verweist, wie sicher sind Sie dann, dass die andere Funktion rein ist? Und außerdem, wie sicher sind Sie, dass der Bezeichner, der auf diese andere Funktion verweist, nicht neu zugewiesen werden kann, um auf eine andere Funktion zu zeigen, die Sie nicht kennen?

Ich persönlich programmiere meine Programme so, dass ich fast nie einen Bezeichner neu definiere, der auf eine Funktion zeigt, besonders wenn diese Funktion deklariert ist und nicht nur ein Funktionsausdruck. Auf diese Weise bin ich sehr zuversichtlich (sagen wir 99,99%), dass, wenn foo(..) bar(..) aufruft, und ich bin zuversichtlich, dass bar(..) zuverlässig rein ist, dann ist foo(..) auch zuverlässig rein, weil ich mich kenne wird bar(..) keiner anderen Funktion neu zuweisen und zu überraschenden Ergebnissen führen.

Manche Leute gehen sogar so weit, ihre Funktionskennungen mit const fn = function .. zu definieren. Ich glaube nicht, dass das viel hilft ... es würde wahrscheinlich mein Konfidenzniveau von 99,99% auf 99,999% bringen. Das bewegt die Nadel nicht genug, um ihre Verwendung zu rechtfertigen, IMO.

Darüber hinaus auf der Schließung Teil Ihrer Frage: Wenn eine innere Funktion schließt über eine äußere Variable, die noch in einer reinen Funktion enthalten ist, und nichts diese Variable neu zugewiesen, dann ist es effektiv eine Konstante Daher ist mein Vertrauensniveau in der Vorhersagbarkeit sehr hoch.

Aber das Take-Away ist, dass die Funktionsreinheit in JS ungefähr dem Grad des Vertrauens entspricht, nicht einem absoluten binären Ja oder Nein.

    
Kyle Simpson 03.10.2016, 15:18
quelle
5

Die Definition einer reinen Funktion lautet:

  

Eine Funktion, die bei gleichen Argumentwerten immer den gleichen Ergebniswert auswertet und keine semantisch beobachtbaren Nebeneffekte oder Ausgaben hervorruft, wie Mutation veränderbarer Objekte oder Ausgabe an I / O-Geräte.

"Abhängigkeiten zu haben" spielt absolut keine Rolle bei der Definition einer reinen Funktion. Es kommt nur darauf an, ob die Funktion irgendwelche Nebenwirkungen hat und ob ihr Ergebnis vom externen Status abhängt. Wenn sich eine Funktion genau gleich verhält und bei gleicher Eingabe immer das gleiche Ergebnis liefert, ist sie rein. Wenn eine Funktion irgendwelche Nebenwirkungen hat (ändert den globalen Zustand) oder sich je nach externem Zustand anders verhält, ist sie unrein. Eine Funktion kann eine andere Funktion als Teil ihrer Operation haben (lesen: call ); Solange diese andere Funktion auch rein ist, wird die Reinheit nicht beeinträchtigt.

Das von Ihnen angezeigte signUp Beispiel ist rein, weil es nur auf seine Eingabe wirkt und immer die exakt gleiche Ausgabe zurückgibt, wenn es mit der gleichen Eingabe aufgerufen wird. Beachten Sie, dass die Funktion selbst nichts "tut". Es ruft nicht die Datenbank auf oder erzeugt keine Nebeneffekte. Es wird nur eine Funktion zurückgegeben. Aber diese zurückgegebene Funktion ist immer dieselbe, wenn die Eingabe die gleiche ist. Diese zurückgegebene Funktion ist in Wirklichkeit unrein; aber die Funktion, die es produziert hat, ist nicht.

    
deceze 03.10.2016 15:04
quelle