2017-09-28 4 views
1

En lisant la spécification Promises/A+, je suis tombé sur le terme «immuabilité profonde». Le texte dit:Qu'est-ce que l'immuabilité profonde?

Ici, "ne doit pas changer" signifie une identité immuable (c'est-à-dire ===), mais n'implique pas une immutabilité profonde.

Qu'est-ce que l'immuabilité profonde? Quelqu'un peut-il expliquer avec un exemple?

+0

Vous devez penser à la façon dont '===' fonctionne et ce qu'il fait pour établir si deux choses sont égales. –

+1

Ou regardez comment 'const' fonctionne. Les valeurs 'const' ont une identité immuable mais ne sont pas profondément immuables. – Tex

Répondre

2

Une fois qu'une promesse a été résolue, toute tentative de la résoudre à nouveau n'aura aucun effet, ce qui signifie que la valeur résolue aura toujours une égalité stricte avec la valeur résolue d'origine. Cela ne signifie pas, cependant, que la valeur ne peut pas changer, c'est-à-dire "n'implique pas une immutabilité profonde".

Cela peut être démontré par un exemple:

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 

Comme vous pouvez le voir la valeur retournée par la promesse résolue reste la même valeur de l'objet tout au long - a === value. Les tentatives de lier l'objet à une valeur différente s'appliquent uniquement dans la portée du bloc then et nous voyons la valeur Object d'origine la prochaine fois que nous appelons la méthode then sur la promesse. Lorsque nous modifions la valeur d'une des propriétés de cette matrice, dans ce cas le premier élément, nous remarquons que cette modification affecte la valeur d'origine et donc aussi la valeur résolue renvoyée par cette promesse. Si la valeur résolue avait une immuabilité profonde alors toutes ses propriétés et leurs propriétés seraient immuables, cependant nous venons de montrer que ce n'est pas le cas.

+0

Bonne réponse et exemple très utile! Pouvez-vous expliquer ce petit bout: "Une fois qu'une promesse a été résolue, toute tentative pour le résoudre à nouveau n'aura aucun effet"? Cela me semble être sans rapport avec l'immutabilité profonde, et c'est en fait une autre partie de la spécification Promises/A +. Mais peut-être que je suis un malentendu? – BillyBBone

+0

Cela explique pourquoi vous recevrez toujours la valeur d'objet d'origine d'une promesse, car elle ne peut pas être résolue à une autre valeur, et aussi pourquoi ils utilisent la terminologie "ne doit pas changer". Cette formulation peut être mal interprétée comme signifiant l'immutabilité profonde, qui est comment elle se rapporte et pourquoi la spécification précise que ce n'est pas. – Joel

1

Dans les langages orientés objet, il n'y a aucun moyen de verrouiller les objets. Par exemple, si vous avez plusieurs instanciations d'un objet dans votre application et que vous modifiez une valeur de propriété sur l'une de ces références, les données diffèrent maintenant entre au moins une des références de cet objet. Deeply Immuable garantit que les données de cet objet restent verrouillées, par programmation, par spec, dans toutes les références. Si les spécifications de l'application indiquent une immuabilité profonde, il est alors illégal de muter l'objet ou de réaffecter ses champs.

Si l'application indique l'immutabilité superficielle, vous ne pouvez toujours pas réaffecter les champs d'objets, donc immuable, mais vous êtes autorisé à muter les références des objets.

Il y a un grand article sur ce ici https://homes.cs.washington.edu/~mernst/pubs/immutability-aliasing-2013-lncs7850.pdf

Selon l'article, la plupart des clients préfèrent immatibility profonde.