2017-09-28 2 views
1

Beim Lesen der Promises/A+ Spezifikation stieß ich auf den Begriff "tiefe Unveränderlichkeit". Der Text sagt:Was ist tiefe Unveränderlichkeit?

Hier, "muss nicht ändern" bedeutet unveränderliche Identität (d. H. ===), bedeutet aber nicht tiefe Unveränderlichkeit.

Was ist tiefe Unveränderlichkeit? Kann jemand mit einem Beispiel erklären?

+0

Sie müssen entlang der Linien denken, wie '===' funktioniert und was es tut, um festzustellen, ob zwei Dinge gleich sind. –

+1

Oder schauen Sie sich an, wie 'const' funktioniert. "Konst" -Werte haben eine unveränderliche Identität, sind aber nicht tief unveränderlich. – Tex

Antwort

2

Sobald ein Versprechen aufgelöst wurde, haben Versuche, es erneut zu lösen, keine Auswirkung, was bedeutet, dass der aufgelöste Wert immer eine strikte Gleichheit mit dem ursprünglichen aufgelösten Wert hat. Dies bedeutet jedoch nicht, dass der Wert sich nicht ändern kann, d. H. "bedeutet keine tiefe Unveränderlichkeit".

Dies kann mit einem Beispiel demonstriert werden:

var value = [1]; 
var p = Promise.resolve(value); 
p.then(a => console.log(a));     // [1] 
p.then(a => console.log(a === value));  // true 

p.then(a => { a = [2]; console.log(a);});  // [2] 
p.then(a => console.log(a));     // [1] 

p.then(a => { a[0] = 2; console.log(a);}); // [2] 
p.then(a => console.log(a));     // [2] 
p.then(a => console.log(a === value));  // true 

Wie Sie den Wert aus dem aufgelösten Versprechen bleibt den gleichen Objektwert im gesamten zurück sehen - a === value. Versuche, das Objekt an einen anderen Wert zu binden, gelten nur innerhalb des Bereichs des then-Blocks und wir sehen den ursprünglichen Objektwert beim nächsten Aufruf der then-Methode für das Versprechen.

Wenn wir den Wert einer der Eigenschaften dieses Arrays ändern, in diesem Fall das erste Element, bemerken wir, dass diese Änderung den ursprünglichen Wert und damit auch den aufgelösten Wert beeinflusst, der von diesem Versprechen zurückgegeben wird. Wenn der aufgelöste Wert eine tiefe Unveränderbarkeit hätte, wären alle seine Eigenschaften und ihre Eigenschaften unveränderlich, jedoch haben wir gerade gezeigt, dass dies nicht der Fall ist.

+0

Große Antwort und sehr nützliches Beispiel! Kannst du dieses Bit erklären: "Sobald ein Versprechen gelöst wurde, haben Versuche, es wieder zu lösen, keine Wirkung"? Das klingt für mich so, als ob es nichts mit tiefer Unveränderlichkeit zu tun haben würde und ist eigentlich ein weiterer Teil der Promises/A + Spezifikation. Aber vielleicht verstehe ich das falsch? – BillyBBone

+0

Das erklärt, warum Sie immer den ursprünglichen Objektwert aus einem Versprechen erhalten, weil er nicht auf einen anderen Wert aufgelöst werden kann und warum er die Terminologie "darf nicht ändern" verwendet. Diese Formulierung kann so ausgelegt werden, dass sie eine tiefe Unveränderlichkeit bedeutet, die sich auf sie bezieht und warum die Spezifikation klarstellt, dass dies nicht der Fall ist. – Joel

1

In objektorientierten Sprachen gibt es keine gute Möglichkeit, die Objekteigenschaften zu sperren. Wenn Sie beispielsweise mehrere Instanziierungen eines Objekts in Ihrer App vornehmen und einen Eigenschaftswert für eine dieser Referenzen ändern, unterscheiden sich die Daten jetzt zwischen mindestens einer der Referenzen dieses Objekts. Deeply Immutable stellt sicher, dass die Daten für dieses Objekt über alle Verweise programmgesteuert und nach Spezifikation gesperrt bleiben.

Wenn die Anwendungsspezifikationen eine tiefe Unveränderlichkeit angeben, wäre es illegal, das Objekt entweder zu mutieren oder seine Felder neu zuzuweisen.

Wenn die Anwendung flache Unveränderlichkeit angibt, können Sie die Objektfelder immer noch nicht zuweisen, daher unveränderlich, aber Sie dürfen die Objektverweise mutieren.

Es gibt einen großen Artikel auf dieser hier https://homes.cs.washington.edu/~mernst/pubs/immutability-aliasing-2013-lncs7850.pdf

Laut dem Artikel, bevorzugen die meisten Kunden tief immatibility.

Verwandte Themen