There are already two styles of persistence code in my daily work codebase. The first is based on the concept of generating the delta of the change you want to make. The second is the construction of the new data map by chaining functions together.
Let’s take some examples:
delta = { 'when' : now(), 'comment' : 'Hulk smash!', 'tags' : tags.append(new_tags) } comment.update(delta) store.save(comment)
store.save(update_timestamp(comment(update_tags(new_tags), 'Hulk smash!)))
Hopefully you can already see some of the pros and cons about both approaches. The chaining (or trainwreck style) ends up being very short and powerful. However when you need to pass in a few parameters at different points in the chain it can get very complicated to read.
The delta pattern allows you to accumulate changes into the delta neatly and to combine several changes (data, timestamps, audit entries) into one atomic write that is, in my view, easier to read than the chained example. However the boilerplate doesn’t go away and starts to get irritating after a while.
These are Python examples because in Clojure the threading macros and argument lists take away my comprehension concerns.
At the moment I’m continuing to experiment with both strategies and looking for a way to incorporate the best elements of both the comprehension of the delta and the conciseness of chaining.