I've been using Om (and therefore cursors) heavily for almost a year and am
finding myself moving further and further away from cursor. The issue for
me is absolutely the write-back - allowing your views to write to them
encourages your code to do so and encourages a style where your ui/dom
event handlers mutate data. I feel like this is an anti pattern that makes
it difficult to properly manage your state as the application grows unless
you are very disciplined. I much rather have unidirectional data flow and
have ui/dom events only dispatch messages back. So view model data -> ui ->
messages

The messages can then be handled to update the view model or whatever in a
managed way. It's very similar to flux and similar architectures.

Mainly this buys you purer (in the functional sense) code, easier automated
tests, easier to understand/reason about flow of data and ultimately a
simpler design.

That's my opinion at least.

On Wed, 4 Mar 2015 22:57 Marc Fawzi <marc.fa...@gmail.com> wrote:

> Writing to cursors from within components (and generally changing app
> state from within a component) is not a good pattern. You want to have
> clearly defined places where state mutation can happen, and in the normal
> case you put those in event handlers (sitting outside the component but
> being passed the cursor from the component which can be specified during
> event setup)
>
> So this is all about architecture choices, not cursors vs no cursors.
>
>
> On Wed, Mar 4, 2015 at 2:47 PM, Erik Price <e...@zensight.co> wrote:
>
>> Cool, thanks for following up, Mike. I agree with pretty much everything
>> you describe, especially writing to cursors from within a Reagent
>> component. We're using an approach that I'm really happy with (and may blog
>> about at some point), which mitigates the problems you mention even though
>> we are using cursors. Cheers!
>>
>> e
>>
>> On Wed, Mar 4, 2015 at 4:15 PM, Mike Thompson <m.l.thompson...@gmail.com>
>> wrote:
>>
>>> On Saturday, February 28, 2015 at 1:44:52 AM UTC+11, Erik Price wrote:
>>> > On Thu, Feb 26, 2015 at 7:55 PM, Mike Thompson <m.l.tho...@gmail.com>
>>> wrote:
>>> >
>>> >  The key thing for me is:  JUST. DON'T. USE. CURSORS. There I said it.
>>> They appear convenient, I know. They are a way of achieving reference
>>> transparency, I know.  But I think they are a “local optimum”.  Their use
>>> seems to get in the way of a more important data flow paradigm and they
>>> seem to encourage "control" into all the wrong places (components). At
>>> least that's my experience (I did try to love them, really I did :-)).
>>> >
>>> >
>>> >
>>> > I'm fairly new to Reagent, so as far as I can tell, cursors look
>>> great. But it sounds like you've run into situations in which they aren't
>>> helpful. Can you elaborate?
>>>
>>>
>>> Cursors are convenient. You'll get going pretty quickly with them, for
>>> sure.
>>>
>>> But if your app gets a bit bigger you might find some code smell
>>> starting to appear.
>>>
>>> - their use can sometimes distort the way you structure you data.
>>> Cursors want you to layout data hierarchically (which often fine) but one
>>> day you'll find yourself twisting your data structure so as to facilitate
>>> Cursor use.
>>>
>>> - Cursors are simple extractors (which abstract away the path). But they
>>> are not about "Derived Data" or "Materialised Views". They don't deliver to
>>> your view a modified version of the data.  Yes, you can modify the data in
>>> your view, but that means the view is doing too much. Take a view that
>>> needs to show the top 20 items in a vector, when sorted by attribute Y.
>>> Now imagine that you have two views on the same data each with different
>>> sort criteria.  The underlying data can't be sorted two ways at once.  So
>>> the view will have to start doing the sorting.
>>>
>>> - the "write back" feature of Cursors is something I really don't like.
>>> As an app gets bigger, the control logic around updates gets more
>>> complicated. Using writable Cursors is a slippery slope towards more
>>> control logic getting put in the views.
>>>
>>> Overall, I find that Cursor use encourages you to make views do too
>>> much, know too much, which tends to be a problem as apps get bigger.
>>>
>>>
>>> --
>>> Mike
>>>
>>>
>>> .  make your use of Cursors easy, rather than modeling the right way.
>>>
>>> they can sometimes encourage you to structure your data in a tree-like
>>> way ... even though certain way.
>>> - The main problem I have with Cursors is that they are writable.
>>> I've found that they encourage control logic into views.  I prefer my
>>> views to be very passive.
>>>
>>>
>>> --
>>> Note that posts from new members are moderated - please be patient with
>>> your first post.
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "ClojureScript" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to clojurescript+unsubscr...@googlegroups.com.
>>> To post to this group, send email to clojurescript@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/clojurescript.
>>>
>>
>>  --
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "ClojureScript" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojurescript+unsubscr...@googlegroups.com.
>> To post to this group, send email to clojurescript@googlegroups.com.
>> Visit this group at http://groups.google.com/group/clojurescript.
>>
>
>  --
> Note that posts from new members are moderated - please be patient with
> your first post.
> ---
> You received this message because you are subscribed to the Google Groups
> "ClojureScript" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojurescript+unsubscr...@googlegroups.com.
> To post to this group, send email to clojurescript@googlegroups.com.
> Visit this group at http://groups.google.com/group/clojurescript.
>

-- 
Note that posts from new members are moderated - please be patient with your 
first post.
--- 
You received this message because you are subscribed to the Google Groups 
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojurescript+unsubscr...@googlegroups.com.
To post to this group, send email to clojurescript@googlegroups.com.
Visit this group at http://groups.google.com/group/clojurescript.

Reply via email to