I have a collection of objects of the same type, let's call it DataItem
. The user can view and edit these items in an editor. It should also be possible to compare and merge different items, i.e. some sort of diff/merge for DataItem
instances.
The DIFF functionality should compare all (relevant) properties/fields of the items and detect possible differences. The MERGE functionality should then be able to merge two instances by applying selected differences to one of the items.
For example (pseudo objects):
DataItem1 { DataItem2 {
Prop1 = 10 Prop1 = 10
Prop2 = 25 Prop2 = 13
Prop3 = 0 Prop3 = 5
Coll = { 7, 4, 8 } Coll = { 7, 4, 8, 12 }
} }
Now, the user should be provided with a list of differences (i.e. Prop2
, Prop3
, and Coll
) and he should be able to select which differences he wants to eliminate by assigning the value from one item to the other. He should also be able to choose if he wants to assign the value from DataItem1
to DataItem2
or vice versa.
Are there common practices which should be used to implement this functionality?
Since the same editor should also provide undo/redo functionality (using the Command pattern), I was thinking about reusing the ICommand
implementations because both scenarios basically handle with property assignments, collection changes, and so on... My idea was to create Difference
objects with ICommand
properties which can be used to perform a merge operation for this specific Difference
.
Btw: The programming language will be C# with .NET 3.5SP1/4.0. However, I think this is more of a language-independent question. Any design pattern/idea/whatsoever is welcome!