【问题标题】:Is partial immutability a good practice?部分不变性是一个好习惯吗?
【发布时间】:2016-10-05 03:41:27
【问题描述】:

请原谅这个极其简单的例子,但我想知道当您需要使用 obj 的值而不使用 immutablejs 或任何其他类似的库修改它的深层嵌套属性时,以下两种方法有什么区别:

//case1
var imm_a = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var a = Immutable.fromJS(imm_a);
a = a.setIn(['owns','car', 0], 'Ford');
//...a bunch of other modifications using immutable.js methods

console.log(a.toJS()); // using the changed value
console.log(imm_a); // imm_a has not changed


//case2
var imm_b = {'names':['Joe', 'Jack'], 'owns':{'car': ['Toyota','Ferrari']}};
var b = Immutable.fromJS(imm_b);
b = b.toJS();
b.owns.car[0] = 'Ford';
//...a bunch of other modifications using native javascript methods

console.log(b); // using the changed value
console.log(imm_b); // imm_b has not changed

在上述两种情况下,我们都有一个对象(imm_a 和 imm_b),其中包含我们不想改变的深度嵌套的 props,但我们需要使用它们修改后的值。在案例 1 中,我们创建了一个 Immutable obj 并使用 Immutable.js 方法直接修改它,在第二种情况下,在我们创建了一个 Immutable 对象之后,我们从中创建了一个原生 Javascript 变量,这样我们就可以使用直接赋值和其他原生方法更轻松地使用它javascript方法。在这两种方法中,我们都达到了保持 imm_a 和 imm_b 不变的目标,但我发现第二种方法更容易修改。但是有什么区别吗?推荐哪一种作为更好的做法?

PS:在这两种情况下,我都不关心ba 的不变性,我只需要imm_aimm_b 保持不变。一个常见的用例是 Redux 应用程序,其中新状态依赖于旧状态,您需要在将旧状态值作为新状态返回之前修改旧状态值。 ab 是这里的局部临时变量。问题是,只要我不依赖它们具有持久值,就可以直接修改它们吗?或者如果我使用不可变的做法,我需要将所有内容都视为不可变?

【问题讨论】:

    标签: javascript redux immutability immutable.js


    【解决方案1】:

    第二个示例完全违背了使用 ImmutableJS 的目的,因为您正在改变 b Javascript 对象的内容。 ImmutableJS 的一个要点是,如果你修改一个对象,你会得到一个全新的对象。

    在这个简单的例子中,它不会产生任何影响,但编写不可变代码的好处是,任何引用了a 的人都知道它永远不会改变,并且在获得后它始终具有相同的值它。在您的第二个示例中,由于您在适当位置更改了 b,因此任何其他引用 b 的代码都将“从它们下面拉出地毯”,因为您的本地更新也将发生在它们的引用上到对象。

    如果你不使用 ImmutableJS 来确保实际的不变性,你最好暂时不要使用它。它为程序增加了重要的开销工作。

    【讨论】:

    • 我知道b 在这里发生了变化,但a 是我所关心的。想象一个场景,其中一些对象需要在整个应用程序执行过程中保持不变,但其他一些本地对象可以改变。一个示例可能是 React/Redux 应用程序中的状态,其中深度嵌套的新状态依赖于旧状态。在这种情况下,为什么我不能创建一个可变的本地值 b 来保存仅在不更改旧状态的情况下返回新状态所需的值。为什么我应该在这里使用 immutablejs 方法而不是仅仅使用适当的值?
    • 同样,如果你不是在编写不可变代码,你可能不需要 immutablejs。保持一切不变的一致性、风格和理解是您选择第一个的原因。
    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 2014-12-22
    • 2020-08-25
    • 2015-05-08
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多