<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[boustrophedonic]]></title>
  <link href="http://boustrophedonic.com//atom.xml" rel="self"/>
  <link href="http://boustrophedonic.com//"/>
  <updated>2012-10-26T00:06:37+01:00</updated>
  <id>http://boustrophedonic.com//</id>
  <author>
    <name><![CDATA[scottw]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Implementing Tic-Tac-Toe using state classes]]></title>
    <link href="http://boustrophedonic.com//blog/2012/10/25/using-states-for-tic-tac-toe/"/>
    <updated>2012-10-25T12:00:00+01:00</updated>
    <id>http://boustrophedonic.com//blog/2012/10/25/using-states-for-tic-tac-toe</id>
    <content type="html"><![CDATA[<p>This post follows on from the <a href="http://boustrophedonic.com//blog/2012/10/21/union-types-in-csharp">previous one on union types</a>, by showing how to use state classes to implement a Tic-Tac-Toe game (a.k.a. Noughts and Crosses here in the UK).</p>

<h2>Background</h2>

<p>I ran across two mentions of the game of Tic-Tac-Toe recently. First, in the excellent book <a href="http://www.amazon.com/Professional-Enterprise-NET-Wrox-Programmer/dp/0470447613">&#8220;Professional Enterprise .NET&#8221;</a> by Jon Arking and Scott Millett, <a href="http://books.google.co.uk/books?id=jTY3qAAvxiUC&amp;q=tic%20tac%20toe%20requirements">chapter 4</a> describes using TDD for Tic-Tac-Toe.</p>

<p>Secondly, Tony Morris wrote a post a while back that he almost called <a href="http://blog.tmorris.net/understanding-practical-api-design-static-typing-and-functional-programming/">&#8220;What to Solve Before Expecting Me to Take Your Opinions of Static Typing Seriously&#8221;</a> in which he describes his disappointment that most programmers couldn&#8217;t implement a  robust API for a trivial game like Tic-Tac-Toe.</p>

<blockquote><p>An extremely robust API for a relatively trivial problem &#8230; was achieved by exploiting techniques available from static typing and functional programming.<br/>[This] appears to be difficult for many programmers to reproduce.</p><footer><strong>Tony Morris</strong> <cite><a href='http://blog.tmorris.net/understanding-practical-api-design-static-typing-and-functional-programming/'>Understanding Practical API Design</a></cite></footer></blockquote>


<p>Here is a paraphase of some of his requirements for the API:</p>

<ul>
<li>If you write a function, I must be able to call it with the same arguments and always get the same results.</li>
<li>If I, as a client of your API, call one of your functions, I should always get a sensible result. Not null or an exception, etc.</li>
<li>If I call <code>Move</code> on a tic-tac-toe board, but the game has finished, I should get a <em>compile-time error</em>. In other words, calling move on inappropriate game states is <em>disallowed by the types themselves</em>.</li>
<li>If I call <code>WhoWonOrDraw</code> on a tic-tac-toe board, but the game hasn&#8217;t yet finished, I get a <em>compile-time error</em>.</li>
<li>It is not possible to play out of turn.</li>
</ul>


<p>So, before reading on, think about how you might do this in C# &#8211; can you meet the challenge!</p>

<!-- more -->


<h2>Tests vs static typing</h2>

<p>Unit tests were championed by users of dynamic languages such as Smalltalk and Ruby, but C# is statically typed, so surely we can take advantage of this to write fewer tests?</p>

<p>The answer is yes! With a bit of work, you can use the type system to provide you with &#8220;compile time unit tests&#8221; as it were.</p>

<p>Unfortunately, a typical C# implementation does not take full advantage of the power of static types and therefore does <em>not</em> meet the requirements above.
A typical C# (or Java) implementation will have just a single class to represent all the states of the game, with various internal flags, and lots of branching logic.
So then of course you need tests to ensure that the code is robust.</p>

<p><sub>[Note: I&#8217;m not talking about TDD as a process to drive design, but unit tests as a robustness and code coverage tool.]</sub></p>

<p>For example, in the Professional Enterprise .NET book, the code for a move looks something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">PlaceMarkerAt</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Column</span> <span class="n">column</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">CanPlaceMarkerAt</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">column</span><span class="p">))</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// check that slot is not occupied</span>
</span><span class='line'>        <span class="n">ChangeCurrentPlayer</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">throw</span> <span class="k">new</span> <span class="nf">ApplicationException</span><span class="p">(...)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the code for checking the status looks something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">GameStatus</span> <span class="nf">Status</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">GameStatus</span> <span class="n">gameStatus</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">IsAWinner</span><span class="p">(</span><span class="n">Player</span><span class="p">.</span><span class="n">O</span><span class="p">))</span>
</span><span class='line'>        <span class="n">gameStatus</span> <span class="p">=</span> <span class="n">GameStatus</span><span class="p">.</span><span class="n">PlayerOWins</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">IsAWinner</span><span class="p">(</span><span class="n">Player</span><span class="p">.</span><span class="n">X</span><span class="p">))</span>
</span><span class='line'>        <span class="n">gameStatus</span> <span class="p">=</span> <span class="n">GameStatus</span><span class="p">.</span><span class="n">PlayerXWins</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">GameIsADraw</span><span class="p">())</span>
</span><span class='line'>        <span class="n">gameStatus</span> <span class="p">=</span> <span class="n">GameStatus</span><span class="p">.</span><span class="n">GameDrawn</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">WhoseTurn</span><span class="p">()</span> <span class="p">==</span> <span class="n">Player</span><span class="p">.</span><span class="n">X</span><span class="p">)</span>
</span><span class='line'>        <span class="n">gameStatus</span> <span class="p">=</span> <span class="n">GameStatus</span><span class="p">.</span><span class="n">AwaitingPlayerXToPlaceMarker</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>        <span class="n">gameStatus</span> <span class="p">=</span> <span class="n">GameStatus</span><span class="p">.</span><span class="n">AwaitingPlayerOToPlaceMarker</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">gameStatus</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;m not picking on this book at all &#8211; as I said, it is a great book &#8211; but it does demonstrate that even best-practice C# code is not maximally benefiting from the type system.
Almost every method has (potentially buggy) conditionals and switches which would be unneeded if states were used.</p>

<h2>The Tic-Tac-Toe implementation</h2>

<p>So, enough talk, how <em>can</em> you create an API for Tic-Tac-Toe that makes Tony Morris happy?</p>

<p>The trick is to create distinct classes for each state in the game, as discussed in the <a href="http://boustrophedonic.com//blog/2012/10/21/union-types-in-csharp">previous post</a>. We&#8217;re going to use the template class demonstrated in that post, but you could always create the code by hand.</p>

<p>First, create an <code>IGameState.tt</code> file to generate the interface and the states.  In this implementation, we&#8217;ll only create three states: <code>GameStateXToMove</code>, <code>GameStateOToMove</code>, and <code>GameStateGameOver</code>.</p>

<p>Here&#8217;s the file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="err">#</span>
</span><span class='line'><span class="kt">var</span> <span class="n">states</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span><span class="s">&quot;GameStateXToMove&quot;</span><span class="p">,</span> <span class="s">&quot;GameStateOToMove&quot;</span><span class="p">,</span><span class="s">&quot;GameStateGameOver&quot;</span><span class="p">};</span>
</span><span class='line'><span class="err">#</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">&lt;</span><span class="err">#@</span> <span class="n">include</span> <span class="n">file</span><span class="p">=</span><span class="s">&quot;..\FoldStates.ttinclude&quot;</span> <span class="err">#</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here&#8217;s the generated code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">partial</span> <span class="k">interface</span> <span class="n">IGameState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IGameState</span> <span class="nf">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="nf">Action</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateXToMove</span> <span class="p">:</span> <span class="n">IGameState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IGameState</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateXToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">gameStateXToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateXToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateOToMove</span> <span class="p">:</span> <span class="n">IGameState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IGameState</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateOToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">gameStateOToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateOToMove</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateGameOver</span> <span class="p">:</span> <span class="n">IGameState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IGameState</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">IGameState</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateGameOver</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">gameStateGameOver</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateXToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateXToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateOToMove</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateOToMove</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">GameStateGameOver</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">gameStateGameOver</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">gameStateGameOver</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Extending the IGameState interface</h3>

<p>Next, we&#8217;ll add to the partial interface in a separate file (IGameState.cs):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">interface</span> <span class="n">IGameState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">bool</span> <span class="nf">IsValidMove</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We&#8217;ll add one method (IsValidMove) that is common to all states.  Note what is missing though. There is is no <code>Move</code> method or <code>WhoWonOrDraw</code> method. These will be reserved for the state classes.</p>

<h3>The GameStateXToMove class</h3>

<p>Now let&#8217;s look at the code needed for the first state: <code>GameStateXToMove</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateXToMove</span> <span class="p">:</span> <span class="n">GameStateBase</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">GameStateXToMove</span><span class="p">()</span>
</span><span class='line'>        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="k">new</span> <span class="n">MoveSequence</span><span class="p">())</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">GameStateXToMove</span><span class="p">(</span><span class="n">MoveSequence</span> <span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">IGameState</span> <span class="nf">Move</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">Move</span><span class="p">&gt;</span> <span class="n">invalidMoveCallback</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">move</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Move</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">Player</span><span class="p">.</span><span class="n">X</span><span class="p">);</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newMoveSequence</span> <span class="p">=</span> <span class="n">MoveSequence</span><span class="p">.</span><span class="n">WithNewMove</span><span class="p">(</span><span class="n">move</span><span class="p">,</span> <span class="n">invalidMoveCallback</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">newMoveSequence</span><span class="p">.</span><span class="n">IsGameOver</span><span class="p">()</span>
</span><span class='line'>            <span class="p">?</span> <span class="k">new</span> <span class="n">GameStateGameOver</span><span class="p">(</span><span class="n">newMoveSequence</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">new</span> <span class="n">GameStateOToMove</span><span class="p">(</span><span class="n">newMoveSequence</span><span class="p">)</span> <span class="k">as</span> <span class="n">IGameState</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">bool</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">IsValidMove</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">MoveSequence</span><span class="p">.</span><span class="n">IsValidMove</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>This class inherits from <code>GameStateBase</code>, which stores a <code>MoveSequence</code> that is common to all three states.  The <code>MoveSequence</code> has the intelligence to know which moves are valid and when the game is over.  The two constructors initialize the class with either an empty MoveSequence, or a non-empty one.</p>

<p>The <code>Move</code> method exists <em>only</em> in the <code>GameStateXToMove</code> and <code>GameStateOToMove</code> classes. It creates a new move, then appends that it the current MoveSequence, and then creates a new state depending on whether the game is over. If the game is over, the new state is <code>GameStateGameOver</code>, otherwise it is Player O&#8217;s turn (<code>GameStateOToMove</code>).  Because two <em>different</em> states could be returned, the overall return type must be <code>IGameState</code>, not any particular state.</p>

<p>What happens if the move is invalid? Should we ignore it, throw an exception, or what?  This code can&#8217;t (and shouldn&#8217;t) decide, so the action has been delegated back to the called. In this case, the move sequence is left unchanged &#8211; <code>MoveSequence.WithNewMove</code> returns the same list.  Again, this is one of the requirements &#8211; no unexpected exceptions!</p>

<p>Finally, the <code>IsValidMove</code> method delegates to the MoveSequence. I have deliberately made this an explicit interface implementation so that the methods common to all game states are separate from the state-specific methods.</p>

<h3>The GameStateOToMove class</h3>

<p>The code for the <code>GameStateOToMove</code> is almost identical, except that in the <code>Move</code> method, the next state is <code>GameStateXToMove</code>, if the game is not over.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateOToMove</span> <span class="p">:</span> <span class="n">GameStateBase</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">GameStateOToMove</span><span class="p">()</span>
</span><span class='line'>        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="k">new</span> <span class="n">MoveSequence</span><span class="p">())</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">GameStateOToMove</span><span class="p">(</span><span class="n">MoveSequence</span> <span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">IGameState</span> <span class="nf">Move</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">Move</span><span class="p">&gt;</span> <span class="n">invalidMoveCallback</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">move</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Move</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">Player</span><span class="p">.</span><span class="n">O</span><span class="p">);</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newMoveSequence</span> <span class="p">=</span> <span class="n">MoveSequence</span><span class="p">.</span><span class="n">WithNewMove</span><span class="p">(</span><span class="n">move</span><span class="p">,</span> <span class="n">invalidMoveCallback</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">newMoveSequence</span><span class="p">.</span><span class="n">IsGameOver</span><span class="p">()</span>
</span><span class='line'>            <span class="p">?</span> <span class="k">new</span> <span class="n">GameStateGameOver</span><span class="p">(</span><span class="n">newMoveSequence</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">new</span> <span class="n">GameStateXToMove</span><span class="p">(</span><span class="n">newMoveSequence</span><span class="p">)</span> <span class="k">as</span> <span class="n">IGameState</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">bool</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">IsValidMove</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">MoveSequence</span><span class="p">.</span><span class="n">IsValidMove</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>The GameStateGameOver class</h3>

<p>The code for the <code>GameStateGameOver</code> is quite different. It does <em>not</em> implement <code>Move</code> and it <em>does</em> implement <code>WhoWonOrDraw</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">enum</span> <span class="n">GameOverState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">XWon</span><span class="p">,</span> <span class="n">YWon</span><span class="p">,</span> <span class="n">Draw</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">GameStateGameOver</span> <span class="p">:</span> <span class="n">GameStateBase</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">GameStateGameOver</span><span class="p">(</span><span class="n">MoveSequence</span> <span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>        <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">moveSequence</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">GameOverState</span> <span class="nf">WhoWonOrDraw</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">MoveSequence</span><span class="p">.</span><span class="n">WhoWonOrDraw</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">bool</span> <span class="n">IGameState</span><span class="p">.</span><span class="n">IsValidMove</span><span class="p">(</span><span class="n">Row</span> <span class="n">row</span><span class="p">,</span> <span class="n">Col</span> <span class="n">col</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It can also return false for <code>IsValidMove</code> without even looking at the MoveSequence.</p>

<p>This code is a good example of how the number of conditionals is greatly reduced. Because this class only deals with <em>one</em> state, there are no conditionals at all!</p>

<p>If you think about trying to get 100% code coverage for tests, every conditional doubles the number of code paths to test! So avoiding them has multiple benefits &#8211; it makes the code more compact, more readable, less buggy and easier to test thoroughly.</p>

<h2>Testing the code</h2>

<p>Let&#8217;s look at how this code might be tested.</p>

<p><strong>Test: &#8220;Player X is the first Player to place a marker.&#8221;</strong></p>

<p>The <code>TicTacToeGame</code> wrapper class simply returns a new <code>GameStateXToMove</code> when a new game is started.
Then to test which state we are in, we use the <code>Func</code> method, with a lambda for each case.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">PlayerXIsTheFirstPlayerToPlaceAMarker</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">initialState</span> <span class="p">=</span> <span class="n">TicTacToeGame</span><span class="p">.</span><span class="n">StartNewGame</span><span class="p">();</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isXToPlay</span> <span class="p">=</span> <span class="n">initialState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">,</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">isXToPlay</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">True</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here&#8217;s another test:</p>

<p><strong>Test: &#8220;Player O Will Be Next To Take A Turn After Player X Has Placed A Marker&#8221;</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">PlayerOWillBeNextToTakeATurnAfterPlayerXHasPlacedAMarker</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">initialState</span> <span class="p">=</span> <span class="n">TicTacToeGame</span><span class="p">.</span><span class="n">StartNewGame</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Action</span><span class="p">&lt;</span><span class="n">Move</span><span class="p">&gt;</span> <span class="n">invalidMoveAction</span> <span class="p">=</span> <span class="n">move</span> <span class="p">=&gt;</span> <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;The move {0} is not allowed&quot;</span><span class="p">,</span> <span class="n">move</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// X plays</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">afterFirstMove</span> <span class="p">=</span> <span class="n">initialState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col1</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isOToPlay</span> <span class="p">=</span> <span class="n">afterFirstMove</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span><span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span> <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">,</span> <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">isOToPlay</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">True</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, a similar technique is used to find out which state we are in.</p>

<p>We can go on like this in a similar vein.  Let&#8217;s skip to what happens when the game is over:</p>

<p><strong>Test: &#8220;If Player X gets three Xs in a row, then the game is won by Player X.&#8221;</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">IfPlayerXGetsThreeXsInARowThenTheGameIsWonByPlayerX</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">initialState</span> <span class="p">=</span> <span class="n">TicTacToeGame</span><span class="p">.</span><span class="n">StartNewGame</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Action</span><span class="p">&lt;</span><span class="n">Move</span><span class="p">&gt;</span> <span class="n">invalidMoveAction</span> <span class="p">=</span> <span class="n">move</span> <span class="p">=&gt;</span> <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;The move {0} is not allowed&quot;</span><span class="p">,</span> <span class="n">move</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// X plays</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">move1</span> <span class="p">=</span> <span class="n">initialState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col1</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// O plays</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">move2</span> <span class="p">=</span> <span class="n">move1</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row2</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col1</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// X plays</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">move3</span> <span class="p">=</span> <span class="n">move2</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col2</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// O plays</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">move4</span> <span class="p">=</span> <span class="n">move3</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row2</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col2</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// X plays and wins</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">move5</span> <span class="p">=</span> <span class="n">move4</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col3</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">,</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isGameOver</span> <span class="p">=</span> <span class="n">move5</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span><span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span> <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span> <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">isGameOver</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">GameOverState</span><span class="p">?</span> <span class="n">whoWon</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>    <span class="n">move5</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span>
</span><span class='line'>        <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="p">},</span>
</span><span class='line'>        <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="p">},</span>
</span><span class='line'>        <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">whoWon</span> <span class="p">=</span> <span class="n">gameOver</span><span class="p">.</span><span class="n">WhoWonOrDraw</span><span class="p">());</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">whoWon</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="n">GameOverState</span><span class="p">.</span><span class="n">XWon</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Summary</h2>

<p>Looking back at the requirements, did we meet them?</p>

<ul>
<li><p><em>Call a function with the same arguments and always get the same results.</em>
Check! The states are immutable.</p></li>
<li><p><em>A client of your API, calling one of your functions, should always get a sensible result.</em> Check! No nulls or exceptions anywhere in the code.</p></li>
<li><p><em>If I call <code>Move</code> but the game has finished, I should get a </em>compile-time error<em>.</em> Check! Try it:</p></li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">move5</span> <span class="p">=</span> <span class="n">move4</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>    <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col3</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">),</span>
</span><span class='line'>    <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="n">oToMove</span><span class="p">,</span>
</span><span class='line'>    <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">gameOver</span><span class="p">.</span><span class="n">Move</span><span class="p">(</span><span class="n">Row</span><span class="p">.</span><span class="n">Row1</span><span class="p">,</span> <span class="n">Col</span><span class="p">.</span><span class="n">Col3</span><span class="p">,</span> <span class="n">invalidMoveAction</span><span class="p">));</span>  <span class="c1">// compile time error!</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>If I call <code>WhoWonOrDraw</code> on a tic-tac-toe board, but the game hasn&#8217;t yet finished, I get a <em>compile-time error</em>. Check again! Try it:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="n">move5</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span>
</span><span class='line'>    <span class="n">xToMove</span> <span class="p">=&gt;</span> <span class="n">whoWon</span> <span class="p">=</span> <span class="n">xToMove</span><span class="p">.</span><span class="n">WhoWonOrDraw</span><span class="p">(),</span> <span class="c1">// compile time error</span>
</span><span class='line'>    <span class="n">oToMove</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="p">},</span>
</span><span class='line'>    <span class="n">gameOver</span> <span class="p">=&gt;</span> <span class="n">whoWon</span> <span class="p">=</span> <span class="n">gameOver</span><span class="p">.</span><span class="n">WhoWonOrDraw</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><em>It is not possible to play out of turn</em>. Check! If the state is <code>GameStateXToMove</code> then only X can move. The types will not allow player O to move.</li>
</ul>


