- 
  Notifications
 
You must be signed in to change notification settings  - Fork 179
 
Specification for diffing and merging of Lists
 Daniel Bechler edited this page Jul 1, 2013 
 ·
 2 revisions
 
 - Given an Object Differ
- when comparing BASE(
[a, b]) to WORKING([b, a])- it should detect that 
ahas moved behindb - it should detect that 
bhas moved beforea - when merging the result into List 
[c]- it should produce a List equal to 
[c, b, a] 
 - it should produce a List equal to 
 
 - it should detect that 
 - when comapring base List 
[a, a]to working List[a]- it should detect that one 
ahas been removed - it should detect that the other 
ais still there - when merging the result into List 
[b, a, c]- it should produce a List equal to 
[b, a, c] 
 - it should produce a List equal to 
 - when merging the result into List 
[b, a, a, c]- it should produce a List equal to 
[b, a, c] 
 - it should produce a List equal to 
 
 - it should detect that one 
 - when comparing base List 
[a, b, a, b, a, a, b]working List[a, b, a, b, b, a, a, b]- it should detect that the second subsequence 
[a, b]has changed to[a, b, b] - when merging the result into the base List
- is should insert the new 
bright behind the second subsequence[a, b] 
 - is should insert the new 
 
 - it should detect that the second subsequence 
 - when comapring base List 
[a]to working List[a, a]- it should detect that one 
ahas been added - it should detect that there are two 
a's 
 - it should detect that one 
 - when merging the diff of Lists 
[a, b, c]and[c, b, a]into an empty List- it should produce a List equal to 
[c, b, a] 
 - it should produce a List equal to 
 - when merging the diff of Lists 
[a, b, c]and[c, b, a]into List[b]- it should produce a List equal to 
[c, b, a] 
 - it should produce a List equal to 
 - when merging the diff of Lists 
[a, b, c]and[c, b, a]into List[b, b, a]- it should produce a List equal to 
[b, c, b, a] 
 - it should produce a List equal to 
 - when merging the diff of List 
[a]and[a, a]two times into List[a]- should it produce a List equal to 
[a, a]? - should it produce a List equal to 
[a, a, a]? 
 - should it produce a List equal to 
 
 - when comparing BASE(
 
It looks like the merging strategy depends on what the user needs and there is no one-size-fits-all solution. The visitor pattern doesn't really allow for idempotent List merges. How could one realize idempotent merging?
- A visitor that captures the items to merge which offers a method, that'll merge based on the items in the target List.
 - The ListNode could offer a merge method that only affects items from the working and base version of the diffed object.
 
What if idempotent merging isn't desired?
- The visitor approach could be used to implement custom merging strategies
 
I think it makes sense to implement the built-in idempotent merging strategy based on the visitor pattern, to allow the user to replace it with his custom logic.