树结构:不变性

时间:2016-12-14 08:44:10

标签: javascript typescript tree immutability immutable.js

昨天我正陷入困境之中。

对于编写树库,我想在内部使用ImmutableJS有几个原因(不变性(显然),因为持久的数据结构,有效的内部撤销堆栈,带有操作和查找方法的方便的集合类型)。 由于我的图书馆将依赖于ImmutableJS,我也考虑过将不可变性用于公共API。但是我发现自己处于某种两难的境地。

通过允许不可变的api,我允许消费者访问克隆的树状态,我不确定这是否是所希望的行为。
将从库内维护多个树/节点状态(撤消/重做堆栈)。允许用户使用多个树/节点版本可能会打开错误和困境 例如:

var node1 = new Node(); 
var tree1 = new Tree(); 
var tree2 = tree1.setRootNode(node1); 
var node2 = node1.append(new Node()); 

现在,消费者在理论上能够转换两个树/节点实例,这些实例本质上是指相同的身份(只有1个'工作树')。树的“旧”版本由undo-stack内部管理,我不认为允许消费者更改旧版本的树,但他们能够做到。

另一方面,我发现以下内容更加透明,因为公共API中的不同树/节点版本没有混淆:

var node1 = new Node(); 
var tree1 = new Tree(); 
tree1.setRootNode(node1); 
node1.append(new Node()); 

这对我来说似乎更不容易......我也注意到jQuery append适用于可变节点,不确定是否有相似的原因。 如果消费者真的想要一个克隆,那么它可以简单地完成,例如:

var tree2 = tree1.clone(); 

但是这里意图很清楚,第二棵树也会得到自己的内部撤销堆栈 你有什么看法?我还应该在公共场合使用不变性吗? 我问这个问题,因为我知道有多少用户喜欢不变性。

0 个答案:

没有答案