Ich versuche herauszufinden, wie ich mit Standardvariablenwerten umgehen kann, wenn ich Funktionen ohne Nebenwirkungen mache, und habe Folgendes erreicht:
function getDefaultSeparator() {
return ':';
}
function process(input, separator) {
var separator = separator || getDefaultSeparator();
// Use separator in some logic
return output;
}
Das Standardtrennzeichen wird in anderen Funktionen verwendet und ich möchte es nur an einer Stelle definieren.
Wenn dies eine reine Funktion ist, was ist der Unterschied zur Verwendung einer globalen DEFAULT_SEPARATOR-Konstante?
process
(mit umgekehrter Parameterreihenfolge) und dann die Curry-Funktion aufvar processDefault = process(":")
Antworten:
Das hängt davon ab, was die andere Funktion tut und was die aufrufende Funktion tut. Unreinheit ist ansteckend, Reinheit nicht.
Das Aufrufen einer reinen Funktion ändert nichts an der Reinheit der aufrufenden Funktion. Das automatische Aufrufen einer unreinen Funktion macht die aufrufende Funktion ebenfalls unrein.
In Ihrem Beispiel hängt es also von der Reinheit des Teils ab, den Sie ausgelassen haben: Wenn das rein ist, ist die gesamte Funktion rein.
Nichts. Eine Funktion, die immer den gleichen Wert zurückgibt, ist von einer Konstanten nicht zu unterscheiden. Genau so werden Konstanten im λ-Kalkül modelliert.
quelle
func
, die Nebenwirkungen hat, wenn Sie 0 übergeben, aber nicht, wenn Sie 1 übergeben, können Sie vernünftigerweise sagen, dassfunc
eine Funktion, die selbst "unrein" ist, diese alsfunc(1)
(und den Rückgabewert ignorierend) aufruft sagen) ist nicht unbedingt unrein. Das Anrufenfunc
reicht aus, um den Anrufer als potenziell unrein zu "beschmutzen", aber eine befleckte Funktion könnte sich auf irgendeine Weise als rein erweisen. Zumindest in Javascript, wo rein / unrein nicht in der Sprache definiert ist.Ja, das sind beide reine Funktionen (vorausgesetzt, der elidierte Teil ist auch rein), weil:
Beachten Sie, dass, wenn dies
getDefaultSeparator()
keine reine Funktion wäre, auchprocess()
keine rein wäre.In Javascript gibt es keinen bedeutenden Unterschied zwischen der Verwendung einer reinen Funktion oder einer Konstanten, und beide können von einer reinen Funktion verwendet werden, solange die Fähigkeit von Javascript, Funktionen neu zu definieren oder die Werte von Konstanten zu ändern, vermieden wird.
Ein Schlüsselkonzept hinter reinen Funktionen ist, dass sie durch den Wert ersetzt werden können, den sie zurückgeben, ohne die Ergebnisse des Programms zu beeinflussen.
quelle
Wie die anderen sagen, ist es sicher immer noch eine reine Funktion.
Lassen Sie uns jedoch über die Designprobleme sprechen. Sie haben Recht, etwas zu tun, um den Code TROCKEN zu halten, indem Sie den Wert nur einmal eingeben. Darüber hinaus sollte meines Erachtens auch das angemessene Maß an Kopplung berücksichtigt werden.
Die Verwendung einer Funktion bietet Ihnen mehr Flexibilität beim Ändern der Implementierung, dh, der Funktionsansatz bietet eine lockerere Kopplung als eine globale Variable.
Die Frage ist, ob man es braucht oder nicht?
Wenn sich Verbraucher und Anbieter im selben Modul befinden und der Anbieter für das Modul privat ist, ist es schwer zu argumentieren, dass diese Ebene der losen Kopplung erforderlich ist, da der Anbieter ein Upgrade von einer privaten Variablen auf eine benötigt Bei einer privaten Methode kann gleichzeitig ein einfaches Refactoring innerhalb des Moduls auf die Verbraucher angewendet werden. Die Verwendung einer Methode / Funktion, bevor Sie sie wirklich benötigen, kann unter YAGNI fallen.
Selbst wenn sich Verbraucher und Anbieter in unterschiedlichen Modulen befinden, die Module jedoch zusammen versioniert sind (z. B. verwenden Sie einen Minifyer, sodass sich die Module von Verbrauchern und Anbieter in derselben Datei befinden), kann YAGNI ebenfalls angewendet werden.
Befindet sich der Produzent beispielsweise in einem Bibliotheks- oder API-Paket oder -Modul, das separat von den Verbrauchern versioniert ist, kann die Verwendung der Funktion angemessen sein. In diesem Fall sollten wir uns die Langlebigkeit der API und Prinzipien wie OCP ansehen.
(Wenn Ihr Code eine signifikante Größe hat, würde ich die Verwendung von Modulen mit Feldern und Methoden anstelle globaler Variablen und Funktionen empfehlen.)
quelle