2つの階層構造を同期させるアルゴリズムを書きたいと考えています。これらの構造は、オブジェクトグラフ、リレーショナルデータベーステーブルなどに格納されたデータ(同等のキーを持つ限り、2つの異なる構造であっても)です。同期は一方向、すなわち一方の構造はプロトタイプとなり、他方の構造は一致するように変更される。2つの階層の一方向の同期
sync
の機能があるとします。プロトタイプ
objB
- - keyA
objA
keyB
ための鍵生成機能 - キーの生成機能
objA
:それは次受け入れる必要がありますobjB
addB
-objB
(新規ID:objB
)を作成する関数setB
からobjB
parB
を削除する機能 - -objB
remB
を更新する機能objB
の親のID - これは文脈のためaddB
に渡され
だから我々は持っていますこれは
let sync (objA:'a) (objB:'b) (keyA:'a -> 'k) (keyB:'b -> 'k)
(addB:'p * 'a -> 'p) (setB:'a * 'b -> unit) (remB:'b -> unit)
(parB:'p) = ...
ここで私は問題を抱えています。 'a
と'b
は階層的であるため、関数は'a
と'b
のどちらのプロパティをトラバースする必要があるかを知る必要があります(キーを比較し、これまで通り一致したと判断し、さらにトラバースする必要があります)。これらの「子」プロパティでは、syncに渡されるすべての同じ引数が必要ですが、それぞれの型に対して必要です。
これは、これがデータ構造の問題であることが明らかになったときです。ルートオブジェクトをsync
に渡すことができるように、この情報を一緒に連結することができ、グラフを下方向にトラバースできますか?私の最初の考えは、すべての引数をクラスに組み込むことでした。このクラスは子プロパティ(同じタイプのResizeArray
)を持ちます。しかし、さまざまな型を持つさまざまなプロパティでは、型をウィンドウの外に投げたり、型引数の大部分またはすべてを作成したりするのに手間がかからない方法を見つけられませんでした。obj
だからここ
は私の質問です:
- すでにこれを行うための十分に確立された方法があります(私は何かを見つけることができていない)
- どのようなデータ構造私がカプセル化するために、使用する可能性がありますこの仕事をするために必要なデータ?
私はこれを完全に説明しようと努力しましたが、何か不明な点が残っている場合は、質問してください。より良い情報を提供しようとします。
このアルゴリズムが機能する中間データ構造が必要です。さまざまなタイプのデータに対しても、そのデータを中間データ構造に変換し、algoを実行して元のデータに変換する必要がありますフォーム – Ankur