<p>So all in all, a nice solution to a thorny problem.</p>

<h2>Getting the code</h2>

<p>You can get the code from the git repository for this blog (see the <a href="http://boustrophedonic.com//about/">about page</a>). This has a full set of examples and unit tests.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Union types in C#]]></title>
    <link href="http://boustrophedonic.com//blog/2012/10/21/union-types-in-csharp/"/>
    <updated>2012-10-21T12:00:00+01:00</updated>
    <id>http://boustrophedonic.com//blog/2012/10/21/union-types-in-csharp</id>
    <content type="html"><![CDATA[<p>This post shows how to easily implement states in C# using a T4 template.</p>

<h2>Background</h2>

<p>I often run into situations where I need an object that has a number of alternate &#8220;states&#8221; or &#8220;choices&#8221;.
The set of states must be treated as &#8220;one thing&#8221; for general manipulation, but on the other hand, each state will often have slightly different behavior from the other states.</p>

<p>Some examples:</p>

<ul>
<li>A shopping cart might have states <code>Empty</code>, <code>Active</code> and <code>Paid</code>.

<ul>
<li>You can call &#8220;AddItem&#8221; but not &#8220;RemoveItem&#8221; on the <code>Empty</code> state</li>
<li>You can call &#8220;AddItem&#8221; and &#8220;RemoveItem&#8221; and also &#8220;Pay&#8221; on the <code>Active</code> state</li>
<li>You can&#8217;t do anything with the <code>Paid</code> state. Once paid, the cart is immutable.</li>
</ul>
</li>
<li>A domain object such as <code>Product</code> might have states  <code>Valid</code> and <code>Invalid</code>.

<ul>
<li>Only <code>Valid</code> objects can be saved to disk.</li>
</ul>
</li>
<li>A game such as chess might have states <code>WhiteToPlay</code>, <code>BlackToPlay</code> and <code>GameOver</code>.

<ul>
<li>Only the <code>GameOver</code> state has a &#8220;Winner&#8221; method.</li>
<li>Only the other states have a &#8220;Play&#8221; method.</li>
</ul>
</li>
</ul>


<p>So given this common situation, what kinds of ways are there to implement these kinds of cases?</p>

<h2>The inheritance based approach</h2>

<p>The standard approach in a object-oriented language is to use inheritance. There is a class for each state, and each state inherits from a common base class or interface.</p>

<p>But where should the custom behavior live?</p>

<p>For example, in the shopping cart example, should the &#8220;RemoveItem&#8221; method be available at the interface level?</p>

<h3>Approach 1: Define all possible actions at the interface level</h3>

<p>Let&#8217;s say the &#8220;RemoveItem&#8221; method <em>is</em> available at the interface level, then the interface would look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">AddItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">RemoveItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">Pay</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">amount</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://boustrophedonic.com//images/CartState-Approach1.png" alt="Cart State - Approach 1" /></p>

<p>But what should the empty state implementation do with the methods that are not relevant?  It can either throw an exception or ignore them, as shown below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">class</span> <span class="nc">CartStateEmpty</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// implementation</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">RemoveItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// throw not implemented exception or ignore</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Pay</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// throw not implemented exception or ignore</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Throwing an exception seems a bit drastic, and ignoring the call seems even worse. Is there another approach?</p>

<!-- more -->


<h3>Approach 2: Define actions only at the appropriate level</h3>

<p>The next approach is that the base interface should only have genuinely common code, and each subclass implements its own special behavior.</p>

<p><img src="http://boustrophedonic.com//images/CartState-Approach2.png" alt="Cart State - Approach 2" /></p>

<p>So the code for the shopping cart would look something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">// nothing in common between the states</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartStateEmpty</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// implementation</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartStateActive</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">)</span> <span class="p">{}</span> <span class="c1">// implementation</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">RemoveItem</span><span class="p">(</span><span class="n">Product</span> <span class="n">product</span><span class="p">)</span> <span class="p">{}</span> <span class="c1">// implementation</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span>  <span class="nf">Pay</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">amount</span><span class="p">)</span> <span class="p">{}</span> <span class="c1">// implementation </span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartStatePaid</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">decimal</span> <span class="nf">GetAmountPaid</span><span class="p">()</span> <span class="p">{}</span> <span class="c1">// implementation </span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is much cleaner, but now the question is: how does the client know which state the cart is in?</p>

<p>Typically, the caller would have to try downcasting the object to each state in turn. The client code would look something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">private</span> <span class="k">class</span> <span class="nc">CientWithDowncasting</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddProduct</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">cartStateEmpty</span> <span class="p">=</span> <span class="n">currentState</span> <span class="k">as</span> <span class="n">CartStateEmpty</span><span class="p">;</span> <span class="c1">//CAST!</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">cartStateEmpty</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">cartStateEmpty</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kt">var</span> <span class="n">cartStateActive</span> <span class="p">=</span> <span class="n">currentState</span> <span class="k">as</span> <span class="n">CartStateActive</span><span class="p">;</span> <span class="c1">//CAST!</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">cartStateActive</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// paid state -- do nothing    </span>
</span><span class='line'>        <span class="k">return</span> <span class="n">currentState</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this approach is not only ugly, it&#8217;s all error prone, as the client has to do all the work.</p>

<p>For example, what happens if the client forgets to cast properly? And what happens if the requirements change and there are now four states to handle?  These kinds of errors will be hard to catch.</p>

<h3>Approach 3: The double dispatch or visitor pattern</h3>

<p>In OO design, a reliance on this kind of <a href="http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism">branching</a> and <a href="http://www.daedtech.com/casting-is-a-polymorphism-fail">casting</a> for control flow is always a sign that polymorphism is not being used properly.
And indeed there is a way to avoid downcasting by using so-called &#8220;double dispatch&#8221; or its big brother, the visitor pattern.</p>

<p>The idea behind it is that the caller does not know the type of the state, but the state knows its own type, and can call back a type-specific method on the caller. For example, the empty state can call a &#8220;VisitEmpty&#8221; method, while the active state can call a &#8220;VisitActive&#8221; method, and so on.  In this way, no casting is used. Furthermore, if the number of states increase, the code will break until a handler for the new state is implemented.</p>

<p>To use this approach, first we implement a visitor interface as follows:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">ICartStateVisitor</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">VisitEmpty</span><span class="p">(</span><span class="n">CartStateEmpty</span> <span class="n">empty</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">VisitActive</span><span class="p">(</span><span class="n">CartStateActive</span> <span class="n">active</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">VisitPaid</span><span class="p">(</span><span class="n">CartStatePaid</span> <span class="n">paid</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next we change the base interface to allow the visitor to call on the state:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">Accept</span><span class="p">(</span><span class="n">ICartStateVisitor</span> <span class="n">visitor</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, for each state, we implement the appropriate <code>VisitXXX</code> method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">class</span> <span class="nc">CartStateEmpty</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Accept</span><span class="p">(</span><span class="n">ICartStateVisitor</span> <span class="n">visitor</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">visitor</span><span class="p">.</span><span class="n">VisitEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartStateActive</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Accept</span><span class="p">(</span><span class="n">ICartStateVisitor</span> <span class="n">visitor</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">visitor</span><span class="p">.</span><span class="n">VisitActive</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartStatePaid</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Accept</span><span class="p">(</span><span class="n">ICartStateVisitor</span> <span class="n">visitor</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">visitor</span><span class="p">.</span><span class="n">VisitPaid</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we are ready to use it &#8211; and here is where our problems start! Because, for each different set of visitor behavior, we have to implement a custom class.</p>

<p>For example, when we want to add an item, we have to create an instance of <code>AddProductVisitor</code> and when we want to pay for something, we need to create a <code>PayForCartVisitor</code>.</p>

<p>Here&#8217;s some code to show what I mean:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">class</span> <span class="nc">CientWithVisitor</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">AddProductVisitor</span><span class="p">:</span> <span class="n">ICartStateVisitor</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">Product</span> <span class="n">productToAdd</span><span class="p">;</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitEmpty</span><span class="p">(</span><span class="n">CartStateEmpty</span> <span class="n">empty</span><span class="p">)</span> <span class="p">{</span> <span class="n">empty</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">productToAdd</span><span class="p">);</span> <span class="k">return</span> <span class="n">empty</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitActive</span><span class="p">(</span><span class="n">CartStateActive</span> <span class="n">active</span><span class="p">)</span> <span class="p">{</span> <span class="n">active</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">productToAdd</span><span class="p">);</span> <span class="k">return</span> <span class="n">active</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitPaid</span><span class="p">(</span><span class="n">CartStatePaid</span> <span class="n">paid</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">paid</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">class</span> <span class="nc">PayForCartVisitor</span> <span class="p">:</span> <span class="n">ICartStateVisitor</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">public</span> <span class="kt">decimal</span> <span class="n">amountToPay</span><span class="p">;</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitEmpty</span><span class="p">(</span><span class="n">CartStateEmpty</span> <span class="n">empty</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">empty</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitActive</span><span class="p">(</span><span class="n">CartStateActive</span> <span class="n">active</span><span class="p">)</span> <span class="p">{</span> <span class="n">active</span><span class="p">.</span><span class="n">Pay</span><span class="p">(</span><span class="n">amountToPay</span><span class="p">);</span> <span class="k">return</span> <span class="n">active</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">VisitPaid</span><span class="p">(</span><span class="n">CartStatePaid</span> <span class="n">paid</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">paid</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddProduct</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">visitor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AddProductVisitor</span><span class="p">()</span> <span class="p">{</span> <span class="n">productToAdd</span> <span class="p">=</span> <span class="n">product</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Accept</span><span class="p">(</span><span class="n">visitor</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Pay</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">amountToPay</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">visitor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PayForCartVisitor</span><span class="p">()</span> <span class="p">{</span> <span class="n">amountToPay</span> <span class="p">=</span> <span class="n">amountToPay</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Accept</span><span class="p">(</span><span class="n">visitor</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Phew! It does work, and it is polymorphic and type safe.  But it seems like an awful lot of scaffolding is needed just to do something straightforward. An interface, two new classes, and nine new methods!</p>

<p>Here&#8217;s are all the players visualized as a diagram:</p>

<p><img src="http://boustrophedonic.com//images/CartState-Approach3.png" alt="Cart State - Approach 3" /></p>

<p>Compared with the second approach, you can see that it is a lot more complicated. And this is a simple example! It reminds me of the &#8221;<a href="http://steve-yegge.blogspot.co.uk/2006/03/execution-in-kingdom-of-nouns.html">Kingdom of Nouns</a>&#8221;.</p>

<p>Surely there must be another way &#8211; combining the simplicity of the second approach with the safeness of the visitor approach?</p>

<h2>Algebraic data types and &#8220;Sum&#8221; types</h2>

<p>Let&#8217;s step back and see how other languages do it. In some languages, especially functional languages such as Haskell and F#, the type system is not based around classes, but instead is based around mathematics.</p>

<p>The idea is that given a number of smaller types, you can combine them in various ways to make larger, composite types. There are two ways of creating these combinations, &#8220;addition&#8221; and &#8220;multiplication&#8221;, and the kinds of types built this way are called &#8220;algebraic data types&#8221;.</p>

<p><em>Multiplication</em> of types means taking every possible value of one type and combining it with every possible value of another type. You might already be familiar with this from SQL, because it is similar to a CROSS JOIN. The resulting composite types are called &#8220;product&#8221; types.</p>

<p>For example a <code>Date</code> type might be created by combining every possible <code>Day</code> value with every possible <code>Month</code> value with every possible <code>Year</code> value . So the type is written <code>Date type = Day type x Month type x Year type</code>.</p>

<p>On the other hand, <em>addition</em> of types means having a set of types and choosing only <em>one</em> value at a time from the union of all of possible values.</p>

<p>For example, we could define a new <code>Temperature</code> type as <em>EITHER</em> one value from the set of temperatures in <code>DegreesF</code> <em>OR</em> one value from the set of temperatures in <code>DegreesC</code>. The resulting composite types are called &#8220;sum&#8221; or &#8220;union&#8221; types. So the temperature type is written <code>Temperature type = DegreesF type + DegreesC type</code>.</p>

<p>What does that mean in practice?  It means that &#8220;sum&#8221; types are perfect for modelling situations where there are mutually exclusive states or choices.</p>

<p>In F#, for example, we can create types for each shopping cart state, and then combine (&#8220;sum&#8221;) them into a composite type. Here&#8217;s the F# code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="c1">// three different types, each representing a state</span>
</span><span class='line'><span class="k">type</span> <span class="nc">CartStateEmpty</span> <span class="o">=</span> <span class="nc">NoItems</span>
</span><span class='line'><span class="k">type</span> <span class="nc">CartStateActive</span> <span class="o">=</span> <span class="o">{</span> <span class="nc">UnpaidItems</span><span class="o">:</span><span class="nc">Product</span> <span class="kt">list</span><span class="o">;</span> <span class="o">}</span>
</span><span class='line'><span class="k">type</span> <span class="nc">CartStatePaid</span> <span class="o">=</span> <span class="o">{</span> <span class="nc">PaidItems</span><span class="o">:</span><span class="nc">Product</span> <span class="kt">list</span><span class="o">;</span> <span class="nc">AmountPaid</span><span class="o">:</span><span class="kt">decimal</span><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// then create a new type that combines them all as distinct choices </span>
</span><span class='line'><span class="k">type</span> <span class="nc">CartState</span> <span class="o">=</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Empty</span> <span class="k">of</span> <span class="nc">CartStateEmpty</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Active</span> <span class="k">of</span> <span class="nc">CartStateActive</span>
</span><span class='line'>    <span class="o">|</span> <span class="nc">Paid</span> <span class="k">of</span> <span class="nc">CartStatePaid</span>
</span></code></pre></td></tr></table></div></figure>


<p>In F#, a <code>CartState</code> must be <em>one</em> of the possible choices. That is, it can be <code>Empty</code> <em>or</em> <code>Active</code> <em>or</em> <code>Paid</code>, but only one at any one time.</p>

<p>And because of this, it is simple to write code that depends on the particular choice. For example, to add a product to the cart, the client code would look something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">addProductFromCart</span> <span class="n">cart</span> <span class="n">product</span> <span class="o">=</span>
</span><span class='line'>   <span class="k">match</span> <span class="n">cart</span> <span class="k">with</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Empty</span> <span class="n">state</span> <span class="o">-&gt;</span> <span class="n">state</span><span class="o">.</span><span class="nc">AddItem</span> <span class="n">product</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Active</span> <span class="n">state</span> <span class="o">-&gt;</span> <span class="n">state</span><span class="o">.</span><span class="nc">AddItem</span> <span class="n">product</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Paid</span> <span class="n">state</span> <span class="o">-&gt;</span> <span class="n">cart</span> <span class="c1">// do nothing</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can think of <code>match cart with</code> code as a kind of switch statement that has a different case for each state. Each case is a sort of lambda expression, which in C# would look something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">(</span><span class="n">CartStateEmpty</span> <span class="n">state</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">state</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">product</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="n">CartStateActive</span> <span class="n">state</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">state</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">product</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="n">CartStatePaid</span> <span class="n">state</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="c1">// do nothing</span>
</span></code></pre></td></tr></table></div></figure>


<p>The particular state that the object is in determines which lambda expression to execute.</p>

<p>Here is the similar code for removing a product from the cart:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">removeProductFromCart</span> <span class="n">cart</span> <span class="n">item</span> <span class="o">=</span>
</span><span class='line'>   <span class="k">match</span> <span class="n">cart</span> <span class="k">with</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Empty</span> <span class="n">state</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="n">printfn</span> <span class="s2">&quot;ERROR: The cart is empty&quot;</span>
</span><span class='line'>      <span class="n">cart</span>   <span class="c1">// return the cart </span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Active</span> <span class="n">state</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="n">state</span><span class="o">.</span><span class="nc">Remove</span> <span class="n">item</span>
</span><span class='line'>   <span class="o">|</span> <span class="nc">Paid</span> <span class="n">state</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="n">printfn</span> <span class="s2">&quot;ERROR: The cart is paid for&quot;</span>
</span><span class='line'>      <span class="n">cart</span>   <span class="c1">// return the cart</span>
</span></code></pre></td></tr></table></div></figure>


<p>and so on.</p>

<p>For more details on how F# does this, see <a href="http://fsharpforfunandprofit.com/posts/designing-for-correctness/">my post on the F# implementation of a shopping cart</a>.</p>

<h3>Implementing choices in C#</h3>

<p>The F# code gives us a clue on how we might solve the problem in C#.</p>

<p>The idea is that for each possible state, we pass in a lambda specifically designed for that state. We do this through a single method call. In other words we provide a <em>list</em> of functions but we don&#8217;t know which one will actually get evaluated &#8211; we let the cart decide, based on its state.</p>

<p>Here is some example code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">partial</span> <span class="k">interface</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">ICartState</span> <span class="nf">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>  
</span><span class='line'><span class="k">class</span> <span class="nc">CartStateEmpty</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>        <span class="c1">// I&#39;m the empty state, so invoke cartStateEmpty </span>
</span><span class='line'>      <span class="k">return</span> <span class="nf">cartStateEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>  
</span><span class='line'><span class="k">class</span> <span class="nc">CartStateActive</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>        <span class="c1">// I&#39;m the active state, so invoke cartStateActive</span>
</span><span class='line'>      <span class="k">return</span> <span class="nf">cartStateActive</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>  
</span><span class='line'><span class="k">class</span> <span class="nc">CartStatePaid</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>        <span class="c1">// I&#39;m the paid state, so invoke cartStatePaid</span>
</span><span class='line'>      <span class="k">return</span> <span class="nf">cartStatePaid</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here is an example of how a client might call it in practice:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddProduct</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">product</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">AddItem</span><span class="p">(</span><span class="n">product</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">Example</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">currentState</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartStateEmpty</span><span class="p">()</span> <span class="k">as</span> <span class="n">ICartState</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//add some products </span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">AddProduct</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductX</span><span class="p">);</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">AddProduct</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//pay </span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">decimal</span> <span class="n">paidAmount</span> <span class="p">=</span> <span class="m">12.34</span><span class="n">m</span><span class="p">;</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Pay</span><span class="p">(</span><span class="n">paidAmount</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, this approach solves all the problems discussed earlier:</p>

<ul>
<li>It is completely idiot proof. A client of the interface always gets a valid value back.
The client cannot mess things up by forgetting to cast or forgetting to check for null.</li>
<li>Illegal states are not even <em>representable</em>. A client cannot call the &#8220;wrong&#8221; method, such as calling &#8220;Pay&#8221; on an empty cart. The compiler will not allow it.
Because of this, there is no need for runtime errors or &#8220;not implemented&#8221; exceptions.</li>
<li>If the number of states ever changes to four say, just add a new parameter to the <code>Transition</code> method.  The <code>Transition</code> method will now take four lambdas, so all your existing code will fail to compile.  This a good thing! You cannot accidentally forget to handle a state.</li>
<li>The code is simple and low complexity. Just as in the second approach above, each state only implements the methods it needs to, and there are no <code>if</code> statements or special case handlers anywhere.</li>
</ul>


<p>In a way, this is what the visitor pattern was trying to get at in its complicated way, but the use of inline lambdas rather than whole visitor classes reduces the complexity immensely.</p>

<h2>Introducing the T4 template</h2>

<p>Now that we understand how the states work in conjunction with the top level interface, we can create them in C#.</p>

<p>But there is a lot of boilerplate &#8211; so I have created a T4 template that generate the states for you automatically.</p>

<h3>Creating new types using the T4 template</h3>

<p>To setup, first download the <a href="http://boustrophedonic.com//downloads/code/FoldStates.ttinclude">FoldStates.ttinclude</a> and add it to your project somewhere.</p>

<p>Then to create a new type:</p>

<ol>
<li>Create a template file and give the filename the name of the interface type, such as &#8220;ICartState.tt&#8221;</li>
<li>Include the code below, and define each state that you want in the array, as shown.</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="err">#</span>
</span><span class='line'><span class="kt">var</span> <span class="n">states</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span><span class="s">&quot;CartStateEmpty&quot;</span><span class="p">,</span> <span class="s">&quot;CartStateActive&quot;</span><span class="p">,</span><span class="s">&quot;CartStatePaid&quot;</span><span class="p">};</span>
</span><span class='line'><span class="err">#</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">&lt;</span><span class="err">#@</span> <span class="n">include</span> <span class="n">file</span><span class="p">=</span><span class="s">&quot;..\FoldStates.ttinclude&quot;</span> <span class="err">#</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Visual Studio will then generate you a file with code like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">partial</span> <span class="k">interface</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="nf">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">void</span> <span class="nf">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">);</span>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStateEmpty</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStateEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStateEmpty</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStateActive</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStateActive</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">cartStateActive</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStateActive</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStatePaid</span> <span class="p">:</span> <span class="n">ICartState</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">ICartState</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">ICartState</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStatePaid</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">cartStatePaid</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">ICartState</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateEmpty</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStateActive</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStateActive</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">CartStatePaid</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">cartStatePaid</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">cartStatePaid</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Using the new type</h3>

<p>A few things to note about the generated code:</p>

<ul>
<li>There are <em>three</em> generated methods: <code>Transition</code>, <code>Action</code> and <code>Func</code>.  I&#8217;ll explain the purpose of each one shortly.</li>
<li>All the classes are partial. After creating the states, you should then create separate files for the partial classes so you can write some real code!</li>
</ul>


<p>For the shopping cart example, let&#8217;s look at each state in turn.</p>

<h3>The CartStateEmpty state</h3>

<p>As described above, you should create a separate file <code>CartStateEmpty.cs</code> and create code like the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStateEmpty</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">internal</span> <span class="nf">CartStateEmpty</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Add</span><span class="p">(</span><span class="n">Product</span> <span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newItems</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span> <span class="p">{</span> <span class="n">item</span> <span class="p">};</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newState</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartStateActive</span><span class="p">(</span><span class="n">newItems</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">newState</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This state has no items. The only thing you can do with this state is add a product.</p>

<p>To add a product, create a new list of products and pass it into the constructor of the <code>CartStateActive</code> class.</p>

<p>Note that the <code>Add</code> method returns an <code>ICartState</code> <em>not</em> a <code>CartStateActive</code>. This is critical!  The caller should <em>not</em> know the exact state of the cart, just that it is some kind of cart.
You&#8217;ll see why this is so important shortly.</p>

<h3>The CartStateActive state</h3>

<p>Again, you should create a separate file <code>CartStateActive.cs</code> and create code like the following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStateActive</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">CartStateActive</span><span class="p">(</span><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">items</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Items</span> <span class="p">=</span> <span class="n">items</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">Items</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Add</span><span class="p">(</span><span class="n">Product</span> <span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newItems</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;(</span><span class="n">Items</span><span class="p">)</span> <span class="p">{</span> <span class="n">item</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">CartStateActive</span><span class="p">(</span><span class="n">newItems</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Remove</span><span class="p">(</span><span class="n">Product</span> <span class="n">item</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="n">newItems</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;(</span><span class="n">Items</span><span class="p">);</span>
</span><span class='line'>        <span class="n">newItems</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">item</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">newItems</span><span class="p">.</span><span class="n">Count</span> <span class="p">&gt;</span> <span class="m">0</span>
</span><span class='line'>            <span class="p">?</span> <span class="p">(</span><span class="n">ICartState</span><span class="p">)</span><span class="k">new</span> <span class="n">CartStateActive</span><span class="p">(</span><span class="n">newItems</span><span class="p">)</span>
</span><span class='line'>            <span class="p">:</span> <span class="k">new</span> <span class="n">CartStateEmpty</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Pay</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nf">CartStatePaid</span><span class="p">(</span><span class="n">Items</span><span class="p">,</span> <span class="n">amount</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This state does have a list of items, and supports three methods: <code>Add</code>, <code>Remove</code>, and <code>Pay</code>.</p>

<p>To add a product, create a new list of products and pass it into the constructor of the <code>CartStateActive</code> class.  Again note that the <code>Add</code> method returns an <code>ICartState</code> <em>not</em> a <code>CartStateActive</code>.</p>

<p>To remove a product, remove it from the existing list of products and pass <em>either</em> into the constructor of the <code>CartStateActive</code> class, <em>or</em> if the list is empty, return a new <code>CartStateEmpty</code>.<br/>
Again note that this method returns an <code>ICartState</code>.  The <code>(ICartState)</code> cast is needed to make the ternary expression happy, unfortunately.</p>

<p>Finally, the <code>Pay</code> method creates a <code>CartStatePaid</code> and returns it. Once again, the return type is <code>ICartState</code>.</p>

<h3>The CartStatePaid state</h3>

<p>Finally, implement <code>CartStatePaid.cs</code> with code like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">CartStatePaid</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">CartStatePaid</span><span class="p">(</span><span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">items</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">amount</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Items</span> <span class="p">=</span> <span class="n">items</span><span class="p">.</span><span class="n">ToList</span><span class="p">();</span>
</span><span class='line'>        <span class="n">Amount</span> <span class="p">=</span> <span class="n">amount</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">Items</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">public</span> <span class="kt">decimal</span> <span class="n">Amount</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>CartStatePaid</code> is immutable &#8211; you can get the list of items and payment amount, but you can&#8217;t change them.</p>

<p>Now that you have seen all the implementations, it is worth pointing out another great benefit of this approach. In the implementation for each state, there are hardly any conditionals or branches!  You&#8217;ll find that this state-based approach really reduces code complexity because each method only has to deal with one state.</p>

<h3>Putting it together with some tests.</h3>

<p>Lets see how this code can be used in practice.</p>

<p>First, lets start with a simple test case: &#8220;If you add a item to an empty cart you get an active cart with one item&#8221;.</p>

<p>Here&#8217;s the code for this test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">WhenEmptyCartAndAddItemExpectActiveCartWithOneItem</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">emptyCart</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartStateEmpty</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">newState</span> <span class="p">=</span> <span class="n">emptyCart</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">Product</span><span class="p">.</span><span class="n">ProductX</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isActiveState</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="k">false</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">isActiveState</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">itemCount</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Count</span><span class="p">(),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">itemCount</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="m">1</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can see here that we are using the <code>Func</code> method and passing in three lambdas. To test what state the cart is in, we return true or false for each lambda.
And to count the items, we return a int.</p>

<p>Note that if we had the following code, we would get an compiler error:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">itemCount</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>   <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Count</span><span class="p">(),</span>
</span><span class='line'>   <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Count</span><span class="p">(),</span>
</span><span class='line'>   <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Count</span><span class="p">()</span>
</span><span class='line'>   <span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The reason is that <code>cartStateEmpty</code> does not have an <code>Items</code> property. This is a key concept &#8211; you cannot call a method accidentally using this approach.
The caller cannot forget to cast, or forget to handle a state. The interface enforces this.</p>

<p>Let&#8217;s look at another test: &#8220;If you pay for an active cart you get an paid cart with the same number of items and the same amount paid&#8221;.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">WhenActiveCartWithTwoItemsAndPayExpectPaidCart</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">activeCart</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartStateActive</span><span class="p">(</span><span class="k">new</span><span class="p">[]</span> <span class="p">{</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductX</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">const</span> <span class="kt">decimal</span> <span class="n">paidAmount</span> <span class="p">=</span> <span class="m">12.34</span><span class="n">m</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">newState</span> <span class="p">=</span> <span class="n">activeCart</span><span class="p">.</span><span class="n">Pay</span><span class="p">(</span><span class="n">paidAmount</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isPaidState</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="k">true</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">isPaidState</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">itemCount</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="n">Count</span><span class="p">()</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">itemCount</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="m">2</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">actualPaidAmount</span> <span class="p">=</span> <span class="n">newState</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="p">-</span><span class="m">1</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span><span class="p">.</span><span class="n">Amount</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">That</span><span class="p">(</span><span class="n">actualPaidAmount</span><span class="p">,</span> <span class="n">Is</span><span class="p">.</span><span class="n">EqualTo</span><span class="p">(</span><span class="n">paidAmount</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that in the last assertion, we are getting the <code>cartStatePaid.Amount</code>. This property does not exist for the other two states, and as above, if we accidentally try to call it, we will get a compiler error.</p>

<p>So you have seen how the <code>Func</code> method works.  The <code>Action</code> method is exactly the same, but returns <code>void</code> instead.</p>

<h3>The Transition method</h3>

<p>Now let&#8217;s look at the <code>Transition</code> method and see how it is used.</p>

<p>Here is the code that adds a product to a cart.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">ICartState</span> <span class="nf">AddProduct</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">product</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">product</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Some things to note:</p>

<ul>
<li>The input (currentState) is a <code>ICartState</code> because we don&#8217;t know what state it will be.</li>
<li>The return type is also a <code>ICartState</code> because we don&#8217;t know what the state will be after adding the item. Well, actually we do in this particular case, but generally we won&#8217;t. So for example <code>RemoveItem</code> could return either an empty state or an active state.</li>
<li>The input value is not &#8216;edited in place&#8217; but transformed into a new value. In the state implementations above, you&#8217;ll have seen that all the states are <em>immutable</em>. It&#8217;s not just a &#8216;nice-to-have&#8217;, but is critical for these kinds of state based transitions.</li>
</ul>


<p>A particular important point is that all three lambdas return something. In this case, we can call <code>Add</code> for the empty and active states. But what about the paid state? It doesn&#8217;t have an <code>Add</code> method!</p>

<p>This is where we are forced to make a choice: we could throw an exception or log an error. But in this case, we will ignore it. We have to return a valid cart, so we can&#8217;t return null. Instead, we&#8217;ll just return the cart that was passed in.</p>

<p>Now earlier I talked about a similar decision for the empty state &#8211; should it throw an exception or silently ignore the problem.  There is a big difference however between that case and this one. however. In that case, the decision was <em>inside</em> the empty state&#8217;s implementation. The decision would be applicable to all callers.</p>

<p>But in this approach, the decision is up to the <em>caller</em>, not the implementor. It is up to the caller to decide what to do, and it can provide different behavior in different circumstances.</p>

<p>Finally, I hope you can now see why the <code>Add</code> method returned an <code>ICartState</code> rather than a <code>CartStateActive</code> . It is because all the the lambdas must return the same type, and in the case of transition from one state to another, that type will always be <code>ICartState</code>.</p>

<p>Ok, let&#8217;s see how <code>Remove</code> and <code>Pay</code> would be implemented:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">ICartState</span> <span class="nf">RemoveProduct</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span> <span class="n">product</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Remove</span><span class="p">(</span><span class="n">product</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="n">ICartState</span> <span class="nf">Pay</span><span class="p">(</span><span class="n">ICartState</span> <span class="n">currentState</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">amount</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">currentState</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span>
</span><span class='line'>        <span class="n">cartStateEmpty</span> <span class="p">=&gt;</span> <span class="n">cartStateEmpty</span><span class="p">,</span>
</span><span class='line'>        <span class="n">cartStateActive</span> <span class="p">=&gt;</span> <span class="n">cartStateActive</span><span class="p">.</span><span class="n">Pay</span><span class="p">(</span><span class="n">paidAmount</span><span class="p">),</span>
</span><span class='line'>        <span class="n">cartStatePaid</span> <span class="p">=&gt;</span> <span class="n">cartStatePaid</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Very similar to the <code>AddProduct</code> method, except that in these cases, we can only call methods on the active state.</p>

<p>To see how these methods might be combined together, we might have a set of transitions that looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">TransitionExample</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">currentState</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CartStateEmpty</span><span class="p">()</span> <span class="k">as</span> <span class="n">ICartState</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//add some products from the UI, say</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">AddProduct</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductX</span><span class="p">);</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">AddProduct</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">RemoveProduct</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//pay from the UI, say</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">decimal</span> <span class="n">paidAmount</span> <span class="p">=</span> <span class="m">12.34</span><span class="n">m</span><span class="p">;</span>
</span><span class='line'>    <span class="n">currentState</span> <span class="p">=</span> <span class="n">Pay</span><span class="p">(</span><span class="n">currentState</span><span class="p">,</span> <span class="n">Product</span><span class="p">.</span><span class="n">ProductY</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Another example: Email Addresses</h2>

<p>We&#8217;ll quickly look at another way these states can be used, namely for handling a domain object that might have distinct &#8216;valid&#8217; and &#8216;invalid&#8217; states that mustn&#8217;t be mixed up.</p>

<p>Consider an email address.  It can valid (conforming to the RFC spec) or invalid. We might want to allow <em>both</em> states in our domain, but on the other hand, only allow valid emails to be sent to.</p>

<h3>The IEmailAddress template</h3>

<p>We&#8217;ll call the common state <code>IEmailAddress</code>. We will use the <code>EmailAddress</code> state to represent any email address, including invalid ones, and the <code>ValidEmailAddress</code> state to mean only valid emails.</p>

<p>So here is the template:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="err">#</span>
</span><span class='line'><span class="kt">var</span> <span class="n">states</span> <span class="p">=</span> <span class="k">new</span> <span class="p">[]</span> <span class="p">{</span><span class="s">&quot;EmailAddress&quot;</span><span class="p">,</span> <span class="s">&quot;ValidEmailAddress&quot;</span><span class="p">};</span>
</span><span class='line'><span class="err">#</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">&lt;</span><span class="err">#@</span> <span class="n">include</span> <span class="n">file</span><span class="p">=</span><span class="s">&quot;..\FoldStates.ttinclude&quot;</span> <span class="err">#</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This generates the same kind of code as we saw for the shopping cart states:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">partial</span> <span class="k">interface</span> <span class="n">IEmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IEmailAddress</span> <span class="nf">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">);</span>
</span><span class='line'>    <span class="k">void</span> <span class="nf">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">);</span>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">EmailAddress</span> <span class="p">:</span> <span class="n">IEmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IEmailAddress</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">emailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">emailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">emailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">partial</span> <span class="k">class</span> <span class="nc">ValidEmailAddress</span> <span class="p">:</span> <span class="n">IEmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">IEmailAddress</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Transition</span><span class="p">(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">IEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">validEmailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">void</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Action</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">validEmailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">TObject</span> <span class="n">IEmailAddress</span><span class="p">.</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">TObject</span><span class="p">&gt;(</span><span class="n">Func</span><span class="p">&lt;</span><span class="n">EmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">emailAddress</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="n">ValidEmailAddress</span><span class="p">,</span> <span class="n">TObject</span><span class="p">&gt;</span> <span class="n">validEmailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">validEmailAddress</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Implementing the states</h3>

<p>We&#8217;ll start by adding a property to the interface that both states will have to implement:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">interface</span> <span class="n">IEmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">string</span> <span class="n">Address</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we&#8217;ll implement the general email address.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">EmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">EmailAddress</span><span class="p">(</span><span class="kt">string</span> <span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Address</span> <span class="p">=</span> <span class="n">emailAddress</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">Address</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">protected</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new email address</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">public</span> <span class="n">IEmailAddress</span> <span class="nf">New</span><span class="p">(</span><span class="kt">string</span> <span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">try</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="c1">// do the validation in the ValidEmailAddress itself so that it is impossible to create an invalid one</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">new</span> <span class="nf">ValidEmailAddress</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="k">catch</span> <span class="p">(</span><span class="n">ArgumentException</span><span class="p">)</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">new</span> <span class="nf">EmailAddress</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note that it implements a static <code>New</code> method that returns <em>either</em> a <code>ValidEmailAddress</code> or a invalid  <code>EmailAddress</code>.</p>

<p>Finally, the <code>ValidEmailAddress</code> implementation is:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">ValidEmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="nf">ValidEmailAddress</span><span class="p">(</span><span class="kt">string</span> <span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// do validation here</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrEmpty</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">)</span> <span class="p">||</span> <span class="p">!</span><span class="n">emailAddress</span><span class="p">.</span><span class="n">Contains</span><span class="p">(</span><span class="s">&quot;@&quot;</span><span class="p">))</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">&quot;emailAddress&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">Address</span> <span class="p">=</span> <span class="n">emailAddress</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">Address</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">protected</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// This method is only available for the ValidEmailAddress</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">SendMessage</span><span class="p">(</span><span class="kt">string</span> <span class="n">subject</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="kt">var</span> <span class="k">from</span> <span class="p">=</span> <span class="s">&quot;me@example.com&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;To: {0} From: {1} Re: {2}&quot;</span><span class="p">,</span> <span class="n">Address</span><span class="p">,</span> <span class="k">from</span><span class="p">,</span> <span class="n">subject</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, only the <code>ValidEmailAddress</code> implements the <code>SendMessage</code> method.</p>

<h3>Using the email address</h3>

<p>Let&#8217;s look at two test cases to see how this works in practice.</p>

<p><strong>Test: If the address does not contain &#8220;@&#8221;, the address is not valid</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">OnCreationWithNoAtSignExpectInvalidAddress</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">email</span> <span class="p">=</span> <span class="n">EmailAddress</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;no at sign&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isValid</span> <span class="p">=</span> <span class="n">email</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span><span class="n">invalid</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span> <span class="n">valid</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsFalse</span><span class="p">(</span><span class="n">isValid</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Test: If the address does contain &#8220;@&#8221;, the address is valid</strong></p>

<p>Yes, the validation is a bit crude!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">OnCreationWithAtSignExpectValidAddress</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">email</span> <span class="p">=</span> <span class="n">EmailAddress</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;x@example.com&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">isValid</span> <span class="p">=</span> <span class="n">email</span><span class="p">.</span><span class="n">Func</span><span class="p">(</span><span class="n">invalid</span> <span class="p">=&gt;</span> <span class="k">false</span><span class="p">,</span> <span class="n">valid</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">isValid</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Test: You cannot send email to an invalid address</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">CannotSendEmailToInvalidAddress</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">email</span> <span class="p">=</span> <span class="n">EmailAddress</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;x@example.com&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">email</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span>
</span><span class='line'>        <span class="n">invalid</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="p">},</span>
</span><span class='line'>        <span class="n">valid</span> <span class="p">=&gt;</span> <span class="n">valid</span><span class="p">.</span><span class="n">SendMessage</span><span class="p">(</span><span class="s">&quot;hello&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, note that you cannot bypass the type safety. What would happen if you attempted to send an email to an invalid address like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">CannotSendEmailToInvalidAddress</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">email</span> <span class="p">=</span> <span class="n">EmailAddress</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="s">&quot;x@example.com&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">email</span><span class="p">.</span><span class="n">Action</span><span class="p">(</span>
</span><span class='line'>        <span class="n">invalid</span> <span class="p">=&gt;</span> <span class="n">invalid</span><span class="p">.</span><span class="n">SendMessage</span><span class="p">(</span><span class="s">&quot;hello&quot;</span><span class="p">),</span>
</span><span class='line'>        <span class="n">valid</span> <span class="p">=&gt;</span> <span class="n">valid</span><span class="p">.</span><span class="n">SendMessage</span><span class="p">(</span><span class="s">&quot;hello&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Try it and see!</p>

<h2>Summary</h2>

<p>Well, I hope you found this interesting and useful. It&#8217;s definitely a different way of thinking if you are not familiar with functional programming.</p>

<p>BTW, you might be wondering why the template is called &#8220;FoldStates&#8221;.  The answer is that this technique of having a different function for each case is more generally called a &#8221;<a href="http://en.wikipedia.org/wiki/Fold_(higher-order_function)">fold</a>&#8221; (or catamorphism if you want to get fancy).</p>

<p>In this example, we have only just touched on the power of folds. In a language like F# that supports recursive data structures, they are a key part of a functional programmers toolbelt.</p>

<h2>Getting the code</h2>

<p>You can get the code two ways:</p>

<ul>
<li>Download the template only: <a href="http://boustrophedonic.com//downloads/code/FoldStates.ttinclude">FoldStates.ttinclude</a>.</li>
<li>or, from the git repository for this blog (see the <a href="http://boustrophedonic.com//about/">about page</a>). This has a full set of examples and unit tests.</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Semantic strings in C#]]></title>
    <link href="http://boustrophedonic.com//blog/2012/10/20/semantic-strings-in-csharp/"/>
    <updated>2012-10-20T12:00:00+01:00</updated>
    <id>http://boustrophedonic.com//blog/2012/10/20/semantic-strings-in-csharp</id>
    <content type="html"><![CDATA[<p>This post shows how to easily implement simple types that wrap strings. This approach has a number of benefits:</p>

<ul>
<li>The types have <em>domain-specific meaning</em>, so <code>Email</code> and <code>ProductCode</code> (say) are distinct value objects in a domain driven design).</li>
<li>The types cannot be mixed, and if they are, you get type errors at <em>compile time</em>, so <code>Email</code> values cannot be accidentally used where a <code>ProductCode</code> is expected.</li>
<li>The code itself can reveal whether absent values are allowed or not. So for example, a Product <code>ProductCode</code> property can never be null (and if you get it wrong you get errors at <em>compile time</em>), but a <code>ProductCode?</code> parameter could be null in the context of a database query .</li>
</ul>


<h2>String wrappers in F#</h2>

<p>Learning functional programming (<a href="http://fsharpforfunandprofit.com">mainly F#</a>) will change the way you think about writing C# code. There are lot of techniques in F# that, once you understand them, can be back-ported to C#.</p>

<p>In F#, for example, it is trivial to create simple one-liner types that represent simple domain value objects. Here&#8217;s the F# code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">type</span> <span class="nc">EmailAddress</span> <span class="o">=</span> <span class="nc">EmailAddress</span> <span class="k">of</span> <span class="kt">string</span>
</span><span class='line'><span class="k">type</span> <span class="nc">ProductCode</span> <span class="o">=</span> <span class="nc">ProductCode</span> <span class="k">of</span> <span class="kt">string</span>
</span><span class='line'><span class="k">type</span> <span class="nc">PhoneNumber</span> <span class="o">=</span> <span class="nc">PhoneNumber</span> <span class="k">of</span> <span class="kt">string</span>
</span></code></pre></td></tr></table></div></figure>


<p>and so on.</p>

<p>Once created, values of these types are distinct and will cause compile time errors if you accidentally mix them up.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="k">let</span> <span class="n">email</span> <span class="o">=</span> <span class="nc">EmailAddress</span> <span class="s2">&quot;abc&quot;</span>
</span><span class='line'><span class="k">let</span> <span class="n">productCode</span> <span class="o">=</span> <span class="nc">ProductCode</span> <span class="s2">&quot;abc&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// comparison causes error at compile time</span>
</span><span class='line'><span class="k">let</span> <span class="n">areEqual</span> <span class="o">=</span> <span class="o">(</span><span class="n">email</span> <span class="o">=</span> <span class="n">productCode</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// assignment causes error at compile time</span>
</span><span class='line'><span class="k">let</span> <span class="n">anEmail</span> <span class="o">:</span> <span class="nc">EmailAddress</span>  <span class="o">=</span> <span class="n">productCode</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>(By the way, if you have Visual Studio 2010 or higher, you can test this for yourself in the F# interactive window. Just paste the code in and add a double semicolon at the end of each group)</em></p>

<p>So we get fine grained domain objects, plus extra type safety at compile time. What&#8217;s not to like!</p>

<!-- more -->


<h2>String wrappers in C#</h2>

<p>This concept is not unique to functional languages. People have <a href="http://codemonkeyism.com/never-never-never-use-string-in-java-or-at-least-less-often/">recommended the same approach for Java</a>
but it still <a href="http://programmers.stackexchange.com/questions/131852/never-use-strings-in-java">seems controversial to many developers</a>, perhaps because it seems like a lot of work with little obvious benefit.</p>

<p>So is there a way of doing this in C#, while keeping it very simple to use?</p>

<p>One obvious way might be to use the F# libraries from C#, and in fact there is a <a href="http://bugsquash.blogspot.co.uk/2011/10/10-reasons-to-use-f-runtime-in-your-c.html">useful library</a> for doing just that.</p>

<p>But for the special case of these simple string wrappers there is a much simpler way, namely using templates to generate the wrapper types as needed.
I have created a T4 template to do just this, and this post will explain how to use it.</p>

<h3>Creating new types using the T4 template</h3>

<p>To setup, first download the <a href="http://boustrophedonic.com//downloads/code/StringWrapper.ttinclude">StringWrapper.ttinclude file</a> and add it to your project somewhere.</p>

<p>Then to create a new type:</p>

<ol>
<li>Create a template file and give the filename the name of the type, such as &#8220;CurrencyCode.tt&#8221;</li>
<li>Include the code below (I&#8217;ll discuss the <code>options</code> shortly)</li>
</ol>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='fsharp'><span class='line'><span class="o">&lt;#</span>
</span><span class='line'><span class="n">var</span> <span class="n">options</span> <span class="o">=</span> <span class="k">new</span> <span class="o">{</span> <span class="nc">DefaultTransform</span> <span class="o">=</span> <span class="s2">&quot;TrimToUpper&quot;</span> <span class="o">};</span>
</span><span class='line'><span class="o">#&gt;</span>
</span><span class='line'><span class="o">&lt;#@</span> <span class="n">include</span> <span class="n">file</span><span class="o">=</span><span class="s2">&quot;..</span><span class="err">\</span><span class="s2">StringWrapper.ttinclude&quot;</span> <span class="o">#&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Visual Studio will then generate you a file with code like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'><span class="c1">/// Struct to wrap strings for DDD, to avoid mixing up string types, and to avoid null strings.</span>
</span><span class='line'><span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'><span class="c1">/// &lt;remarks&gt;</span>
</span><span class='line'><span class="c1">/// structs cannot inherit, so the code is duplicated for each. </span>
</span><span class='line'><span class="c1">/// &lt;/remarks&gt;</span>
</span><span class='line'><span class="na">[Serializable]</span>
</span><span class='line'><span class="na">[System.Diagnostics.DebuggerDisplay(@&quot;CurrencyCode[Value]</span><span class="s">&quot;)]</span>
</span><span class='line'><span class="na">[System.CodeDom.Compiler.GeneratedCodeAttribute(&quot;T4Template:StringWrapper.ttinclude&quot;,&quot;1.0.0&quot;)]</span>
</span><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">struct</span> <span class="nc">CurrencyCode</span> <span class="p">:</span> <span class="n">IEquatable</span><span class="p">&lt;</span><span class="n">CurrencyCode</span><span class="p">&gt;,</span> <span class="n">IComparable</span><span class="p">&lt;</span><span class="n">CurrencyCode</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">string</span> <span class="n">Value</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new struct wrapping a string.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. It must not be null.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;transform&quot;&gt;A function to transform and/or validate the string. </span>
</span><span class='line'>    <span class="c1">/// The unwrapped string is passed into the transform function,  </span>
</span><span class='line'>    <span class="c1">/// and the transform should throw an exception or return null if the string is not valid, </span>
</span><span class='line'>    <span class="c1">//  otherwise the transform should convert the string as needed (eg remove spaces, convert to uppercase, etc).</span>
</span><span class='line'>    <span class="c1">/// A null transform is ignored.</span>
</span><span class='line'>    <span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;exception cref=&quot;ArgumentNullException&quot;&gt;Thrown if the str is null.&lt;/exception&gt;</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">public</span> <span class="n">CurrencyCode</span> <span class="nf">New</span><span class="p">(</span><span class="kt">string</span> <span class="n">str</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">transform</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">transform</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="n">str</span> <span class="p">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">str</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">str</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentException</span><span class="p">(</span><span class="s">&quot;Input to CurrencyCode is not valid&quot;</span><span class="p">,</span><span class="s">&quot;str&quot;</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="n">CurrencyCode</span> <span class="p">{</span> <span class="n">Value</span> <span class="p">=</span> <span class="n">str</span> <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new struct wrapping a string.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. It must not be null.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;exception cref=&quot;ArgumentNullException&quot;&gt;Thrown if the str is null.&lt;/exception&gt;</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">public</span> <span class="n">CurrencyCode</span> <span class="nf">New</span><span class="p">(</span><span class="kt">string</span> <span class="n">str</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">defaultTransform</span> <span class="p">=</span> <span class="n">s</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="kt">var</span> <span class="n">trimmed</span> <span class="p">=</span> <span class="p">(</span><span class="n">s</span> <span class="p">??</span> <span class="s">&quot;&quot;</span><span class="p">).</span><span class="n">Trim</span><span class="p">();</span> <span class="k">return</span> <span class="n">trimmed</span><span class="p">.</span><span class="n">Length</span> <span class="p">==</span> <span class="m">0</span> <span class="p">?</span> <span class="k">null</span> <span class="p">:</span> <span class="n">trimmed</span><span class="p">.</span><span class="n">ToUpper</span><span class="p">();</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">New</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">defaultTransform</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new nullable struct wrapping a string, or null if the string is null or invalid.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. If is is null or invalid, null is returned.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;transform&quot;&gt;A function to transform and/or validate the string. </span>
</span><span class='line'>    <span class="c1">/// The unwrapped string is passed into the transform function,  </span>
</span><span class='line'>    <span class="c1">/// and the transform should throw an exception or return null if the string is not valid, </span>
</span><span class='line'>    <span class="c1">//  otherwise the transform should convert the string as needed (eg remove spaces, convert to uppercase, etc).</span>
</span><span class='line'>    <span class="c1">/// A null transform is ignored.</span>
</span><span class='line'>    <span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">public</span> <span class="n">CurrencyCode</span><span class="p">?</span> <span class="n">NewOption</span><span class="p">(</span><span class="kt">string</span> <span class="n">str</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span><span class="kt">string</span><span class="p">&gt;</span> <span class="n">transform</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">transform</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="n">str</span> <span class="p">=</span> <span class="n">transform</span><span class="p">(</span><span class="n">str</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">str</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="k">null</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="n">CurrencyCode</span> <span class="p">{</span> <span class="n">Value</span> <span class="p">=</span> <span class="n">str</span> <span class="p">};</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new nullable struct wrapping a string, or null if the string is null.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. If is is null, null is returned.&lt;/param&gt;</span>
</span><span class='line'>    <span class="k">static</span> <span class="k">public</span> <span class="n">CurrencyCode</span><span class="p">?</span> <span class="n">NewOption</span><span class="p">(</span><span class="kt">string</span> <span class="n">str</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">defaultTransform</span> <span class="p">=</span> <span class="n">s</span> <span class="p">=&gt;</span> <span class="p">{</span> <span class="kt">var</span> <span class="n">trimmed</span> <span class="p">=</span> <span class="p">(</span><span class="n">s</span> <span class="p">??</span> <span class="s">&quot;&quot;</span><span class="p">).</span><span class="n">Trim</span><span class="p">();</span> <span class="k">return</span> <span class="n">trimmed</span><span class="p">.</span><span class="n">Length</span> <span class="p">==</span> <span class="m">0</span> <span class="p">?</span> <span class="k">null</span> <span class="p">:</span> <span class="n">trimmed</span><span class="p">.</span><span class="n">ToUpper</span><span class="p">();</span> <span class="p">};</span>
</span><span class='line'>        <span class="k">return</span> <span class="nf">NewOption</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">defaultTransform</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">string</span> <span class="nf">ToString</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">bool</span> <span class="nf">Equals</span><span class="p">(</span><span class="kt">object</span> <span class="n">other</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">other</span> <span class="k">is</span> <span class="n">CurrencyCode</span> <span class="p">&amp;&amp;</span> <span class="n">Equals</span><span class="p">((</span><span class="n">CurrencyCode</span><span class="p">)</span><span class="n">other</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">bool</span> <span class="nf">Equals</span><span class="p">(</span><span class="n">CurrencyCode</span> <span class="n">other</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Value</span><span class="p">.</span><span class="n">Equals</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">Value</span><span class="p">,</span> <span class="n">StringComparison</span><span class="p">.</span><span class="n">InvariantCulture</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">override</span> <span class="kt">int</span> <span class="nf">GetHashCode</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Value</span><span class="p">.</span><span class="n">GetHashCode</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">==(</span><span class="n">CurrencyCode</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">CurrencyCode</span> <span class="n">rhs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">Equals</span><span class="p">(</span><span class="n">rhs</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="k">operator</span> <span class="p">!=(</span><span class="n">CurrencyCode</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">CurrencyCode</span> <span class="n">rhs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">!</span><span class="n">lhs</span><span class="p">.</span><span class="n">Equals</span><span class="p">(</span><span class="n">rhs</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">public</span> <span class="kt">int</span> <span class="nf">CompareTo</span><span class="p">(</span><span class="n">CurrencyCode</span> <span class="n">other</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">String</span><span class="p">.</span><span class="n">CompareOrdinal</span><span class="p">(</span><span class="n">Value</span><span class="p">,</span> <span class="n">other</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'><span class="c1">/// Extensions to convert strings into CurrencyCodes.</span>
</span><span class='line'><span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">CurrencyCodeStringExtensions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new struct wrapping a string.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. It must not be null.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;transform&quot;&gt;A function to transform and/or validate the string. </span>
</span><span class='line'>    <span class="c1">/// The unwrapped string is passed into the transform function,  </span>
</span><span class='line'>    <span class="c1">/// and the transform should throw an exception or return null if the string is not valid, </span>
</span><span class='line'>    <span class="c1">//  otherwise the transform should convert the string as needed (eg remove spaces, convert to uppercase, etc).</span>
</span><span class='line'>    <span class="c1">/// A null transform is ignored.</span>
</span><span class='line'>    <span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;exception cref=&quot;ArgumentNullException&quot;&gt;Thrown if the str is null.&lt;/exception&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">CurrencyCode</span> <span class="nf">ToCurrencyCode</span><span class="p">(</span><span class="k">this</span> <span class="kt">string</span> <span class="n">str</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">transform</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">CurrencyCode</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">transform</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new struct wrapping a string.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;exception cref=&quot;ArgumentNullException&quot;&gt;Thrown if the str is null.&lt;/exception&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">CurrencyCode</span> <span class="nf">ToCurrencyCode</span><span class="p">(</span><span class="k">this</span> <span class="kt">string</span> <span class="n">str</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">CurrencyCode</span><span class="p">.</span><span class="n">New</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new nullable struct wrapping a string, or null if the string is null or invalid.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;str&quot;&gt;The string to wrap. If is is null or invalid, null is returned.&lt;/param&gt;</span>
</span><span class='line'>    <span class="c1">/// &lt;param name=&quot;transform&quot;&gt;A function to transform and/or validate the string. </span>
</span><span class='line'>    <span class="c1">/// The unwrapped string is passed into the transform function,  </span>
</span><span class='line'>    <span class="c1">/// and the transform should throw an exception or return null if the string is not valid, </span>
</span><span class='line'>    <span class="c1">//  otherwise the transform should convert the string as needed (eg remove spaces, convert to uppercase, etc).</span>
</span><span class='line'>    <span class="c1">/// A null transform is ignored.</span>
</span><span class='line'>    <span class="c1">/// &lt;/param&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">CurrencyCode</span><span class="p">?</span> <span class="n">ToCurrencyCodeOption</span><span class="p">(</span><span class="k">this</span> <span class="kt">string</span> <span class="n">str</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">,</span> <span class="kt">string</span><span class="p">&gt;</span> <span class="n">transform</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">CurrencyCode</span><span class="p">.</span><span class="n">NewOption</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">transform</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Create a new nullable struct wrapping a string, or null if the string is null.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="n">CurrencyCode</span><span class="p">?</span> <span class="n">ToCurrencyCodeOption</span><span class="p">(</span><span class="k">this</span> <span class="kt">string</span> <span class="n">str</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">CurrencyCode</span><span class="p">.</span><span class="n">NewOption</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here&#8217;s a screenshot from Visual Studio:</p>

<p><img src="http://boustrophedonic.com//images/semantic-strings.png" alt="VS2010 screenshot" /></p>

<h2>Using the new type</h2>

<p>You can now create instances of this type, either using the static <code>New</code> method, or the helper methods that have been defined.</p>

<p>For example, say that we have a method <code>BuySomething</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">void</span> <span class="nf">BuySomething</span><span class="p">(</span><span class="n">ProductCode</span> <span class="n">productCode</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">price</span><span class="p">,</span> <span class="n">CurrencyCode</span> <span class="n">currencyCode</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">productCode</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;productCode&quot;</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">currencyCode</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;currencyCode&quot;</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Bought {0} for {1}{2}&quot;</span><span class="p">,</span> <span class="n">productCode</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">currencyCode</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can use it like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">// usage</span>
</span><span class='line'><span class="kt">var</span> <span class="n">product1</span> <span class="p">=</span> <span class="s">&quot;product1&quot;</span><span class="p">.</span><span class="n">ToProductCode</span><span class="p">();</span>
</span><span class='line'><span class="kt">var</span> <span class="n">usd</span> <span class="p">=</span> <span class="s">&quot;usd&quot;</span><span class="p">.</span><span class="n">ToCurrencyCode</span><span class="p">();</span>
</span><span class='line'><span class="n">BuySomething</span><span class="p">(</span><span class="n">product1</span><span class="p">,</span> <span class="m">12.34</span><span class="n">m</span><span class="p">,</span> <span class="n">usd</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are a few things to comment on here.</p>

<p>First, the new type is a <em>struct</em> not a class, which means that it cannot be null.<br/>
Which in turn means that the null checks that litter most C# code are not needed &#8211; you are not allowed to pass nulls as arguments, and you will get a compiler error if you try.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">// try with null product</span>
</span><span class='line'><span class="n">BuySomething</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="m">12.34</span><span class="n">m</span><span class="p">,</span> <span class="n">usd</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Result is a compiler error:</span>
</span><span class='line'><span class="c1">// Argument 1: cannot convert from &#39;&lt;null&gt;&#39; to &#39;ProductCode&#39;    </span>
</span></code></pre></td></tr></table></div></figure>


<p>So <code>BuySomething</code> can be rewritten to be cleaner:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">void</span> <span class="nf">BuySomething</span><span class="p">(</span><span class="n">ProductCode</span> <span class="n">productCode</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">price</span><span class="p">,</span> <span class="n">CurrencyCode</span> <span class="n">currencyCode</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">&quot;Bought {0} for {1}{2}&quot;</span><span class="p">,</span> <span class="n">productCode</span><span class="p">,</span> <span class="n">price</span><span class="p">,</span> <span class="n">currencyCode</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Second, the compiler&#8217;s static type checking will stop you accidentally getting the parameters in the wrong order:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">// try with product and currency swapped</span>
</span><span class='line'><span class="n">BuySomething</span><span class="p">(</span><span class="n">usd</span><span class="p">,</span> <span class="m">12.34</span><span class="n">m</span><span class="p">,</span> <span class="n">product1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Result is a compiler error:</span>
</span><span class='line'><span class="c1">// Argument 1: cannot convert from &#39;CurrencyCode&#39; to &#39;ProductCode&#39;    </span>
</span><span class='line'><span class="c1">// Argument 3: cannot convert from &#39;ProductCode&#39; to &#39;CurrencyCode&#39;    </span>
</span></code></pre></td></tr></table></div></figure>


<p>In one fell swoop you have (a) eliminated code for runtime error-handling code and (b) guaranteed extra levels of correctness.  Isn&#8217;t that nice.</p>

<h2>Transformation and validation</h2>

<p>Often, a domain type will have rules about what values are valid for that type. For example <code>example.com</code> would be a valid <code>DomainName</code> but not a valid <code>EmailAddress</code>.</p>

<p>And even if the string is valid, it might need to be transformed into a canonical form, such as being uppercased, or having spaces replaced with hyphens.</p>

<p>The template allows you to customize this transformation and validation by having variants that allow a function or lambda to be passed in.
The simple rule is that if the function returns a null, the input is not valid.</p>

<p>So for example, here is a function for email addresses that validates against a regex and lowercases the input if successful:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">partial</span> <span class="k">struct</span> <span class="nc">EmailAddress</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">TransformEmailAddress</span><span class="p">(</span><span class="kt">string</span> <span class="n">str</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">str</span><span class="p">))</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">const</span> <span class="kt">string</span> <span class="n">pattern</span> <span class="p">=</span> <span class="s">@&quot;^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">Regex</span><span class="p">.</span><span class="n">IsMatch</span><span class="p">(</span><span class="n">str</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">RegexOptions</span><span class="p">.</span><span class="n">IgnoreCase</span><span class="p">))</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">str</span><span class="p">.</span><span class="n">ToLower</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">//add logging</span>
</span><span class='line'>        <span class="c1">//Console.WriteLine(&quot;The string &#39;{0}&#39; is not a valid email address&quot;, str);</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The generated code is created in a partial struct, so that you can easily add custom behavior like this in a separate file.</p>

<p>You can use this function explictly when creating values:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">e</span> <span class="p">=</span> <span class="s">&quot;BOB@example.com&quot;</span><span class="p">.</span><span class="n">ToEmailAddress</span><span class="p">(</span><span class="n">EmailAddress</span><span class="p">.</span><span class="n">TransformEmailAddress</span><span class="p">);</span>
</span><span class='line'><span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;bob@example.com&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">ToString</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>


<p>Or you can use other transforms as well:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">e</span> <span class="p">=</span> <span class="s">&quot;bob@example.com&quot;</span><span class="p">.</span><span class="n">ToEmailAddress</span><span class="p">(</span><span class="n">s</span> <span class="p">=&gt;</span> <span class="n">s</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">3</span><span class="p">));</span>
</span><span class='line'><span class="n">Assert</span><span class="p">.</span><span class="n">AreEqual</span><span class="p">(</span><span class="s">&quot;bob&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">Value</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>To set the default transform to use when none is explicitly specified, you set the options in the template file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="err">#</span>
</span><span class='line'><span class="kt">var</span> <span class="n">options</span> <span class="p">=</span> <span class="k">new</span> <span class="p">{</span> <span class="n">DefaultTransform</span> <span class="p">=</span> <span class="s">&quot;TransformEmailAddress&quot;</span> <span class="p">};</span>
</span><span class='line'><span class="err">#</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">&lt;</span><span class="err">#@</span> <span class="n">include</span> <span class="n">file</span><span class="p">=</span><span class="s">&quot;..\StringWrapper.ttinclude&quot;</span> <span class="err">#</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The template includes some built-in transforms as well such as &#8220;Trim&#8221; and &#8220;TrimToUpper&#8221; which you can set in the same way.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="p">&lt;</span><span class="err">#</span>
</span><span class='line'><span class="kt">var</span> <span class="n">options</span> <span class="p">=</span> <span class="k">new</span> <span class="p">{</span> <span class="n">DefaultTransform</span> <span class="p">=</span> <span class="s">&quot;TrimToUpper&quot;</span> <span class="p">};</span>
</span><span class='line'><span class="err">#</span><span class="p">&gt;</span>
</span><span class='line'><span class="p">&lt;</span><span class="err">#@</span> <span class="n">include</span> <span class="n">file</span><span class="p">=</span><span class="s">&quot;..\StringWrapper.ttinclude&quot;</span> <span class="err">#</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Optional values</h2>

<p>One of the advantages of this approach is that there is a clear distinction between when the value is optional and when it is not.</p>

<p>For example, for an interface to a product database, you might have something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">IProductRepository</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Product</span> <span class="nf">GetByCode</span><span class="p">(</span><span class="n">ProductCode</span> <span class="n">productCode</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Find all matching. Note that productCode and supplierCode are optional but currencyCode is not.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">FindMatchingProducts</span><span class="p">(</span><span class="n">ProductCode</span><span class="p">?</span> <span class="n">productCode</span><span class="p">,</span> <span class="n">SupplierCode</span><span class="p">?</span> <span class="n">supplierCode</span><span class="p">,</span> <span class="n">CurrencyCode</span> <span class="n">currencyCode</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>By using nullables, the interface itself makes it explicit when the product code is required (for <code>GetByCode</code>) and when it optional (for <code>FindMatchingProducts</code>).
And this requirement is enforced by the compiler itself.</p>

<p>To see the importance of this, here is the same interface using strings:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">interface</span> <span class="n">IProductRepository</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">Product</span> <span class="nf">GetByCode</span><span class="p">(</span><span class="kt">string</span> <span class="n">productCode</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">/// &lt;summary&gt;</span>
</span><span class='line'>    <span class="c1">/// Find all matching. Note that productCode and supplierCode are optional but currencyCode is not.</span>
</span><span class='line'>    <span class="c1">/// &lt;/summary&gt;</span>
</span><span class='line'>    <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Product</span><span class="p">&gt;</span> <span class="n">FindMatchingProducts</span><span class="p">(</span><span class="kt">string</span> <span class="n">productCode</span><span class="p">,</span> <span class="kt">string</span> <span class="n">supplierCode</span><span class="p">,</span> <span class="kt">string</span> <span class="n">currencyCode</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this interface you must look at the comments to know what is required or not &#8211; the compiler will not enforce it for you.
And if you get it wrong, you will not know immediately, but only at runtime (assuming you added null checking for the required parameters!)</p>

<h3>Creating optional values</h3>

<p>So how do you go about creating optional values? Simply use the <code>NewOption</code> static method on the struct or the <code>ToXXXOption</code> extension method.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">c</span> <span class="p">=</span> <span class="s">&quot;&quot;</span><span class="p">.</span><span class="n">ToCurrencyCodeOption</span><span class="p">();</span>
</span><span class='line'><span class="n">Assert</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">c</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same transform and validation functions can be used, but in this case, a failed validation will result in a null value for the type.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">e</span> <span class="p">=</span> <span class="s">&quot;BADSTRING&quot;</span><span class="p">.</span><span class="n">ToEmailAddressOption</span><span class="p">();</span>
</span><span class='line'><span class="n">Assert</span><span class="p">.</span><span class="n">IsNull</span><span class="p">(</span><span class="n">e</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Using this approach in conjunction with a validation boundary</h2>

<p>By wrapping the strings and enforcing validation at creation time, we have shifted the work from the consumers of the type to the creators of the type.</p>

<p>In other words, without using this technique, the implementor has to do all the validation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">// caller code</span>
</span><span class='line'><span class="kt">var</span> <span class="n">emailAddress</span> <span class="p">=</span> <span class="s">&quot;BADSTRING&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">EmailService</span><span class="p">.</span><span class="n">SendEmail</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// implementors code</span>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailService</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">SendEmail</span><span class="p">(</span><span class="kt">string</span> <span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">emailAddress</span><span class="p">==</span><span class="k">null</span><span class="p">)</span> <span class="p">{</span><span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(...);</span> <span class="p">}</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(!</span><span class="n">IsValid</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">))</span> <span class="p">{</span><span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentException</span><span class="p">(...);</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// do work</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>But with this technique, the caller has to do the validation upfront, and the implementation is easier:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="c1">// client code</span>
</span><span class='line'><span class="kt">var</span> <span class="n">e</span> <span class="p">=</span> <span class="s">&quot;BADSTRING&quot;</span><span class="p">.</span><span class="n">ToEmailAddressOption</span><span class="p">();</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">e</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">EmailService</span><span class="p">.</span><span class="n">SendEmail</span><span class="p">(</span><span class="n">emailAddress</span><span class="p">.</span><span class="n">Value</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// implementors code</span>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailService</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="k">void</span> <span class="nf">SendEmail</span><span class="p">(</span><span class="n">EmailAddress</span> <span class="n">emailAddress</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="c1">// no validation needed</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// do work</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So in some sense, we haven&#8217;t really eliminated the work, but just moved it somewhere else.  This is indeed true. But you might think of this technique as part of a general &#8220;validation boundary&#8221; approach around the core domain code. Inside the boundary, everything is valid and safe, and outside the boundary it is a wild jungle.  When potentially dangerous data from the UI or database comes into the system, the boundary is where the validation occurs, rather than in the core.</p>

<p><img src="http://boustrophedonic.com//images/trusted-untrusted-wrapped-strings.png" alt="Wrapped and trusted" /></p>

<p>So, for example, an MVC web app would create these kinds of wrapped strings in the controller before passing them to the domain model.</p>

<p>A database access or persistence layer would do the same thing, although if the persisted value was invalid on load, you might need to support <em>two</em> different domain types &#8211; such as <code>ValidEmailAddress</code> and <code>InvalidEmailAddress</code>. See the related post on <a href="http://boustrophedonic.com//blog/2012/10/21/union-types-in-csharp">union types</a> for an example of how to deal with this.</p>

<h2>Issues with this approach</h2>

<p>There are a couple concerns that seem to arise when using this approach.</p>

<p>First, it&#8217;s not totally idiot proof. You can still create invalid objects if you want to. For example, the following code will create a <code>CurrencyCode</code> with a null string.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="kt">var</span> <span class="n">c</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CurrencyCode</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is not much we can do about this, unfortunately &#8211; it&#8217;s in the nature of structs. But hopefully this would not happen too often, and overall I prefer the usefulness of having non-null structs to having normal classes.</p>

<p>Second, you might also have performance concerns about using structs rather than classes, as they may need to be boxed and unboxed. In this particular case, I doubt that that much conversion will be happening in practice. But my general response to all concerns about performance is that you should <a href="http://www.bluebytesoftware.com/blog/2010/09/06/ThePrematureOptimizationIsEvilMyth.aspx">rely on facts rather than assumptions</a>.</p>

<p>For example, in my code that uses this approach, I haven&#8217;t seen any performance hits, but if your profiler tells you that the app is slow because of too much boxing and unboxing, then by all means, don&#8217;t use this approach. However, I think that in many (if not most) cases the benefits of correct code will outweigh any performance decrease.</p>

<h2>Getting the code</h2>

<p>You can get the code two ways:</p>

<ul>
<li>Download the template only: <a href="http://boustrophedonic.com//downloads/code/StringWrapper.ttinclude">StringWrapper.ttinclude</a>.</li>
<li>or, from the git repository for this blog (see the <a href="http://boustrophedonic.com//about/">about page</a>). This has a full set of examples and unit tests.</li>
</ul>

]]></content>
  </entry>
  
</feed>
