2015-03-01 7 views
5

Dies ist eine ziemlich allgemeine Frage. Funktional-Stil-Programmierung fördert die Idee, dass ein Programm über die Transformation von Daten durch Funktionen ist, und dass Mutation vermieden werden sollte (außer möglicherweise innerhalb einer Funktion, als eine grundlegende Einheit der Abstraktion gesehen).JavaScript im funktionalen Stil: Gute Praxis, um eine Argumentation zu vermeiden?

Aber in diesem Programm:

function foo (bar) { 
    bar.k1 = "bananas"; 
    return bar; 
} 

var o = { k1: "apples", k2: "oranges"}; 
var p = foo(o); 

die externe Variable o innerhalb foo mutiert ist, weil bar ein Verweis auf o ist, und am Ende, o === p (sie das gleiche Objekt verweisen). Aber das funktionale Paradigma würde eher erwarten, dass p frische Daten sind.

Die offensichtliche Lösung ist das Argument zu klonen (e g Strich/lodash der _.clone verwenden..):

function foo (_bar) { 
    var bar = _.clone(_bar); 
    bar.k1 = "bananas"; 
    return bar; 
} 

Aber ich frage mich, ob dies der richtige Weg ist, um dieses Problem zu denken. Würden Sie es in einer FP-Perspektive für eine gute Praxis halten, die als Argumente übergebenen Objekte zu klonen, wenn sie mutiert werden? (Ich bin mir bewusst, dass nicht alle Objekte leicht geklont werden können, wenn überhaupt, aber bleiben wir bei einfachen Fällen). Ihre Gedanken?

+0

Meine 2 Cent ist Code zu schreiben, der mit der Sprache funktioniert und nicht auf Programmiertechniken hängen bleibt. Funktionale Programmierung ist gut und schön, aber wenn Sie kein neues Objekt benötigen, gibt es keinen Grund, einen zurückzugeben, wenn Sie nur das Original ändern können. – adeneo

+0

Ich muss das Objekt zurückgeben, wenn ich etwas tun möchte: 'someOtherFunction (foo (o))'. Was Sie wahrscheinlich meinen, ist, dass es egal ist, ob dies ein frisches Objekt oder eine Referenz auf das externe Objekt ist. –

+0

Ob es zählt oder nicht, liegt an Ihnen? Benötigen Sie das ursprüngliche Objekt unverändert, wenn es keinen Grund gibt, ein neues Objekt zu erstellen, geben Sie einfach dasjenige Objekt zurück, das nach der Änderung an die Funktion übergeben wurde. – adeneo

Antwort

5

Idealerweise sollte die Funktion jedes Mal, wenn sie aufgerufen wird, ein brandneues Objekt zurückgeben. Aus Performance-Gründen ist es natürlich nicht so toll, deshalb gibt es persistent data structures. Es gibt ein paar Bibliotheken für JS; immutable-js ist wohl der beliebteste.

Andernfalls ist die Mutation des Objekts in Ordnung, und in JS ist es üblich, da nicht jedes Projekt sofort von persistenten Datenstrukturen und dem Gewicht der Bibliothek profitieren würde.

Beachten Sie auch, dass in JavaScript alles nach Wert übergeben wird, aber Werte selbst können Referenzen enthalten.

Verwandte Themen