Односторонняя синхронизация двух иерархий

Я надеюсь написать алгоритм для синхронизации двух иерархических структур. Эти структуры могут быть графами объектов, данными хранятся в таблицах реляционной базы данных и т. д. (даже в двух разных структурах, если они имеют сопоставимые ключи). Синхронизация будет односторонней, т. е. одна структура будет прототипом, а другая будет изменена для соответствия.

Допустим, у нас есть функция sync . Она должна принять следующее:

  1. objA - прототип
  2. objB - объект, который нужно изменить
  3. keyA - функция генерации ключей для objA
  4. keyB - функция генерации ключей для objB
  5. addB - функция для создания objB (возвращает идентификатор нового objB )
  6. setB - функция для обновления objB
  7. remB - функция для удаления ete an objB
  8. parB - идентификатор родителя 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 , и он мог перемещаться по графам вниз? Моя первоначальная мысль заключалась в том, чтобы объединить все аргументы в класс, который будет иметь свойство children ( ResizeArray того же типа). Но с различными свойствами, имеющими разные типы, я не мог найти способ заставить его работать, кроме как выбросить типы в окно и сделать большую часть или все аргументы типа obj .

Итак, вот мои вопросы:

  1. Есть ли уже хорошо зарекомендовавший себя метод для этого (я ничего не смог найти)
  2. Какую структуру данных я мог бы использовать для инкапсуляции данных, необходимых для работы?

Я изо всех сил старался объяснить это подробно, но если что-то останется неясным, спрашивайте, и я постараюсь предоставить более точную информацию.

12
задан Daniel 20 August 2011 в 00:11
поделиться