У меня есть коллекция объектов того же типа, назовем его DataItem
. Пользователь может просматривать и редактировать эти элементы в редакторе. Также должно быть возможным сравнивать и объединять разные элементы, то есть какой-либо diff/merge для экземпляров DataItem
.Функция Diff/Merge для объектов (не файлов!)
Функциональность DIFF должна сравнивать все (релевантные) свойства/поля элементов и обнаруживать возможные различия. Затем функциональность MERGE должна быть способна объединить два экземпляра, применив выбранные различия к одному из элементов.
Например (псевдо объекты):
DataItem1 { DataItem2 {
Prop1 = 10 Prop1 = 10
Prop2 = 25 Prop2 = 13
Prop3 = 0 Prop3 = 5
Coll = { 7, 4, 8 } Coll = { 7, 4, 8, 12 }
} }
Теперь пользователь должен быть предоставлен список различий (т.е. Prop2
, Prop3
и Coll
), и он должен быть в состоянии выбрать, какие различия он хочет для устранения путем присвоения значения от одного элемента другому. Он также должен быть в состоянии выбрать, хочет ли он присвоить значение от DataItem1
до DataItem2
или наоборот.
Существуют ли общие практики, которые должны использоваться для реализации этой функциональности?
Так же редактор должен также обеспечить функциональность отмены/повтора (с использованием шаблона Command), я думал о повторном использовании ICommand
реализации, потому что оба сценария в основном справиться с имущественными заданиями, изменениями коллекции, и так далее .. Моя идея состояла в том, чтобы создать объекты Difference
с объектами ICommand
, которые могут быть использованы для выполнения операции слияния для данного Difference
.
КТ: Язык программирования будет C# с .NET 3.5SP1/4.0. Тем не менее, я думаю, что это скорее вопрос, не зависящий от языка. Любой шаблон дизайна/идея/приветствуются!
Ого, я не ожидал, что полный исходный код. :) Благодаря! Я также думал об использовании отражения. Однако я планировал не использовать его из-за проблем с производительностью. Вместо этого я хотел реализовать интерфейс «IDiffable» в каждом классе с помощью метода «Compare (...)»). Какой опыт вы внесли в ваш подход, основанный на размышлениях (по производительности)? Мне придется сравнивать коллекции около 2000 объектов с примерно 50 свойствами каждый (не в одном классе, но учитывается рекурсивно). – gehho
Я не оценил производительность, потому что все было хорошо.Это несколько процесс исключения (дублированная компания вошла и т. Д.) Для нас, поэтому производительность не является основной задачей. Мой совет заключается в том, чтобы использовать самый легкий подход, используя рефлексию и перефакторировать его, если есть реальная проблема с производительностью в мире, т. Е. Преждевременно оптимизировать. –
Спасибо. Возможно, я также дам основанный на размышлении подход сначала. Затем я увижу, соответствует ли он моим требованиям к производительности. – gehho