I just discovered it! 70 messages in this thread ;) A tcp server (one of the examples) is nothing like the scenarios in the UI but this type of reducing is what i was converging to, not for UI though...
Sent from my iPhone > On May 22, 2015, at 9:24 AM, Khalid Jebbari <khalid.jebb...@gmail.com> wrote: > > I mentioned it in the very first post of this discussion > > Khalid aka DjebbZ > @Dj3bbZ > >> On Fri, May 22, 2015 at 5:57 PM, Marc Fawzi <marc.fa...@gmail.com> wrote: >> this looks like fun >> >> https://github.com/cdorrat/reduce-fsm >> >> ;) >> >>> On Wed, May 20, 2015 at 7:26 AM, Marc Fawzi <marc.fa...@gmail.com> wrote: >>> Yup, well captured. >>> >>>> On Wed, May 20, 2015 at 6:58 AM, Khalid Jebbari <khalid.jebb...@gmail.com> >>>> wrote: >>>> 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. >> >> -- >> 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.