2 つの階層構造を同期させるアルゴリズムを書きたいと思っています。これらの構造は、オブジェクト グラフ、リレーショナル データベース テーブルに格納されたデータなどである可能性があります (同等のキーを持っている限り、2 つの異なる構造であっても)。同期は一方向になります。つまり、1 つの構造がプロトタイプになり、もう 1 つの構造が一致するように変更されます。
関数があるとしましょうsync
。以下を受け入れる必要があります。
objA
- プロトタイプobjB
-- 変更するオブジェクトkeyA
-- 鍵生成関数objA
keyB
-- 鍵生成関数objB
addB
-- を作成する関数objB
( new の ID を返すobjB
)setB
-- 更新する関数objB
remB
-- を削除する関数objB
parB
-- の親の ID -- これはコンテキストのために にobjB
渡されます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
。
だからここに私の質問があります:
- これを行うための確立された方法はすでにありますか(何も見つけることができませんでした)
- これを機能させるために必要なデータをカプセル化するには、どのデータ構造を使用すればよいでしょうか?
丁寧に説明するよう心がけておりますが、ご不明な点がございましたらお気軽にお尋ねください。