I'm writing a tic-tac-toe game (hot seat, not over the Internet) using re-frame 
and I'm wondering what's the best approach to handling certain actions that 
depend on a certain transformations of state.

A simple example, if a player clicks on a cell, I have to:

  A. Change the owner of that cell to the current player.
  B. Change the current player, so that the next one can play.

Let's say I dispatch the click as an event (obviously) and in its handler I 
treat those two mentioned actions as events and dispatch them, too.

If they both read the current player from the app-db, a certain coupling is 
introduced: if I call B before calling A, the owner of the clicked cell is 
going to be changed not to the player that clicked on the cell, but to the next 
player.

There are a few ways that I can deal with that:

  1. Just dispatch them as separate events as I decribed and introduce the 
forementioned coupling (I have to remember to call these events in a certain 
order).
  2. In the cell click handler, read the current player from the db and pass it 
as an argument to those two events. Now I don't have to worry about the order 
in which they'll be called.
  3. Instead of calling A and B from within the cell click handler, call only A 
in the handler and then call B from within A. I guess that's a pretty bad 
solution (I just coupled B with A even more), but it also removes the worry 
about the order of calls.

Honestly, I came up with the second solution during the writing of this post 
and I feel it's the most clean one, it feels the most functional from all three 
and I guess it's the standard method of dealing with problems like this.

Anyway, I'd like to hear your opinions, how the second solution may turn out to 
be bad in the future, and maybe even get to know different ways to tackle that 
problem.

Also, I wonder what's the preferred approach to handling multiple operations in 
a handler, because I can either dispatch many events from within it or call a 
bunch of functions on the db in a -> macro, see 
https://gist.github.com/ravicious/fb189aa45b7784624485

-- 
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