Espero escribir un algoritmo para sincronizar dos estructuras jerárquicas. Estas estructuras podrían ser gráficos de objetos, datos almacenados en tablas de bases de datos relacionales, etc. (incluso dos estructuras diferentes, siempre que tengan claves comparables). La sincronización será unidireccional, es decir, una estructura será el prototipo y la otra se modificará para coincidir.Sincronización unidireccional de dos jerarquías
Digamos que tenemos una función sync
. Se tendría que aceptar la siguiente:
objA
- el prototipoobjB
- el objeto a ser modificadokeyA
- función de generación de claves paraobjA
keyB
- función clave de generación paraobjB
addB
- función para crear unobjB
(devuelve el ID del nuevoobjB
)setB
- función para actualizarobjB
remB
- función para borrar unaobjB
parB
- Identificación de los padresobjB
's - esto se pasa aaddB
para el contexto
Así que tenemos esto:
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) = ...
Ahora aquí es donde estoy teniendo problemas. 'a
y 'b
son jerárquicos, por lo que la función necesita saber qué propiedades de 'a
y 'b
debe atravesar (una vez que compara sus claves y decide que coinciden hasta el momento y deben atravesarse más). Para estas propiedades "secundarias", necesita todos los mismos argumentos pasados para la sincronización, pero para sus respectivos tipos.
Aquí es cuando se hizo evidente que este es un problema de estructura de datos. ¿Cómo puedo encadenar esta información de manera que el objeto raíz se pueda pasar al sync
y pueda atravesar los gráficos hacia abajo? Mi pensamiento inicial fue incorporar todos los argumentos en una clase, que tendría una propiedad para niños (un ResizeArray
del mismo tipo). Pero con varias propiedades que tienen diferentes tipos, no pude encontrar una manera de hacerlo funcionar, salvo arrojar tipos por la ventana y hacer la mayoría o todos los argumentos de tipo obj
.
Así que aquí están mis preguntas:
- ¿Existe un método bien establecido para hacer esto ya (no he podido encontrar nada)
- ¿Qué estructura de datos podría usar para encapsular el datos necesarios para hacer que esto funcione?
Hice mi mejor esfuerzo para explicar esto a fondo, pero si algo no está claro, por favor pregunte e intentaré proporcionar mejor información.
Supongo que necesitará una estructura de datos intermedia en la que funcionará este algoritmo, también para varios tipos de datos, necesitará transformar esos datos a la estructura de datos intermedia, ejecutar el algoritmo y luego volver a transformarlo en datos originales formulario – Ankur