ツリー構造ライブラリの実装に関連しているが、これは重要な問題の1つです。変更可能性と性能の間のツリー構造のトレードオフを処理する方法
私は2つのコアコンストラクタがあるとします:Tree
とNode
です。
Treeオブジェクトには、ツリーを管理し、Nodeオブジェクトへの参照を取得するメソッドがあります。
私が回避できない問題は、Nodeオブジェクト(およびその子)が不変でなければならないということです。それは、現在のツリーに影響を与えると内部の仕組みを台無しにします
var childNodes = Tree.findNode(5).children;
var node = children[0];
node = "overwrite with something";
または
var parentNode = Tree.findNode(5).parent;
parentNode.children = { text: "Doesn't realize this will change the original node's children" };
:私たちが望んでいないことは、ライブラリのユーザが、内部構造を変異させることができるということです。
また、不変のオブジェクト/配列で作業すると仮定すると、それは連続コピーを意味します。
ツリー構造上の10のランダムノードを1つのノードに(下に)移動したいとします。つまり、配列を変更するためにコピーを作成し、配列全体を再割り当てすることを意味します。 (配列の長さはわからない!)。これは、変更可能なデータ構造ではコストがかからないために莫大な過度の余裕があるようです。それは私の脊柱の中でも、コード志向の面でもっと面倒だと感じています。
私は多くの回避策を試しましたが、最終的に同じジレンマに終わります。
どうすれば解決できますか?
編集:私のユースケースでは順序が重要であるため、ノードの子として配列を使用することをほとんど忘れていました。
オブジェクトgetters/setterを使用して不変型のフォームを作成しようとしましたか?それで私は[relational-json](https://github.com/SebastienDaniel/relational-json)でそれを管理しました。テーブルメソッドを見て、それらも配列をカバーします。そしてパーフォーマンス。かなりまともです。変更可能なオブジェクトの近くにはありませんが、プロダクションではまだ十分です。 –
@SebastienDaniel問題は、どのようにして問題が変わるのか分かりません。その意味では、(私は思うが)それはオブジェクトに関係するときに参照を返し、それを不変にしないということです。私はゲッター/セッターが非常に高価であることを読んだが、多くのノードを扱うのは良いことではない。 – Trace
彼らは最初に出てきたときに非常にコストがかかり、コンパイラーはより良い。 プリミティブだけでなく、オブジェクトを返す場合は、[ImmutableJS](https://facebook.github.io/immutable-js/)を参照してください。 –