<?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 &#187; SOLID</title>
	<atom:link href="http://josephbulger.com/tag/solid/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>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>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>
		<item>
		<title>SOLID Principles: Dependency inversion principle</title>
		<link>http://josephbulger.com/programming/solid-principles-dependency-inversion-principle/</link>
		<comments>http://josephbulger.com/programming/solid-principles-dependency-inversion-principle/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 22:00:18 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[dependency-inversion-principle]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[solid-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=725</guid>
		<description><![CDATA[Dependency Inversion Principle has a dramatic effect on your code base. It has the potential to decouple your code in ways that you never would have thought possible before. Using a good IoC container can make all the difference as well. The best way to explain this principle would probably be an example. Let&#8217;s say [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Dependency_inversion_principle" target="_blank">Dependency Inversion Principle</a> has a dramatic effect on your code base. It has the potential to decouple your code in ways that you never would have thought possible before. Using a good IoC container can make all the difference as well.</p>
<p><span id="more-725"></span>The best way to explain this principle would probably be an example.<br />
Let&#8217;s say you have a car like this</p>
<div id="gist-1208366" 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;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Car</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">Engine</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FourCylinderEngine</span><span class="p">();</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="p">}</span>    </div><div class='line' id='LC7'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC8'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">private</span> <span class="n">FourCylinderEngine</span> <span class="n">Engine</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'>&nbsp;&nbsp;&nbsp;&nbsp;</div><div class='line' id='LC10'>&nbsp;&nbsp;&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='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="n">Engine</span><span class="p">.</span><span class="n">Start</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'><span class="p">}</span></div></pre></div>
          </div>

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

<p>Notice the engine that belongs to the car. First of all, the car is actually creating the engine. This means that the car is tightly coupled to the engine it&#8217;s creating. Secondly, this creates a concrete coupling on the car to a specific kind of engine, the FourCylinderEngine.</p>
<p>A better solution would be to use Dependency Inversion. You should depend on an interface instead of a concrete class. Back in our example, our FoudCyclinderEngine looks like this</p>
<div id="gist-1208366" 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">FourCylinderEngine</span> <span class="p">:</span> <span class="n">Engine</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="k">void</span> <span class="nf">Start</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">StartRotatingPistonsOneAndThreeAtPhase</span><span class="p">(</span><span class="m">0.D</span><span class="n">egrees</span><span class="p">);</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">StartRotatingPistonsTwoAndFourAtPhase</span><span class="p">(</span><span class="m">90.D</span><span class="n">egrees</span><span class="p">);</span></div><div class='line' id='LC7'>&nbsp;&nbsp;&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/1208366/2d711572a991853a42b1b497736172eedba957ed/FourCylinderEngine.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1208366#file_four_cylinder_engine.cs" style="float:right;margin-right:10px;color:#666">FourCylinderEngine.cs</a>
            <a href="https://gist.github.com/1208366">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>Notice how it implements Engine. That&#8217;s the interface our Car should be using. There&#8217;s one additional problem, though. Right now the Car is creating it&#8217;s Engine, but you can&#8217;t instantiate an interface, so what do you do? That&#8217;s the key to Dependency Inversion. You&#8217;re saying,</p>
<blockquote><p>a Car does not depend on knowing about how to create an Engine</p></blockquote>
<p>It just <em>uses</em> it. So the new Car class looks like this</p>
<div id="gist-1208366" 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;&nbsp;&nbsp;<span class="k">public</span> <span class="nf">Car</span><span class="p">(</span><span class="n">Engine</span> <span class="n">engine</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">Engine</span> <span class="p">=</span> <span class="n">engine</span><span class="p">;</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">private</span> <span class="n">Engine</span> <span class="n">Engine</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="k">void</span> <span class="nf">Start</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="n">Engine</span><span class="p">.</span><span class="n">Start</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'><span class="p">}</span></div></pre></div>
          </div>

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

<p>So how does the engine get created? Obviously something is passing in the engine to the Car, but what? You need a new class. Maybe a CarManufacturer or something, which is responsible for manufacturing cars. Part of that responsibility would be putting an engine in a car.</p>
<p>Want more info? <a href="http://www.dimecasts.net/Content/WatchEpisode/96" target="_blank">Check out this dime cast</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/solid-principles-dependency-inversion-principle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SOLID Principles: Interface segregation principle</title>
		<link>http://josephbulger.com/programming/solid-principles-interface-segregation-principle/</link>
		<comments>http://josephbulger.com/programming/solid-principles-interface-segregation-principle/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 16:00:26 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[interface-segragation-principle]]></category>
		<category><![CDATA[SOLID]]></category>
		<category><![CDATA[solid-series]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=722</guid>
		<description><![CDATA[Interface Segregation Principle (ISP), focuses on the idea that it&#8217;s better to have many small specific interfaces that define one concept, then to have one big contract that encompasses many concepts in one. I think a prime example of an interface that violates this principle would be MembershipProvider class which is commonly used in ASP.NET [...]]]></description>
			<content:encoded><![CDATA[<p>Interface Segregation Principle (ISP), focuses on the idea that it&#8217;s better to have many small specific interfaces that define one concept, then to have one big contract that encompasses many concepts in one.</p>
<p><span id="more-722"></span>I think a prime example of an interface that violates this principle would be <a href="http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx" target="_blank">MembershipProvider </a>class which is commonly used in ASP.NET applications. Granted, this isn&#8217;t technically an interface (it&#8217;s actually an abstract class), but it demonstrates the principle perfectly. If you&#8217;ve ever tried to make your own custom membership provider, and you&#8217;ve had to implement this beast, you already know the pain involved. There are a ridiculous number of methods involved with this class. There are so many, actually, that the best practice inside many .NET circles has been to simply throw a NotImplementedException for any methods you don&#8217;t want to spend the time implementing.</p>
<p>The solution would be to actually break up this abstract class into many smaller classes, so the developer could extend the parts that needs to be customized, and leave the rest alone.</p>
<p>Want more info? <a href="http://www.dimecasts.net/Content/WatchEpisode/94" target="_blank">Check out this dime cast</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/programming/solid-principles-interface-segregation-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

