Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Specification for diffing and merging of Lists

Daniel Bechler edited this page Jul 1, 2013 · 2 revisions

(WORK IN PROGRESS)

  • Given an Object Differ
    • when comparing BASE([a, b]) to WORKING([b, a])
      • it should detect that a has moved behind b
      • it should detect that b has moved before a
      • when merging the result into List [c]
        • it should produce a List equal to [c, b, a]
    • when comapring base List [a, a] to working List [a]
      • it should detect that one a has been removed
      • it should detect that the other a is still there
      • when merging the result into List [b, a, c]
        • it should produce a List equal to [b, a, c]
      • when merging the result into List [b, a, a, c]
        • it should produce a List equal to [b, a, c]
    • 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 b right behind the second subsequence [a, b]
    • when comapring base List [a] to working List [a, a]
      • it should detect that one a has been added
      • it should detect that there are two a's
    • 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]
    • 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]
    • 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]
    • 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]?

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.

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /