You would want it if you want to inspect/debug/transmit/replay the whole
the state of your application. Having nothing encapsulated and everything
in a global state permits this.

Khalid aka DjebbZ
@Dj3bbZ

On Wed, May 20, 2015 at 3:51 PM, Jamie Orchard-Hays <jamie...@gmail.com>
wrote:

> For local state, I mean state that has to do only with the component
> itself, nothing to do with the data itself. For example, if I have a
> component that can switch between editing/reading states, I can't imagine
> why I would want this information stored outside of the component itself.
>
> Jamie
>
> On May 19, 2015, at 11:58 AM, Daniel Kersten <dkers...@gmail.com> wrote:
>
> I don't think it implies local state, necessarily, although it may benefit
> from it. I think alternatives can be modular too.
>
> For example, re-frame's approach of a central place to store data is like
> a Blackboard system, which may even help modularity, not hinder it, because
> modules don't need to know anything about each other - only that the data
> they read and write is in the central place and may be (transparent to the
> modules) be accessed/updated by multiple modules transparently (and
> hopefully gets validated eg through a schema or constraint system to
> prevent one module from writing data that breaks another module).
>
> On the other hand, local state implies encapsulation and encourages strict
> interfaces to access it, which can also help modularity. In my personal
> experience this has (more often than not) led to tightly coupled modules
> instead, however.
>
> I personally prefer the re-frame single-place-for-data approach because in
> my opinion its benefits outweigh its disadvantages, but perhaps I've just
> been doing local state wrong :) (actually pretty likely!)
>
>
> PS: It'll probably be some time before I get a chance to read Horrocks'
> book. If anybody knows of any similar content available on the web for me
> to read in the meantime, I'd love to hear of it!
>
>
> On Tue, 19 May 2015 at 14:34 Jamie Orchard-Hays <jamie...@gmail.com>
> wrote:
>
>> I agree. The word that came to mind while reading your comments, Daniel,
>> was "modularity". Does modularity imply local state? Pondering...
>>
>> Jamie
>>
>> On May 18, 2015, at 1:26 PM, Khalid Jebbari <khalid.jebb...@gmail.com>
>> wrote:
>>
>> I like how you break up the state machines, it has sense in web app. Page
>> 1 has 2 widgets, page 2 has a form. Each widget/form can have a FSM
>> associated with it, the higher level FSM knowing just the higher level
>> state of all widget displayed. Mmmh... Interesting.
>>
>> Le 18 mai 2015 à 19:13, Daniel Kersten <dkers...@gmail.com> a écrit :
>>
>> From my understanding of it:
>>
>> Use higher level states and decouple them somewhat from the data.
>>
>> For example, games do have lots of dynamically changing data. In a modern
>> shooter you might have dozens of characters with positions, orientation,
>> velocity, health information, weapons, ammunition, etc all of which can be
>> constantly changing. And that's just taking the characters into account.
>>
>> I wouldn't go and build a state machine that enumerates all of the
>> possible transitions from a "twelve characters with done distribution of
>> attributes in this location moving in that direction" state. I'd break it
>> down so that each character has a high level state like "seeking powerup"
>> or "running".
>>
>> Probably not a great example although it does illustrate that you might
>> have a hierarchy of state machines. In the game example, the highest level
>> might be something like "in play" or "paused" and the lowest might be an
>> each characters "firing weapon".
>>
>> In client side web app, you could say that each configuration of data is
>> a state (the re-frame readme mentions that you could think of the app-db
>> like this), but I think that's too fine grained to be useful.
>>
>> Instead I'd define higher level states (possibly in a hierarchy). I'd ask
>> myself, regardless of the data available, what are the logical states that
>> a user could be in and for each one, what are the actions that they can
>> perform (and what state does each action transition them to).
>> This could be as simple as pages and links, but with a rich single page
>> application it's more likely finer grained than that. Maybe what dialogs or
>> widgets are accessible.
>>
>> Again, you could then layer these into a hierarchy of state machines.
>>
>> One advantage of this is you always know what a user can do at any given
>> time because you can look at what state they're in.
>>
>> I think of FSM states as orthogonal to the data, not as the data itself.
>> The states dictate what data is accessible and what can be done to it; the
>> data doesn't dictate what state the application is in.
>>
>> I suppose terminology gets confusing, but this is the approach I'm toying
>> with. I'll see how that goes :)
>>
>> But yeah, needs more thinking.
>>
>> On Mon, 18 May 2015 16:55 Marc Fawzi <marc.fa...@gmail.com> wrote:
>>
>>> Games are ideal candidate for straight-forward FSM implementation since
>>> you normally download the data at game load time and from there on you have
>>> a *relatively* small set of states that can be transitioned between based
>>> in user input. You can even apply state minimization techniques to reduce
>>> the total number of states.
>>>
>>> But in a web app you are continuously grabbing data from the server and
>>> that data is generated based on not only user input but also the state of
>>> the server side database and that server generated data would modify UI
>>> side app state and you have to account for all possibilities so the total
>>> number of states could grow wildly if your UI is data driven (where the
>>> state of the UI depends on the data in non-trivial ways) but even if your
>>> UI state dependence on server data was a trivial relationship you could
>>> still end up with a huge state diagram for the simplest viable business app
>>> if you include templating the view as part of the UI FSM on top of business
>>> logic. You could segment your app into micro apps and that will help
>>> regardless of whether you're building the app as FSM or not.
>>>
>>> And what if the state transitions are probability driven? How many
>>> states will you end up having to chart?
>>>
>>> Not convinced YET...
>>>
>>> Sent from my iPhone
>>>
>>> > On May 18, 2015, at 6:57 AM, Sean Tempesta <sean.tempe...@gmail.com>
>>> wrote:
>>> >
>>> > Hi Khalid.  I found your topic interesting so I thought I'd chime in.
>>> Regarding your comments on routing:
>>> >
>>> > So, under normal conditions, the initial URL sets the FSM in motion
>>> (as an event).  We could call this entry point a routing state.  Afterward,
>>> the state transitions are controlling the urls (not the other way around),
>>> right?
>>> >
>>> > Outside of normal conditions (ie. people copying and pasting links
>>> into random parts of the system), you also just send the url to the routing
>>> state and then switch to a new state based on whatever rules and
>>> definitions you've set.
>>> >
>>> > Or maybe I'm missing something.  I haven't built an FSM in a while.  :)
>>> >
>>> > Sean
>>> >
>>> >> On Monday, May 18, 2015 at 6:07:22 PM UTC+8, Khalid Jebbari wrote:
>>> >> Trying to push forward the discussion about Web UI with state
>>> machines. I came up with the following decomposition of the core components
>>> of a web application :
>>> >>
>>> >> - application state
>>> >> - application data
>>> >> - business logic
>>> >> - ui logic
>>> >> - event processing
>>> >> - presentation layer
>>> >> - routing
>>> >>
>>> >> In this schema, I think the application state is the real core,
>>> because every other components is directly related to it, at least if you
>>> use a state machine. I came up with the following model.
>>> >>
>>> >> - application data : related to application state because both can
>>> easily represented as data. If we want a web app that is completely
>>> state-driven (I want this, for debugging, testing and time-travel
>>> capabilities), simply merge the data and the state in the same data entity.
>>> >>
>>> >> - business logic/ui logic : in a state machine there's the notion of
>>> "actions" executed with each transition (where necessary). So the logic
>>> could just be executed by the state machine itself.
>>> >>
>>> >> - event processing : a state machine can be event-driven, and this a
>>> perfect match with a web app since the web (and any UI for that matter) is
>>> inherently event driven. So the event/input of the state machine could just
>>> match the event triggered by the user, as well as custom events if
>>> necessary.
>>> >>
>>> >> - presentation layer : simply display the current app-state as
>>> HTML/CSS. In the React.js model, it would simply mean updating the app
>>> state and letting React render everything.
>>> >>
>>> >> - routing : this is where stuff gets complicated in my mind. In a
>>> proper application, lot of state is derived from the URLs. But not all
>>> state, for instance whether a modal is displayed or not, or whether a form
>>> is validated client side or not isn't tied to a URL. Which tend to let me
>>> think that there's some kind of hierarchy in the state machine. The URLs
>>> could be represented as events as well in the state machine, but could
>>> happen at anytime, whereas other events and related transition depend on
>>> the current state in a state machine. So it's like you have a top-level
>>> state machine for URLs, and each URL has its own state machine for all
>>> interactions in the page. Maybe page-state machine could be refined in
>>> multiple levels state machines too, not sure about that. It seems like
>>> Hierarchical State Machine may help here, but I haven't studied the subject
>>> yet at all.
>>> >>
>>> >> What do you think ?
>>> >
>>> > --
>>> > 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 a topic in the
>> Google Groups "ClojureScript" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe.
>> To unsubscribe from this group and all its topics, 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.
>
>
>  --
> Note that posts from new members are moderated - please be patient with
> your first post.
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "ClojureScript" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe.
> To unsubscribe from this group and all its topics, 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