FSM.NET presentation
Upcoming SlideShare
Loading in...5

FSM.NET presentation






Total Views
Views on SlideShare
Embed Views



0 Embeds 0

No embeds



Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

FSM.NET presentation FSM.NET presentation Presentation Transcript

  • FSM.NET A simple "stateless" finite-state machine library for .NET. Bill Sorensen @BillSorensen bill@truewill.net http://www.truewill.net/ Integrated DNA Technologies
  • 1 What is it?  Open-source .NET library  “A finite-state machine (FSM) … is a mathematical model of computation used to design both computer programs and sequential logic circuits. It is conceived as an abstract machine that can be in one of a finite number of states. The machine is in only one state at a time; the state it is in at any given time is called the current state. It can change from one state to another when initiated by a triggering event or condition; this is called a transition. A particular FSM is defined by a list of its states, and the triggering condition for each transition.” – Wikipedia
  • 2 What is it? (continued)  Domain-specific language (DSL)  Text tables can be provided by callers, loaded from a data store, stored in configuration – whatever works for you  Purely functional  Given the same arguments, every function always returns the same values  No side effects  Great for web services (inherently stateless)  Thread safe (unless I goofed) # Turnstile Locked | coin | Unlocked Unlocked | coin | Unlocked Unlocked | pass | Locked Initial state (first line) CurrentState|triggeringEvent|NewState
  • 3 Why would I need it?  You’re trying to solve a problem that looks like a state machine. “I have that horrible feeling when I know that almost the only thing I can say is that you should use a State Machine when the behavior you’re specifying feels like a State Machine – that is, when you have a sense of movement, triggered by events, from state to state. In many ways, the best way to see if a State Machine is appropriate is to try sketching one on paper and, if it fits well, to try it in action.” – Martin Fowler, Domain-Specific Languages
  • 4 Why would I not need it?  You want to associate actions or guards (behavior/code) with transitions or with entering/exiting states.  FSM.NET machines are designed to be self-contained, without requiring binary references to custom code.  FSM.NET machines are designed to be deserialized from text.  Custom code actions could be added through a wrapper (web service, etc.).  You want to embed a state machine in a non-.NET application.  FSM.NET can be used through a web service, though.
  • 5 Demo time! https://github.com/TrueWill/FSM.NET https://github.com/TrueWill/FSM.NET/tree/master/Samples
  • 6 Why is FSM.NET written in F#?  Fewer bugs  Easier to verify correctness  Immutable by default  Less code – let’s see!  Easier to write thread-safe code  Interop with other .NET libraries  Fun! 
  • 7 Other options (in no particular order)  http://smc.sourceforge.net/  https://github.com/phatboyg/Automatonymous  http://code.google.com/p/bbvcommon/wiki/StateMachine  https://code.google.com/p/stateless/  … and many more Don’t reinvent the wheel! (Like I did…) (Caveat: I have not evaluated all of the above options.) // Stateless example using enums var turnstile = new StateMachine<States, Events>(States.Locked); turnstile.Configure(States.Locked).Permit(Events.Coin, States.Unlocked); turnstile.Configure(States.Unlocked).Permit(Events.Pass, States.Locked); turnstile.OnTransitioned(x => Console.WriteLine(x.Trigger)); turnstile.Fire(Events.Coin); // mutates Console.WriteLine(turnstile.State);
  • 8 How can I get it? https://www.nuget.org/packages/FSM.NET/ https://github.com/TrueWill/FSM.NET GitHub