<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Joseph Bulger IV</title>
	<atom:link href="http://josephbulger.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://josephbulger.com</link>
	<description>God, Family, Church, Engineering</description>
	<lastBuildDate>Thu, 20 Oct 2011 12:00:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Mental Floss: Days for a Week</title>
		<link>http://josephbulger.com/programming/mental-floss-days-for-a-week/</link>
		<comments>http://josephbulger.com/programming/mental-floss-days-for-a-week/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 12:00:50 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[viewmodel-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=834</guid>
		<description><![CDATA[So as I build the week up, I&#8217;m adding Days onto it, but what do they look like? A Day is pretty simple. It has the DateTime that says what actual day it belongs to. It also has a list of Events that belong to it. A Day can also indicate whether or not it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>So as I <a href="http://josephbulger.com/?p=823">build the week up</a>, I&#8217;m adding Days onto it, but what do they look like?</p>
<p><span id="more-834"></span></p>
<p>A Day is pretty simple. It has the DateTime that says what actual day it belongs to. It also has a list of Events that belong to it. A Day can also indicate whether or not it&#8217;s available for reading, or if it has events. This is important because if a day is available, then the UI needs to let the user select that Day, and if it has events, then the day should show those events in the UI.</p>
<div id="gist-1291245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="err">﻿</span><span class="k">public</span> <span class="k">class</span> <span class="nc">Day</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="n">DateTime</span> <span class="n">Date</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="n">IList</span><span class="p">&lt;</span><span class="n">Event</span><span class="p">&gt;</span> <span class="n">Events</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Day</span><span class="p">()</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Events</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Event</span><span class="p">&gt;();</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'><br/></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">bool</span> <span class="nf">HasEvents</span><span class="p">()</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Events</span><span class="p">.</span><span class="n">Count</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">;</span></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC16'><br/></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">AddEvent</span><span class="p">(</span><span class="n">Event</span> <span class="n">eventForDay</span><span class="p">)</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Events</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">eventForDay</span><span class="p">);</span></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="n">IList</span><span class="p">&lt;</span><span class="n">Event</span><span class="p">&gt;</span> <span class="n">GetEvents</span><span class="p">()</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Events</span><span class="p">;</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">string</span> <span class="nf">GetReadingAvailability</span><span class="p">()</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nf">IsAvailable</span><span class="p">()</span> <span class="p">?</span> <span class="s">&quot;date_is_available&quot;</span> <span class="p">:</span> </div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">HasEvents</span><span class="p">()</span> <span class="p">?</span> <span class="s">&quot;date_has_event&quot;</span> <span class="p">:</span> <span class="s">&quot;&quot;</span><span class="p">);</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC32'><br/></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="kt">bool</span> <span class="nf">IsAvailable</span><span class="p">()</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="p">!</span><span class="n">HasEvents</span><span class="p">()</span> <span class="p">&amp;&amp;</span> <span class="n">IsDayAvailableForReading</span><span class="p">();</span></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC37'><br/></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="kt">bool</span> <span class="nf">IsDayAvailableForReading</span><span class="p">()</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nf">IsDayAvailableForReading</span><span class="p">(</span><span class="n">Date</span><span class="p">);</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC42'><br/></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">IsDayAvailableForReading</span><span class="p">(</span><span class="n">DateTime</span> <span class="n">dateTime</span><span class="p">)</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="k">new</span> <span class="nf">AvailabilityChecker</span><span class="p">()</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">.</span><span class="n">IsDayAvailableForReading</span><span class="p">(</span><span class="n">dateTime</span><span class="p">);</span></div><div class='line' id='LC47'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC48'><br/></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">string</span> <span class="nf">GetReadableValue</span><span class="p">()</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Date</span><span class="p">.</span><span class="n">ToString</span><span class="p">(</span><span class="s">&quot;MMMM dd, yyyy&quot;</span><span class="p">);</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC53'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1291245/2a3b41c0807eb03b071abf2f1b14dfcab241b5c7/Day.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1291245#file_day.cs" style="float:right;margin-right:10px;color:#666">Day.cs</a>
            <a href="https://gist.github.com/1291245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This concludes the implementation of all the pieces necessary to build the ViewModel. The View itself could be built on any technology stack to show UI appropriate to the rules we outlined so far, which is the ultimate goal of having our ViewModel separated from the View itself.</p>
<p>This does<strong> not</strong>, however, tell us what our business rules are, or how their implemented, which is the next part of the series: the Model.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-days-for-a-week/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mental Floss: Weeks on the Calendar</title>
		<link>http://josephbulger.com/programming/mental-floss-weeks-on-the-calendar/</link>
		<comments>http://josephbulger.com/programming/mental-floss-weeks-on-the-calendar/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 12:00:48 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[viewmodel-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=823</guid>
		<description><![CDATA[Now we&#8217;ve gone through how the month is modeled, we need to see how weeks are being built. When you first look at the month implementation, you might think that adding days to weeks is a simple matter of adding DateTime&#8217;s, but what&#8217;s happening behind the scenes is just a little bit more complicated. Why? [...]]]></description>
			<content:encoded><![CDATA[<p>Now we&#8217;ve gone through how the <a title="The Month" href="http://josephbulger.com/?p=817">month is modeled</a>, we need to see how weeks are being built.</p>
<p><span id="more-823"></span>When you first look at the month implementation, you might think that adding days to weeks is a simple matter of adding DateTime&#8217;s, but what&#8217;s happening behind the scenes is just a little bit more complicated. Why? Well, we need to track what events belong to what days, so in order to do that we can&#8217;t just use a simple DateTime, we need something just a little bit more complicated.</p>
<p>My Week looks like this:</p>
<div id="gist-1291245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="err">﻿</span><span class="k">public</span> <span class="k">class</span> <span class="nc">Week</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Week</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Days</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Day</span><span class="p">&gt;();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC7'><br/></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">protected</span> <span class="n">IList</span><span class="p">&lt;</span><span class="n">Day</span><span class="p">&gt;</span> <span class="n">Days</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC9'><br/></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Day</span><span class="p">&gt;</span> <span class="n">GetDays</span><span class="p">()</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Days</span><span class="p">;</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC14'><br/></div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Add</span><span class="p">(</span><span class="n">DateTime</span> <span class="n">day</span><span class="p">)</span></div><div class='line' id='LC16'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC17'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(!</span><span class="n">Days</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Date</span> <span class="p">==</span> <span class="n">day</span><span class="p">.</span><span class="n">Date</span><span class="p">).</span><span class="n">Any</span><span class="p">())</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Days</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Day</span> <span class="p">{</span> <span class="n">Date</span> <span class="p">=</span> <span class="n">day</span> <span class="p">});</span></div><div class='line' id='LC19'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">bool</span> <span class="nf">IsMissingDays</span><span class="p">()</span></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Days</span><span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Date</span><span class="p">)</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">.</span><span class="n">First</span><span class="p">().</span><span class="n">Date</span><span class="p">.</span><span class="n">DayOfWeek</span> <span class="p">!=</span> <span class="n">Calendar</span><span class="p">.</span><span class="n">GetStartDay</span><span class="p">();</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC26'><br/></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">bool</span> <span class="nf">IsMissingTrailingDays</span><span class="p">()</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Days</span><span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Date</span><span class="p">)</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">.</span><span class="n">First</span><span class="p">().</span><span class="n">Date</span><span class="p">.</span><span class="n">DayOfWeek</span> <span class="p">!=</span> <span class="n">Calendar</span><span class="p">.</span><span class="n">GetLastDay</span><span class="p">();</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC32'><br/></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">int</span> <span class="nf">GetMissingNumberOfDays</span><span class="p">()</span></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC35'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">missingDays</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">day</span> <span class="p">=</span> <span class="n">Days</span><span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Date</span><span class="p">).</span><span class="n">First</span><span class="p">().</span><span class="n">Date</span><span class="p">;</span></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC40'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC41'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">day</span> <span class="p">=</span> <span class="n">day</span><span class="p">.</span><span class="n">AddDays</span><span class="p">(-</span><span class="m">1</span><span class="p">);</span></div><div class='line' id='LC42'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">missingDays</span><span class="p">++;</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">day</span><span class="p">.</span><span class="n">DayOfWeek</span> <span class="p">!=</span> <span class="n">Calendar</span><span class="p">.</span><span class="n">GetStartDay</span><span class="p">());</span></div><div class='line' id='LC44'><br/></div><div class='line' id='LC45'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">missingDays</span><span class="p">;</span></div><div class='line' id='LC46'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC47'><br/></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">public</span> <span class="kt">int</span> <span class="nf">GetMissingNumberOfTrailingDays</span><span class="p">()</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">missingDays</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span></div><div class='line' id='LC51'><br/></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">day</span> <span class="p">=</span> <span class="n">Days</span><span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Date</span><span class="p">).</span><span class="n">Last</span><span class="p">().</span><span class="n">Date</span><span class="p">;</span></div><div class='line' id='LC53'><br/></div><div class='line' id='LC54'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC55'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC56'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">day</span> <span class="p">=</span> <span class="n">day</span><span class="p">.</span><span class="n">AddDays</span><span class="p">(</span><span class="m">1</span><span class="p">);</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">missingDays</span><span class="p">++;</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">day</span><span class="p">.</span><span class="n">DayOfWeek</span> <span class="p">!=</span> <span class="n">Calendar</span><span class="p">.</span><span class="n">GetLastDay</span><span class="p">());</span></div><div class='line' id='LC59'><br/></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">missingDays</span><span class="p">;</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC62'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1291245/7c4dc92810179d86c4c48824660ce336320251b5/Week.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1291245#file_week.cs" style="float:right;margin-right:10px;color:#666">Week.cs</a>
            <a href="https://gist.github.com/1291245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>When adding days to the week, I accept a DateTime and then build a list of Days into the Week. Later on, the calendar will add Events to these Days.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-weeks-on-the-calendar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gist @ GitHub and why it&#8217;s awesome</title>
		<link>http://josephbulger.com/technology/gist-github-and-why-its-awesome/</link>
		<comments>http://josephbulger.com/technology/gist-github-and-why-its-awesome/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 12:00:08 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[gist]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=845</guid>
		<description><![CDATA[In case you haven&#8217;t noticed, a lot of my posts recently have been using gist. It&#8217;s an awesome tool that&#8217;s freely available which allows you to write snippets of code in a variety of languages. Not only does it do that, but the actual gist that you create is a full fledged Git repository, which [...]]]></description>
			<content:encoded><![CDATA[<p>In case you haven&#8217;t noticed, a lot of my posts recently have been using <a title="Gist" href="https://gist.github.com/" target="_blank">gist</a>. It&#8217;s an awesome tool that&#8217;s freely available which allows you to write snippets of code in a variety of languages.</p>
<p><span id="more-845"></span>Not only does it do that, but the actual gist that you create is a full fledged Git repository, which means you have the ability to clone it , pull and push from it.</p>
<p>I also use a <a href="http://wordpress.org/extend/plugins/embed-github-gist/" target="_blank">plug in</a> for my blog that let&#8217;s me show individual files on any of my gists.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/gist-github-and-why-its-awesome/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mental Floss: The Month on the Calendar</title>
		<link>http://josephbulger.com/programming/mental-floss-the-month-on-the-calendar/</link>
		<comments>http://josephbulger.com/programming/mental-floss-the-month-on-the-calendar/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 12:00:02 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[viewmodel-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=817</guid>
		<description><![CDATA[So we&#8217;ve seen what the Calendar looks like, and how it&#8217;s building it&#8217;s Months, but what goes into building a Month? So building a Month is all about one thing: building it&#8217;s weeks. The only other thing I need from a month is the ability to get it&#8217;s name (i.e. January, February, etc.). My implementation [...]]]></description>
			<content:encoded><![CDATA[<p>So we&#8217;ve seen what the Calendar looks like, and how it&#8217;s building it&#8217;s Months, but what goes into building a Month?</p>
<p><span id="more-817"></span>So building a Month is all about one thing: building it&#8217;s weeks. The only other thing I need from a month is the ability to get it&#8217;s name (i.e. January, February, etc.). My implementation of this looks something like this:</p>
<div id="gist-1291245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="err">﻿</span><span class="k">public</span> <span class="k">class</span> <span class="nc">Month</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">private</span> <span class="n">DateTime</span> <span class="n">FirstDayOfMonth</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC4'>&nbsp;&nbsp;</div><div class='line' id='LC5'>&nbsp;&nbsp;<span class="k">private</span> <span class="n">IList</span><span class="p">&lt;</span><span class="n">Week</span><span class="p">&gt;</span> <span class="n">Weeks</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC6'><br/></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Month</span><span class="p">(</span><span class="kt">int</span> <span class="n">monthValue</span><span class="p">)</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">FirstDayOfMonth</span> <span class="p">=</span> <span class="k">new</span> <span class="n">DateTime</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">.</span><span class="n">Year</span><span class="p">,</span> <span class="n">monthValue</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Weeks</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Week</span><span class="p">&gt;();</span></div><div class='line' id='LC12'><br/></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">BuildMonth</span><span class="p">();</span></div><div class='line' id='LC14'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC15'><br/></div><div class='line' id='LC16'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">void</span> <span class="nf">BuildMonth</span><span class="p">()</span></div><div class='line' id='LC17'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">startDay</span> <span class="p">=</span> <span class="n">Calendar</span><span class="p">.</span><span class="n">GetStartDay</span><span class="p">();</span></div><div class='line' id='LC19'><br/></div><div class='line' id='LC20'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">week</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Week</span><span class="p">();</span></div><div class='line' id='LC21'><br/></div><div class='line' id='LC22'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">day</span> <span class="p">=</span> <span class="n">FirstDayOfMonth</span><span class="p">;</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(</span><span class="n">WeekHasEnded</span><span class="p">(</span><span class="n">day</span><span class="p">,</span> <span class="n">startDay</span><span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="n">WeekIsNotEmpty</span><span class="p">(</span><span class="n">week</span><span class="p">))</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Weeks</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">week</span><span class="p">);</span></div><div class='line' id='LC29'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">week</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Week</span><span class="p">();</span></div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC31'><br/></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">week</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">day</span><span class="p">);</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">day</span> <span class="p">=</span> <span class="n">GetNextDay</span><span class="p">(</span><span class="n">day</span><span class="p">);</span></div><div class='line' id='LC35'><br/></div><div class='line' id='LC36'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">day</span><span class="p">.</span><span class="n">Month</span> <span class="p">==</span> <span class="n">FirstDayOfMonth</span><span class="p">.</span><span class="n">Month</span><span class="p">);</span></div><div class='line' id='LC37'><br/></div><div class='line' id='LC38'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Weeks</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">week</span><span class="p">);</span></div><div class='line' id='LC39'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC40'><br/></div><div class='line' id='LC41'>&nbsp;&nbsp;<span class="k">private</span> <span class="kt">bool</span> <span class="nf">WeekIsNotEmpty</span><span class="p">(</span><span class="n">Week</span> <span class="n">week</span><span class="p">)</span></div><div class='line' id='LC42'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC43'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">week</span><span class="p">.</span><span class="n">GetDays</span><span class="p">().</span><span class="n">Count</span><span class="p">()</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">;</span></div><div class='line' id='LC44'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC45'><br/></div><div class='line' id='LC46'>&nbsp;&nbsp;<span class="k">private</span> <span class="kt">bool</span> <span class="nf">WeekHasEnded</span><span class="p">(</span><span class="n">DateTime</span> <span class="n">day</span><span class="p">,</span> <span class="n">DayOfWeek</span> <span class="n">startDay</span><span class="p">)</span></div><div class='line' id='LC47'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC48'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">day</span><span class="p">.</span><span class="n">DayOfWeek</span> <span class="p">==</span> <span class="n">startDay</span><span class="p">;</span></div><div class='line' id='LC49'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC50'><br/></div><div class='line' id='LC51'>&nbsp;&nbsp;<span class="k">private</span> <span class="n">DateTime</span> <span class="nf">GetNextDay</span><span class="p">(</span><span class="n">DateTime</span> <span class="n">day</span><span class="p">)</span></div><div class='line' id='LC52'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC53'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">day</span><span class="p">.</span><span class="n">AddDays</span><span class="p">(</span><span class="m">1</span><span class="p">);</span></div><div class='line' id='LC54'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC55'><br/></div><div class='line' id='LC56'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">DayOfWeek</span> <span class="nf">GetFirstDayOfMonth</span><span class="p">()</span></div><div class='line' id='LC57'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">FirstDayOfMonth</span><span class="p">.</span><span class="n">DayOfWeek</span><span class="p">;</span></div><div class='line' id='LC59'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC60'><br/></div><div class='line' id='LC61'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">IList</span><span class="p">&lt;</span><span class="n">Week</span><span class="p">&gt;</span> <span class="n">GetWeeks</span><span class="p">()</span></div><div class='line' id='LC62'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Weeks</span><span class="p">;</span></div><div class='line' id='LC64'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC65'>&nbsp;&nbsp;</div><div class='line' id='LC66'>&nbsp;&nbsp;<span class="k">public</span> <span class="kt">string</span> <span class="nf">GetMonthName</span><span class="p">()</span></div><div class='line' id='LC67'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC68'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0:MMMM}&quot;</span><span class="p">,</span> <span class="n">FirstDayOfMonth</span><span class="p">);</span></div><div class='line' id='LC69'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC70'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1291245/b168219271e33c80a4aee727bc475c801dbb69ef/Month.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1291245#file_month.cs" style="float:right;margin-right:10px;color:#666">Month.cs</a>
            <a href="https://gist.github.com/1291245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-the-month-on-the-calendar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mental Floss: The Calendar ViewModel</title>
		<link>http://josephbulger.com/programming/mental-floss-the-calendar-viewmodel/</link>
		<comments>http://josephbulger.com/programming/mental-floss-the-calendar-viewmodel/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 20:46:08 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[viewmodel-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=806</guid>
		<description><![CDATA[So my ViewModel basically starts with the idea of a Calendar and it&#8217;s Events. So what did I end up making that look like? Let&#8217;s disregard the markup for now, because how it looks isn&#8217;t really what we&#8217;re talking about here. What we&#8217;re talking about is how the Calendar and it&#8217;s Events are modeled. So [...]]]></description>
			<content:encoded><![CDATA[<p>So my ViewModel basically starts with the idea of a Calendar and it&#8217;s Events. So what did I end up making that look like? Let&#8217;s disregard the markup for now, because how it looks isn&#8217;t really what we&#8217;re talking about here. What we&#8217;re talking about is how the Calendar and it&#8217;s Events are <em><strong>modeled</strong></em>.</p>
<p><span id="more-806"></span>So my Calendar looks like this:</p>
<div id="gist-1291245" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Calendar</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Calendar</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Months</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">Month</span><span class="p">&gt;</span> </div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{{</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Today</span><span class="p">.</span><span class="n">Month</span><span class="p">,</span> <span class="k">new</span> <span class="n">Month</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Today</span><span class="p">.</span><span class="n">Month</span><span class="p">)}};</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC8'><br/></div><div class='line' id='LC9'>&nbsp;&nbsp;<span class="k">protected</span> <span class="n">IDictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">Month</span><span class="p">&gt;</span> <span class="n">Months</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC10'><br/></div><div class='line' id='LC11'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">Month</span> <span class="nf">GetCurrentMonth</span><span class="p">()</span></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nf">GetMonth</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Today</span><span class="p">.</span><span class="n">Month</span><span class="p">);</span></div><div class='line' id='LC14'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC15'><br/></div><div class='line' id='LC16'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">Month</span> <span class="nf">GetNextMonth</span><span class="p">()</span></div><div class='line' id='LC17'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC18'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nf">GetMonth</span><span class="p">(</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Today</span><span class="p">.</span><span class="n">Month</span> <span class="p">+</span> <span class="m">1</span><span class="p">);</span></div><div class='line' id='LC19'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC20'><br/></div><div class='line' id='LC21'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">Month</span> <span class="nf">GetMonth</span><span class="p">(</span><span class="kt">string</span> <span class="n">month</span><span class="p">)</span></div><div class='line' id='LC22'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="nf">GetMonth</span><span class="p">(</span></div><div class='line' id='LC24'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">DateTime</span><span class="p">.</span><span class="n">ParseExact</span><span class="p">(</span></div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">month</span><span class="p">,</span> <span class="s">&quot;MMMM&quot;</span><span class="p">,</span> <span class="n">CultureInfo</span><span class="p">.</span><span class="n">CurrentCulture</span><span class="p">)</span></div><div class='line' id='LC26'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">.</span><span class="n">Month</span><span class="p">);</span></div><div class='line' id='LC27'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC28'><br/></div><div class='line' id='LC29'>&nbsp;&nbsp;<span class="k">public</span> <span class="n">Month</span> <span class="nf">GetMonth</span><span class="p">(</span><span class="kt">int</span> <span class="n">monthValue</span><span class="p">)</span></div><div class='line' id='LC30'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC31'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">if</span> <span class="p">(!</span><span class="n">Months</span><span class="p">.</span><span class="n">ContainsKey</span><span class="p">(</span><span class="n">monthValue</span><span class="p">))</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Months</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">monthValue</span><span class="p">,</span> <span class="k">new</span> <span class="n">Month</span><span class="p">(</span><span class="n">monthValue</span><span class="p">));</span></div><div class='line' id='LC33'><br/></div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Months</span><span class="p">[</span><span class="n">monthValue</span><span class="p">];</span></div><div class='line' id='LC35'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC36'><br/></div><div class='line' id='LC37'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">static</span> <span class="n">DayOfWeek</span> <span class="nf">GetStartDay</span><span class="p">()</span></div><div class='line' id='LC38'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC39'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">DayOfWeek</span><span class="p">.</span><span class="n">Monday</span><span class="p">;</span></div><div class='line' id='LC40'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC41'><br/></div><div class='line' id='LC42'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">static</span> <span class="n">DayOfWeek</span> <span class="nf">GetLastDay</span><span class="p">()</span></div><div class='line' id='LC43'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC44'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">DayOfWeek</span><span class="p">.</span><span class="n">Sunday</span><span class="p">;</span></div><div class='line' id='LC45'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC46'><br/></div><div class='line' id='LC47'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">IncludeEvents</span><span class="p">(</span><span class="n">IList</span><span class="p">&lt;</span><span class="n">Event</span><span class="p">&gt;</span> <span class="n">events</span><span class="p">)</span></div><div class='line' id='LC48'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC49'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">@event</span> <span class="k">in</span> <span class="n">events</span><span class="p">)</span></div><div class='line' id='LC50'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC51'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">IncludeEvent</span><span class="p">(</span><span class="n">@event</span><span class="p">);</span></div><div class='line' id='LC52'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC53'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC54'><br/></div><div class='line' id='LC55'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">void</span> <span class="nf">IncludeEvent</span><span class="p">(</span><span class="n">Event</span> <span class="n">eventToInclude</span><span class="p">)</span></div><div class='line' id='LC56'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC57'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">allDaysQuery</span> <span class="p">=</span> <span class="k">from</span> <span class="n">week</span> <span class="k">in</span> <span class="n">GetMonth</span><span class="p">(</span></div><div class='line' id='LC58'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">eventToInclude</span><span class="p">.</span><span class="n">Day</span><span class="p">.</span><span class="n">Month</span><span class="p">)</span></div><div class='line' id='LC59'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">.</span><span class="n">GetWeeks</span><span class="p">()</span></div><div class='line' id='LC60'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">from</span> <span class="n">day</span> <span class="k">in</span> <span class="n">week</span><span class="p">.</span><span class="n">GetDays</span><span class="p">()</span></div><div class='line' id='LC61'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">select</span> <span class="n">day</span><span class="p">;</span></div><div class='line' id='LC62'><br/></div><div class='line' id='LC63'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">filteredDays</span> <span class="p">=</span> <span class="k">from</span> <span class="n">day</span> <span class="k">in</span> <span class="n">allDaysQuery</span></div><div class='line' id='LC64'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">where</span> <span class="n">day</span><span class="p">.</span><span class="n">Date</span> <span class="p">==</span> <span class="n">eventToInclude</span><span class="p">.</span><span class="n">Day</span><span class="p">.</span><span class="n">Date</span></div><div class='line' id='LC65'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">select</span> <span class="n">day</span><span class="p">;</span></div><div class='line' id='LC66'><br/></div><div class='line' id='LC67'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">dayToAddEventTo</span> <span class="p">=</span> <span class="n">filteredDays</span><span class="p">.</span><span class="n">First</span><span class="p">();</span></div><div class='line' id='LC68'><br/></div><div class='line' id='LC69'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">dayToAddEventTo</span><span class="p">.</span><span class="n">AddEvent</span><span class="p">(</span><span class="n">eventToInclude</span><span class="p">);</span></div><div class='line' id='LC70'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC71'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1291245/dcf1b7a675494a9c965ec926c294cd5305a5307c/Calendar.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1291245#file_calendar.cs" style="float:right;margin-right:10px;color:#666">Calendar.cs</a>
            <a href="https://gist.github.com/1291245">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The Calendar is really only concerned with one thing: showing events that belong to it. In order to accomplish this goal, the Calendar must be able to include events into the months on the Calendar.</p>
<p>In order to do this, the Calendar has to be able to build months, and then include the events into the days of those months. All of this logic takes place in the IncludeEvent method, which utilizes quite a few other classes to accomplish this.</p>
<p>In the next post, we&#8217;ll take a look at the other classes we used in the ViewModel to accommodate our Calendar</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-the-calendar-viewmodel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Team Maturity: Self-Organizing</title>
		<link>http://josephbulger.com/technology/team-maturity-self-organizing/</link>
		<comments>http://josephbulger.com/technology/team-maturity-self-organizing/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 12:00:24 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[team-maturity]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=791</guid>
		<description><![CDATA[Your team has been in the Learning stage and it&#8217;s heading into the Self-Organizing stage. Team members have learned the skills necessary to become self-organizing now, and everything gets done whether you&#8217;re there or not. This is where a lot of people get scared. What good am I as a lead if I&#8217;m not needed anymore? [...]]]></description>
			<content:encoded><![CDATA[<p>Your team has been in the <a title="Team Maturity: Learning" href="http://josephbulger.com/technology/team-maturity-learning/">Learning stage</a> and it&#8217;s heading into the Self-Organizing stage. Team members have learned the skills necessary to become self-organizing now, and everything gets done whether you&#8217;re there or not. This is where a lot of people get scared. What good am I as a lead if I&#8217;m not needed anymore? Couldn&#8217;t my higher ups just fire me and let the team do it&#8217;s thing?<span id="more-791"></span></p>
<p>Not to worry. In the Self-Organizing stage your role turns to more of a Coach. You need to <em>grow</em> your team into learning new things, technologies or tools to help them in what they do. Inspire them to be passionate about their job. This is also the perfect stage to take those team members that you identified earlier as your potential leaders and really coach them into<em><strong> becoming</strong></em> leaders. If you do your job well enough, then they can do your job <em>for</em> you. <strong>This is not a bad thing. </strong>If they can do your job for you, that frees you up to help with other projects, or start new ones.</p>
<p>In reality, a team will never be able to sustain being in the Self-Organizing stage, though. Teams will cycle through stages. Usually it&#8217;s a circular pattern. It almost always happens because the scope of the project changes in some way. Maybe they need to learn a whole new technology stack. Maybe the project has taken a whole new direction and you need to develop completely new projects. If this happens don&#8217;t think it&#8217;s a sign that you or your team has done something wrong. It&#8217;s just a natural part of the team cycle. It should be <em><strong>easier</strong></em> for subsequent cycles. The more your team has experience going through the cycles, and gain experience with how they work inside each cycle, the easier it will be to ramp back up to Self-Organizing.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/team-maturity-self-organizing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mental Floss: The problem with my Circle is&#8230;</title>
		<link>http://josephbulger.com/programming/mental-floss-the-problem-with-my-circle-is/</link>
		<comments>http://josephbulger.com/programming/mental-floss-the-problem-with-my-circle-is/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 12:00:32 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=777</guid>
		<description><![CDATA[that I&#8217;m exposing too many details to the user of my code. The developer has to know intimate details about how to set up both the Ellipse and the Circle in order to calculate their areas effectively. In one case, the Ellipse, the runner has to know to set the major and minor axes, while [...]]]></description>
			<content:encoded><![CDATA[<p>that I&#8217;m exposing <a title="My Circle Problem" href="http://josephbulger.com/?p=769">too many details</a> to the user of my code. The developer has to know intimate details about how to set up both the Ellipse and the Circle in order to calculate their areas effectively. In one case, the Ellipse, the runner has to know to set the major and minor axes, while for the Circle, they have know to set the Radius.</p>
<p><span id="more-777"></span>The underlying problem here is simple, actually. The real issue stems from the fact that the Ellipse (and by proxy the Circle) was designed as a Hybrid object. As <a title="Datastructures, Objects, and why Hybrids are evil" href="http://josephbulger.com/programming/datastructures-objects-and-why-hybrids-are-evil/">I&#8217;ve said before</a>, and <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" target="_blank">others before me</a>, Hybrid objects are evil. To fix this, we need to either make these classes Data Structures, or make them Objects. Since the whole point of the code is to calculate the area, I say we have to make them Objects.</p>
<p>To do that, I made the following changes to Ellipse:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Ellipse</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">protected</span> <span class="k">virtual</span> <span class="kt">int</span> <span class="n">MajorAxis</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="k">protected</span> <span class="k">virtual</span> <span class="kt">int</span> <span class="n">MinorAxis</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Ellipse</span><span class="p">(</span><span class="kt">int</span> <span class="n">majorAxis</span><span class="p">,</span> <span class="kt">int</span> <span class="n">minorAxis</span><span class="p">)</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MajorAxis</span> <span class="p">=</span> <span class="n">majorAxis</span><span class="p">;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MinorAxis</span> <span class="p">=</span> <span class="n">minorAxis</span><span class="p">;</span></div><div class='line' id='LC10'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC11'>&nbsp;&nbsp;</div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">virtual</span> <span class="kt">double</span> <span class="nf">CalculateArea</span><span class="p">()</span></div><div class='line' id='LC13'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="n">Pi</span> <span class="p">*</span> <span class="n">MajorAxis</span> <span class="p">*</span> <span class="n">MinorAxis</span><span class="p">;</span></div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC16'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/a940f205692136399cefcedacb2ea1a702483dda/GoodEllipse.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_good_ellipse.cs" style="float:right;margin-right:10px;color:#666">GoodEllipse.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Notice how MajorAxis and MinorAxis can still be extended via a subclass if need be, but they are <strong>only</strong> accessible from sub classes now, not from the outside world. This removes the class&#8217;s Data Structure flavor and make it&#8217;s a pure Object. It also has a great side benefit. Now a user can only create an Ellipse by supplying the major and minor values when the Ellipse is created. This logically makes sense because an Ellipse can&#8217;t exist without it&#8217;s major and minor axes.</p>
<p>So how does this effect the Circle now? This is how I changed the Circle:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Circle</span><span class="p">:</span> <span class="n">Ellipse</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Circle</span><span class="p">(</span><span class="kt">int</span> <span class="n">radius</span><span class="p">)</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MajorAxis</span> <span class="p">=</span> <span class="n">radius</span><span class="p">;</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">MinorAxis</span> <span class="p">=</span> <span class="n">radius</span><span class="p">;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="p">}</span>  </div><div class='line' id='LC8'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/3b3e82b8e3bcae2b9d8677ae6a56cfe6c2943830/GoodCircle.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_good_circle.cs" style="float:right;margin-right:10px;color:#666">GoodCircle.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>A lot of code has been removed. It almost seems like I&#8217;ve cheated somewhere, doesn&#8217;t it? Well, now that Ellipse is acting as a pure Object, the only thing Circle needs to do is to explain why it&#8217;s &#8220;special&#8221;. As we noted before, a Circle is special because it has a Radius. In other words, it&#8217;s major and minor axes have the same length. So the Circle class simply explains that relationship, and you&#8217;re done. The area calculation doesn&#8217;t need to be modified because the real difference was showing how the radius is related to the major and minor axes.</p>
<p>Now the runner is forced to use the classes in a way that prevents them from being used in inappropriate ways:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Runner</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">UsingEllipsesAndCircles</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">ellipse</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Ellipse</span><span class="p">(</span><span class="m">10</span><span class="p">,</span> <span class="m">5</span><span class="p">);</span>    </div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">areaOfEllipse</span> <span class="p">=</span> <span class="n">ellipse</span><span class="p">.</span><span class="n">CalculateArea</span><span class="p">();</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">circle</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Circle</span><span class="p">(</span><span class="m">4</span><span class="p">);</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">areaForCircle</span> <span class="p">=</span> <span class="n">circle</span><span class="p">.</span><span class="n">CalculateArea</span><span class="p">();</span>    </div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC13'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/16430467a83f5d7774beca30e774d9d34008c613/GoodRunner.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_good_runner.cs" style="float:right;margin-right:10px;color:#666">GoodRunner.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-the-problem-with-my-circle-is/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mental Floss: What&#8217;s the problem with my Circle</title>
		<link>http://josephbulger.com/programming/mental-floss-whats-the-problem-with-my-circle/</link>
		<comments>http://josephbulger.com/programming/mental-floss-whats-the-problem-with-my-circle/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 12:00:01 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=769</guid>
		<description><![CDATA[I got into an interesting discussion about SOLID principles with a fellow developer today, and it got me to thinking about a common problem I&#8217;ve seen come up and I wanted to try and touch on it. So first things first, let&#8217;s go over some math and set up the problem space. You have an [...]]]></description>
			<content:encoded><![CDATA[<p>I got into an interesting discussion about <a title="SOLID Principles: Open Closed Principle" href="http://josephbulger.com/programming/solid-principles-open-closed-principle/">SOLID </a>principles with a fellow developer today, and it got me to thinking about a common problem I&#8217;ve seen come up and I wanted to try and touch on it.<span id="more-769"></span></p>
<p>So first things first, let&#8217;s go over some math and set up the problem space.</p>
<p>You have an <a title="Ellipse" href="http://en.wikipedia.org/wiki/Ellipse" target="_blank">Ellipse</a>. You have a <a title="Circle" href="http://en.wikipedia.org/wiki/Circle" target="_blank">Circle</a>. A Circle is a special kind of Ellipse. Specifically, an Ellipse has a major axis and a minor axis, and a Circle is special because it&#8217;s major and minor axis are equivalent in their length.</p>
<p>So when a developer initially goes to model these objects, you typically would see something like this:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Ellipse</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">virtual</span> <span class="kt">int</span> <span class="n">MajorAxis</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">virtual</span> <span class="kt">int</span> <span class="n">MinorAxis</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC5'><br/></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">virtual</span> <span class="kt">double</span> <span class="nf">CalculateArea</span><span class="p">()</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="n">Pi</span> <span class="p">*</span> <span class="n">MajorAxis</span> <span class="p">*</span> <span class="n">MinorAxis</span><span class="p">;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC10'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/fde6bd5a0e176b7c90c7bc3fa4fc7d0c0e2fe54c/BadEllipse.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_bad_ellipse.cs" style="float:right;margin-right:10px;color:#666">BadEllipse.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>I see this implementation a lot. When asked how this supports SOLID principles, I get the following a lot of the time:</p>
<p>It supports <a title="SOLID Principles: Open Closed Principle" href="http://josephbulger.com/programming/solid-principles-open-closed-principle/">OCP </a>because I can override any of the properties or the methods. Ok good.</p>
<p>It supports <a title="SOLID Principles: Single responsibility principle" href="http://josephbulger.com/programming/solid-principles-single-responsibility-principle/">SRP </a>because the class is only responsible for knowing things about Ellipse. Ok good.</p>
<p>And there are some other ones, but then we veer into trying to extend this model with the special Circle, and that&#8217;s where things really start to break down. I&#8217;ve seen a lot of variations about how this goes down, but I&#8217;m going to summarize all of them with this definition:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Circle</span><span class="p">:</span> <span class="n">Ellipse</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="kt">int</span> <span class="n">Radius</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span></div><div class='line' id='LC4'>&nbsp;&nbsp;</div><div class='line' id='LC5'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">override</span> <span class="kt">double</span> <span class="nf">CalculateArea</span><span class="p">()</span></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="n">Pi</span> <span class="p">*</span> <span class="n">Radius</span> <span class="p">*</span> <span class="n">Radius</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC9'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/3d9798a630668b09616698083a5eaaa61daf9af8/BadCircle.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_bad_circle.cs" style="float:right;margin-right:10px;color:#666">BadCircle.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>What happens here is a new property is introduced so that the users know that Circles are special because they have a Radius. Then when we calculate the Area, we override the function that calculates the area and we use the radius instead.</p>
<p>So someone would use it like this:</p>
<div id="gist-1279017" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Runner</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">UsingEllipsesAndCircles</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">ellipse</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Ellipse</span><span class="p">();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">ellipse</span><span class="p">.</span><span class="n">MajorAxis</span> <span class="p">=</span> <span class="m">10</span><span class="p">;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">ellipse</span><span class="p">.</span><span class="n">MinorAxis</span> <span class="p">=</span> <span class="m">5</span><span class="p">;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">areaOfEllipse</span> <span class="p">=</span> <span class="n">ellipse</span><span class="p">.</span><span class="n">CalculateArea</span><span class="p">();</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">circle</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Circle</span><span class="p">();</span></div><div class='line' id='LC12'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">circle</span><span class="p">.</span><span class="n">Radius</span> <span class="p">=</span> <span class="m">4</span><span class="p">;</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="kt">var</span> <span class="n">areaForCircle</span> <span class="p">=</span> <span class="n">circle</span><span class="p">.</span><span class="n">CalculateArea</span><span class="p">();</span>    </div><div class='line' id='LC15'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC16'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1279017/8f695dac99154a53f2794a1ab292b3861fe04812/BadRunner.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1279017#file_bad_runner.cs" style="float:right;margin-right:10px;color:#666">BadRunner.cs</a>
            <a href="https://gist.github.com/1279017">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>So what&#8217;s the problem with this? Think about it an tomorrow I&#8217;ll post my proposed solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-whats-the-problem-with-my-circle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mental Floss: Models and ViewModels, and yes they&#8217;re different</title>
		<link>http://josephbulger.com/programming/mental-floss-models-and-viewmodels-and-yes-theyre-different/</link>
		<comments>http://josephbulger.com/programming/mental-floss-models-and-viewmodels-and-yes-theyre-different/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 21:20:34 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[mental-floss]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[viewmodel-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=796</guid>
		<description><![CDATA[My wife recently asked me to work on a site for our son&#8217;s class and while working on it I realized that what I was building was a pretty great example of my thoughts on how I feel that Models and ViewModels relate to each other. So before we get to any code I&#8217;d first [...]]]></description>
			<content:encoded><![CDATA[<p>My wife recently asked me to work on a site for our son&#8217;s class and while working on it I realized that what I was building was a pretty great example of my thoughts on how I feel that Models and ViewModels relate to each other.</p>
<p><span id="more-796"></span>So before we get to any code I&#8217;d first like to explain how I see the Model and ViewModel shaping conceptually. The domain is basically as follows:</p>
<p>The system needs to be able to allow users to sign up as Readers for a particular day. The time that they are going to read is always the same, it&#8217;s 10 AM for an hour. The days that a user can sign up to be a Reader are specific. For the most part, the days are Monday, Tuesday, Thursday and Friday, but there are also some other rules like the week of Thanksgiving there won&#8217;t be any readings. Currently, this is being done by the teacher where she prints out a Reading Calendar that has the days for reading highlighted. What needs to be done is basically the same thing. We need to make a calendar that shows everyone all the days that are eligible for signing up, and let them sign up for those days. It also needs to show them the days that have already been signed up, and show the Reader for that day.</p>
<p>Ok, so that&#8217;s the basics. Now, the question here is how is the Model and ViewModel broken down?</p>
<p>To illustrate this it would probably be better to start with the user experience, and hence the ViewModel. So the user will be presented with a Calendar, and they should be able to see Events that show up on the calendar, like they&#8217;re most likely already used to. These Events will show who&#8217;s signed up. Now, the user also needs to be able to Sign Up. That&#8217;s the extent of the first version of the ViewModel I came up with. We have a Calendar, Events, and a SignUp.</p>
<p>Now, onto the Model. When the user signs up, they&#8217;re telling the system that they want to be a Reader for a particular day. Once they become a Reader then the system shouldn&#8217;t allow anyone else sign up on that day. So that&#8217;s really the Model. We have a bunch of Readers and some logic that keeps you from signing up multiple Readers on the same day.</p>
<p>So how does the Model and ViewModel relate? Well, there are two key relationships here. First, when a user signs up, we&#8217;ll have to map the SignUp over to a Reader. Second, when we show the user a calendar, we need to get all the Readers for those days, and map the Readers over to Events which the Calendar knows how to show.</p>
<p>Notice the last thing I said there. The <strong>Calendar</strong> knows how to <em>show</em> <strong>Events</strong>, but it doesn&#8217;t know<em><strong> anything</strong></em> about Readers. The implications here allow your system to be truly decoupled and makes it much more maintainable.</p>
<p>So how did I implement this? I&#8217;ll show you on my next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/mental-floss-models-and-viewmodels-and-yes-theyre-different/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOLID Principles: Single responsibility principle</title>
		<link>http://josephbulger.com/programming/solid-principles-single-responsibility-principle/</link>
		<comments>http://josephbulger.com/programming/solid-principles-single-responsibility-principle/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 22:00:33 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[single-responsiblity-principle]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[solid-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=738</guid>
		<description><![CDATA[I saved Single Responsibility Principle (SRP) for last. I think it&#8217;s the most important principle to unhttp://josephbulger.com/wp-admin/post.php?post=738&#38;action=edit&#38;message=10derstand and to utilize correctly. I would even go so far as to say it&#8217;s the most important principle to follow. So why is SRP so important? I guess it&#8217;s all in it&#8217;s definition. A class or file should [...]]]></description>
			<content:encoded><![CDATA[<p>I saved <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank">Single Responsibility Principle </a>(SRP) for last. I think it&#8217;s the most important principle to unhttp://josephbulger.com/wp-admin/post.php?post=738&amp;action=edit&amp;message=10derstand and to utilize correctly. I would even go so far as to say it&#8217;s the most important principle to follow.</p>
<p><span id="more-738"></span></p>
<p>So why is SRP so important? I guess it&#8217;s all in it&#8217;s definition. A class or file should only have one reason to change. If it has more than one reason to change, then your code will become brittle and difficult to maintain. The problem with SRP is how difficult it is to follow. SRP feels a lot more like an art than a science at times. You get into situations where you&#8217;re not sure whether or not a class is only doing one thing, and if you need to further abstract away code into separate classes.</p>
<p>As a simple example, let&#8217;s say you have a Car that needs to be able to start it&#8217;s Engine</p>
<div id="gist-1208417" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Car</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Start</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Engine</span><span class="p">.</span><span class="n">StartPistons</span><span class="p">();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Engine</span><span class="p">.</span><span class="n">InjectOxygen</span><span class="p">();</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Engine</span><span class="p">.</span><span class="n">InjectFuel</span><span class="p">();</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC9'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1208417/9a67b0b67c16dc622a9120513a9df78067b99ef3/BadCar.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1208417#file_bad_car.cs" style="float:right;margin-right:10px;color:#666">BadCar.cs</a>
            <a href="https://gist.github.com/1208417">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This Car knows <em><strong>way</strong></em> too much about it&#8217;s Engine. If the Engine&#8217;s starting sequence ever needs to be changed, you have to actually go into the Car class to change it! That just doesn&#8217;t make any sense. What we should be doing instead is abstracting away that functionality inside the Engine class and allowing the Car to simply start the Engine when it needs to.</p>
<div id="gist-1208417" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Engine</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Start</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">StartPistons</span><span class="p">();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">InjectOxygen</span><span class="p">();</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">InjectFuel</span><span class="p">();</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC9'>&nbsp;</div><div class='line' id='LC10'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">void</span> <span class="nf">StartPistons</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span></div><div class='line' id='LC11'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">void</span> <span class="nf">InjectOxygen</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="k">private</span> <span class="k">void</span> <span class="nf">InjectFuel</span><span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span></div><div class='line' id='LC13'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1208417/29c0dac2fd196bb63e6f2a9c8ac4e2c93726101a/Engine.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1208417#file_engine.cs" style="float:right;margin-right:10px;color:#666">Engine.cs</a>
            <a href="https://gist.github.com/1208417">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This Engine prevents other classes from using it improperly. Part of learning how to effectively use SRP is to identify when you&#8217;re exposing too much of a class. In the previous Engine the Car was calling each function inside the Engine. This better designed Engine hides this functionality from outsiders, so the Car now has no choice but to use only the start method.</p>
<p>The Car now has to look something like this</p>
<div id="gist-1208417" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">class</span> <span class="nc">Car</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">public</span> <span class="k">void</span> <span class="nf">Start</span><span class="p">()</span></div><div class='line' id='LC4'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">Engine</span><span class="p">.</span><span class="n">Start</span><span class="p">();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="p">}</span></div><div class='line' id='LC7'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1208417/60df93e7147fc2d14ef0b8123a2d4a3b56e35fc2/GoodCar.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1208417#file_good_car.cs" style="float:right;margin-right:10px;color:#666">GoodCar.cs</a>
            <a href="https://gist.github.com/1208417">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>This is a class structure that utilizes SRP.</p>
<p>Want more info? <a href="http://www.dimecasts.net/Content/WatchEpisode/88" target="_blank">Check out this dime cast</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/solid-principles-single-responsibility-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

