<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.3.3" --><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Geek Daily</title>
	<link>http://www.geekdaily.net</link>
	<description>Your source for daily geek news</description>
	<pubDate>Sun, 05 Jul 2009 13:35:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GeekDaily" type="application/rss+xml" /><feedburner:emailServiceId>GeekDaily</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>iPhone Future: Haptic Tactile Feedback, Fingerprint Technology and More!</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/DCgBdGajAmk/</link>
		<comments>http://www.geekdaily.net/2009/07/05/iphone-future-haptic-tactile-feedback-fingerprint-technology-and-more/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 13:34:51 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[Phones]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/07/05/iphone-future-haptic-tactile-feedback-fingerprint-technology-and-more/</guid>
		<description><![CDATA[If you are one of millions who is already in love with the new iPhone 3GS that was launched recently on the electronic market; then hold on to your hats.  iPhones have just begun to scratch the surface when it comes to integrating advanced technology and will be capable of much more in the [...]]]></description>
			<content:encoded><![CDATA[<p>If you are one of millions who is already in love with the new <a href= "http://www.apple.com/iphone/">iPhone 3GS</a> that was launched recently on the electronic market; then <img class="alignright" src="http://www.geekdaily.net/images/iphone3gs.jpg" alt="iPhone 3GS" />hold on to your hats.  iPhones have just begun to scratch the surface when it comes to integrating advanced technology and will be capable of much more in the very near future. From haptic tactile-feedback to fingerprint-controlled operations and business applications, and more!</p>
<p>Although there has not been very much information given to the general public about upcoming features, the very recent <a href="http://www.google.com/search?q=iphone+patent+applications&#038;hl=en&#038;ned=us&#038;tab=nw">patent applications</a> from Apple have provided a strong hint of what the future will hold for your mobile phone. You better believe that these upcoming features are thrilling, and will change the way you look at and use mobile technology. In this post, we consider some future improvements, and what they can do for you.</p>
<p>The most appealing feature for future iPhones has to be the haptic tactile feedback that Apple is hoping to embrace. This is an attempt to simulate the physical keyboard / input panel and is expected to be an essential feature. This will allow the user to be able to sense the <img class="alignleft" src="http://www.geekdaily.net/images/haptic.jpg" alt="Haptic Technolofy" />input panel on the touchscreen while typing or entering information. This will purge the need to for you to look at the screen all the time while typing, and allow you to take care of other business or even use applications while your phone is in your pocket. The <a href=http://en.wikipedia.org/wiki/Haptic_technology>haptic technology</a> makes use of a piezoelectric actuators grid. Piezoelectric materials have the incredible property to be able to generate electricity when pressure is applied across them. In this manner, the touch based input components will provide a tactile feedback in the form of vibrations upon the application via pressure from the fingers during typing or scrolling. Thus, you would actually be able to feel the essence of real buttons even if you are actually working with virtual ones. All in all, haptic technology will enable mobile phone users to realize virtual reality through the sense of touch, which otherwise could only be realized through vision. This sort of interaction through virtual keys is implausible and has never seen before, nor even mentioned.</p>
<p>You have probably already seen a fingerprint sensor for security purposes when it comes to your most expensive gadgets. However, Apple has out thought everyone by expanding the use of fingerprint technology far beyond the more orthodox security purposes. This implies that you could now control your gadgets with your fingerprints only. <img class="alignright" src="http://www.geekdaily.net/images/fingerprint.jpg" alt="Fingerprint Technolofy" />The technicalities involved behind the screen would be as follows. Input sensing mechanisms are used to input the fingerprint signature through sensors and then a command is processed to be associated with that unique fingerprint signature. Accordingly, a database is created to store those signatures and the corresponding command is then associated with those signatures. This database can be modified at a number of different times. Now, when a user fingerprint is detected it is first matched with the samples in the database. If it matches with any of the prototypes in the database then the command associated with that prototype is executed. </p>
<p>To illustrate further, consider you have stored your index fingerprint in the database and associated a command to play the media player. On similar lines your ring finger print is stored with the command to play the media player. Now, if a song is being played on your iPhone and you place your index finger on the detector, the song will pause. To resume play you would simply place your ring finger on the detector. Hence, future iPhones are really going to out think and outmaneuver the current expectations of the electronic market.</p>
<p><img class="alignleft" src="http://www.geekdaily.net/images/rfid.jpg" alt="RFID with iPhone" />Another expected feature in upcoming iPhones is the <a href= http://www.tutorial-reports.com/wireless/rfid/introduction.php >Radio Frequency Identification (RIFD)</a> reader. There will also be tags which will be intended for providing several business applications to iPhone users (such as tracking library books etc.). Apple has been able to incorporate the RIFD circuitry into the touch sensor panel (it now also acts like a RIFD transponder) which has eradicated the requirement of extra space for the antenna. This has enabled Apple to integrate the iPhone with RIFD technology. </p>
<p>With such advancements, who knows what&#8217;s next! So, sit back, relax and get excited about the future iPhone. Maybe one day your iPhone will be able to do your laundry or wash your car. Hey, everyone can dream right?</p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/DCgBdGajAmk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/07/05/iphone-future-haptic-tactile-feedback-fingerprint-technology-and-more/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/07/05/iphone-future-haptic-tactile-feedback-fingerprint-technology-and-more/</feedburner:origLink></item>
		<item>
		<title>Geek Daily’s New Technology Forum</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/6LaZc2nS7qQ/</link>
		<comments>http://www.geekdaily.net/2009/07/01/geek-daily%e2%80%99s-new-technology-forum/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 01:45:24 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[Fun]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/07/01/geek-daily%e2%80%99s-new-technology-forum/</guid>
		<description><![CDATA[We’ve just installed a new technology forum on Geek Daily. The new forum will cover all aspects of technology, from PC hardware to gadgets and electronic equipment. At the moment the forum is a little sparse – will it is new!
We have the following broad categories:
Hardware
Software
Gadgets and Electronics
Product Reviews
YouTube Videos
We will add more as the [...]]]></description>
			<content:encoded><![CDATA[<p>We’ve just installed a new <a href="http://www.geekdaily.net/forums/">technology forum</a> on Geek Daily. The new forum will cover all aspects of technology, from PC hardware to gadgets and electronic equipment. At the moment the forum is a little sparse – will it is new!</p>
<p>We have the following broad categories:</p>
<p><a href="http://www.geekdaily.net/forums/hardware/">Hardware</a><br />
<a href="http://www.geekdaily.net/forums/software/">Software</a><br />
<a href="http://www.geekdaily.net/forums/gadgets-electronics/">Gadgets and Electronics</a><br />
<a href="http://www.geekdaily.net/forums/product-reviews/">Product Reviews</a><br />
<a href="http://www.geekdaily.net/forums/youtube-technology-videos/">YouTube Videos</a></p>
<p>We will add more as the forum takes off. But, for now, jump in and ask questions or share your knowledge <img src='http://www.geekdaily.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/6LaZc2nS7qQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/07/01/geek-daily%e2%80%99s-new-technology-forum/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/07/01/geek-daily%e2%80%99s-new-technology-forum/</feedburner:origLink></item>
		<item>
		<title>GridView Plugin For JQuery</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/yR-3B1ytYO8/</link>
		<comments>http://www.geekdaily.net/2009/05/07/gridview-plugin-for-jquery/#comments</comments>
		<pubDate>Thu, 07 May 2009 08:58:14 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[JavaScript/Ajax]]></category>

		<category><![CDATA[XHTML/CSS]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/05/07/gridview-plugin-for-jquery/</guid>
		<description><![CDATA[There are many times when I am writing an application I need to display data in a table. Most of the time a simple HTML table styled with CSS is all that I need but occasionally I want a bit more. Today we&#8217;ll look at designing a plugin for jQuery that will add some advanced [...]]]></description>
			<content:encoded><![CDATA[<p>There are many times when I am writing an application I need to display data in a table. Most of the time a simple HTML table styled with CSS is all that I need but occasionally I want a bit more. Today we&#8217;ll look at designing a plugin for jQuery that will add some advanced features such as row selection and sorting.</p>
<h3>Design Goals</h3>
<p>Starting out we are going to keep this pretty simple and as it progresses we&#8217;ll add more features.</p>
<p>For now we are going to start with a hand coded HTML table and CSS. In a later post we&#8217;ll look at populating the grid from a data source.</p>
<p>In this post today we&#8217;ll apply the CSS to the table but will expand this to a skinning system later on.</p>
<p>We&#8217;ll also be applying the row selection feature today.</p>
<h3>Starting Point</h3>
<p>Let&#8217;s use a simple table as out starting point.</p>
<pre><code>&lt;table cellpadding="0" cellspacing="0" class="easygrid">
    &lt;tr>
        &lt;th>Name&lt;/th>
        &lt;th>Title&lt;/th>
        &lt;th>Age&lt;/th>
    &lt;/tr>
    &lt;tr>
        &lt;td>Bill&lt;/td>
        &lt;td>CEO&lt;/td>
        &lt;td>53&lt;/td>
    &lt;/tr>
    &lt;tr>
        &lt;td>Jason&lt;/td>
        &lt;td>Developer&lt;/td>
        &lt;td>29&lt;/td>
    &lt;/tr>
    &lt;tr>
        &lt;td>Sue&lt;/td>
        &lt;td>Accountant&lt;/td>
        &lt;td>37&lt;/td>
    &lt;/tr>
    &lt;tr>
        &lt;td>Frank&lt;/td>
        &lt;td>HR Manager&lt;/td>
        &lt;td>42&lt;/td>
    &lt;/tr>
    &lt;tr>
        &lt;td>Jill&lt;/td>
        &lt;td>Graphic Artist&lt;/td>
        &lt;td>31&lt;/td>
    &lt;/tr>
&lt;/table></code></pre>
<h3>Basic Style</h3>
<p>Next we will apply some basic CSS to make our grid look nice.</p>
<pre><code>body, table {
     font-family: verdana, arial, sans-serif;
}

table.easygrid {
     font-size: 11px;
     width: 600px;
     border-top: 1px solid #b8b8b8;
     border-left: 1px solid #b8b8b8;
}

table.easygrid th {
     text-align: left;
     padding: 5px;
     background: #424242;
     color: white;
     border-bottom: 1px solid #b8b8b8;
     border-right: 1px solid #b8b8b8;
}

table.easygrid td {
     padding: 5px;
     border-bottom: 1px solid #b8b8b8;
     border-right: 1px solid #b8b8b8;
}

table.easygrid td.alt {
     background: #f6f3f6;
}

table.easygrid td.selected {
     background: navy;
     color: white;
     font-weight: bold;
}</code></pre>
<h3>Building The Plugin</h3>
<p>Here is the basic layout of our plugin. We&#8217;ll look at implementing those functions in a minute.</p>
<p>This is pretty simple so far. We have our default values, we merge the user passed options with the defaults, and then call two methods on each jQuery instance.</p>
<pre><code>(function($) {
     $.fn.easygrid = function(options) {
         var defaults = {
             alternateBackground: true,
             allowRowSelect: true
         };

         options = $.extend(defaults, options);

         return this.each(function(index, table) {
             setAlternateBackground($('tr:odd td', table), options.alternateBackground);
             rowSelection(table, options.allowRowSelect, options.alternateBackground);
         });
     };
})(jQuery)</code></pre>
<p>Here is our setAlternateBackground method. Note we are passing all the odd rows found in the current table.</p>
<pre><code>function setAlternateBackground(rows, alt) {
     if(alt == true) {
         rows.attr('class', this.className + ' alt');
     }
}</code></pre>
<p>This function appends the alt CSS class to each row if alternate row backgrounds is enabled.</p>
<p>The next function adds a click handler to each row to implement the row selection functionality.</p>
<pre><code>function rowSelection(table, allowSelect, alt) {
     if(allowSelect == true) {
         $('tr', table).click(function() {
            //reset all rows
            $('tr', table).each(function() {
                $('td', this).each(function(index, cell) {
                    $(cell).attr('class', cell.className.replace(' selected'));
                });
            });

            //restore alt backgrounds
            setAlternateBackground($('tr:odd td', table), alt);

            //select this row
            $('td', this).attr('class', this.className + ' selected');
        });
    }
}</code></pre>
<p>There is a little more involved with this function. If this feature is enabled we are adding a click handler to all the rows in the table.</p>
<p>First the click handler will clear any selected rows and reapply the alternate background colors. I am not sure why this gets lost.</p>
<p>Then, finally, the row that was clicked is selected by applying the selected CSS class to each cell of the row.</p>
<h3>What&#8217;s Next?</h3>
<p>That is it for this post but we will look at adding sorting to our grid in post in the near future.</p>
<p>Currently the row selection is a bit buggy in Firefox but works fine in IE. I will have the Firefox issues sorted out for the next post. You can check out a demo <a href="/wp-content/uploads/easygrid/index.html">here</a>.</p>
<p>Be sure you don&#8217;t miss out by grabbing the <a href="http://feeds2.feedburner.com/GeekDaily">RSS feed</a>, <a href="http://feedburner.google.com/fb/a/mailverify?uri=GeekDaily&amp;loc=en_US">updates by email</a>, or <a href="http://twitter.com/GeekDaily">following on Twitter</a>.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f05%2f07%2fgridview-plugin-for-jquery%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f05%2f07%2fgridview-plugin-for-jquery%2f" border="0" alt="kick it on DotNetKicks.com" /></a> <a rev="vote-for" href="http://dotnetshoutout.com/GridView-Plugin-For-JQuery"><img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fwww.geekdaily.net%2F2009%2F05%2F07%2Fgridview-plugin-for-jquery%2F" style="border:0px"/></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/yR-3B1ytYO8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/05/07/gridview-plugin-for-jquery/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/05/07/gridview-plugin-for-jquery/</feedburner:origLink></item>
		<item>
		<title>C# Design Patterns - The Visitor Pattern</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/wlvlcz5KW38/</link>
		<comments>http://www.geekdaily.net/2009/04/13/c-design-patterns-the-visitor-pattern/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 09:14:18 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[ASP.Net]]></category>

		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/04/13/c-design-patterns-the-visitor-pattern/</guid>
		<description><![CDATA[What is the visitor pattern?
The visitor design pattern is a way of separating an algorithm from an object structure upon which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. Thus, using the visitor pattern helps conformance with the open/closed principle [...]]]></description>
			<content:encoded><![CDATA[<h3>What is the visitor pattern?</h3>
<p>The visitor design pattern is a way of separating an algorithm from an object structure upon which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. Thus, using the visitor pattern helps conformance with the open/closed principle <em>[<a href="http://en.wikipedia.org/wiki/Visitor_pattern">Wikipedia</a>]</em>.</p>
<h3>Our Requirements</h3>
<p>One principle that I really like is the Open/Closed principle which says that an object should be open to new functionality but closed to structural changes. The visitor pattern helps facilitate this principle by giving us the means to perform operations against an object without changing the objects structure.</p>
<p>Looking back at a previous pattern we wanted to adjust the registration cost for a dog if they had been picked up by the dog catcher. </p>
<h3>Implementing The Visitor</h3>
<p>Supposing we have the implementation for the interface below we could use the visitor pattern to perform our tasks without changing the existing classes. Since we won&#8217;t be changing the existing implementation we don&#8217;t need to worry about breaking existing features. Lets assume that the repository returns 3 infractions for our dog in the code below.</p>
<p><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">internal interface</span> <span style="color: rgb(61, 133, 198);">IDog</span> {</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Name { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Breed { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Address { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; <span style="color: rgb(61, 133, 198);">DateTime</span> RegisterDate { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">int</span> RegistrationCost { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: rgb(61, 133, 198); font-family: Courier New;">ICollection</span><span style="font-family: Courier New;">&lt;</span><span style="color: rgb(61, 133, 198); font-family: Courier New;">Infraction</span><span style="font-family: Courier New;">&gt; Infractions<span style="font-family: Courier New;"> { </span><span style="color: rgb(0, 0, 255); font-family: Courier New;">get</span><span style="font-family: Courier New;">; }</span><br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">void</span> Accept(<span style="color: rgb(61, 133, 198);">IVisitor</span> visitor);<br />
}</p>
<div style="font-family:courier new">
<span style="color: rgb(0, 0, 255);">internal class</span> <span style="color: rgb(61, 133, 198);">Dog</span> : <span style="color: rgb(61, 133, 198);">IDog</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IRepository</span> _repo;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> Dog(<span style="color: rgb(61, 133, 198);">IRepository</span> repo) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _repo = repo;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; RegistrationCost = 25;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">string</span> Name { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">string</span> Breed { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">string</span> Address { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</span><br />
<span style="font-family: Courier New;">&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(61, 133, 198);">DateTime</span> RegisterDate { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">int</span> RegistrationCost { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <br />
</span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp; &nbsp;public</span> </span><span style="color: rgb(61, 133, 198); font-family: Courier New;">ICollection</span><span style="font-family: Courier New;">&lt;</span><span style="color: rgb(61, 133, 198); font-family: Courier New;">Infraction</span><span style="font-family: Courier New;">&gt; Infractions<span style="font-family: Courier New;"> { </span><span style="color: rgb(0, 0, 255); font-family: Courier New;"><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;get</span><span style="font-family: Courier New;"> { <span style="color: rgb(0, 0, 255);">return</span> _repo.GetInfractions(<span style="color: rgb(0, 0, 0);">Id</span>); } <br />
&nbsp;&nbsp; &nbsp;}</p>
<p></span>&nbsp;&nbsp;&nbsp; </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">public</span> </span><span style="font-family: Courier New;"><span style="color: rgb(0, 0, 255);">void</span> Accept(<span style="color: rgb(61, 133, 198);">IVisitor</span> visitor) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; visitor.Visit(this);<br />
&nbsp;&nbsp;&nbsp; }<br />
</span><span style="font-family: Courier New;">}<br />
</span><br />
<span style="color: rgb(0, 0, 255);">internal interface</span> <span style="color: rgb(61, 133, 198);">IVisitor</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">void</span> Visit(<span style="color: rgb(61, 133, 198);">IDog</span> dog)<br />
}</p>
<p><span style="color: rgb(0, 0, 255);">internal class</span> <span style="color: rgb(61, 133, 198);">Visitor</span> : <span style="color: rgb(61, 133, 198);">IVisitor</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> Visitor() { }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public void</span> Visit(<span style="color: rgb(61, 133, 198);">IDog</span> dog) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">var</span> cost = dog.RegistrationCost;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">var</span> infractions = dog.Infractions.Count;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(56, 118, 29);">//increase cost $5 for each infraction</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; dog.RegistrationCost = cost + (infractions * 5);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</div>
<p>So we have our dog class and we have our visitor setup. All we have left to do is execute it.</p>
<div style="font-family:courier new">
<font size="2"><span style="color: blue;">class </span></font><font size="2"><span style="color: rgb(43, 145, 175);">Program</span> {<br />&nbsp;&nbsp; &nbsp;<span style="color: blue;">static void </span>Main() {<br /> &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<span style="color: rgb(43, 145, 175);">IDog<font color="#000000"> dog = <font color="#0000ff">new <font color="#000000"><span style="color: rgb(61, 133, 198);">Dog</span>(<span style="color: rgb(61, 133, 198);">Repository</span>.Create&lt;<span style="color: rgb(61, 133, 198);">IDog</span>&gt;());<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<font color="#3d85c6">IVisitor <font color="#000000">visitor = <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(61, 133, 198);">Visitor</span>();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;dog.Accept(visitor);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Console.WriteLine(dog.RegistrationCost); //=&gt; 40<br /></font></font></font></font></font></span> &nbsp;&nbsp; }<br />}</font></div>
<h3>Conclusion</h3>
<p>So just like the Decorator pattern, with the visitor pattern we can modify our class without changing the classes code. This pattern is more flexible because we can create any number of visitor classes to do just about anything without changing any code.</p>
<p>Be sure to <a href="http://feeds.feedburner.com/GeekDaily">grab the RSS feed</a>, sign up for <a href="http://feedburner.google.com/fb/a/mailverify?uri=GeekDaily&#038;loc=en_US">email updates</a>, or <a href="http://www.twitter.com/GeekDaily">follow me on Twitter</a> to stay up to date and not miss any posts.</p>
<h3>The C# Design Patterns Series</h3>
<p><a title="Part 1 - An Overview" href="http://www.geekdaily.net/2008/12/02/c-design-patterns-an-overview/" id="pcg0">Part 1 - An Overview</a><br />
<a title="The Decorator Pattern" href="http://www.geekdaily.net/2008/12/10/c-design-patterns-the-decorator-pattern/">Part 2 - The Decorator Pattern</a><br />
<a title="The Abstract Factory" href="http://www.geekdaily.net/2009/01/06/c-design-patterns-abstract-factory-pattern/">Part 3 - The Abstract Factory Pattern</a><br />
<a href="http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/">Part 4 - The Observer Pattern</a><br />
<a href="http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern/">Part 5 - The Facade Pattern</a><br />
<a href="http://www.geekdaily.net/2009/04/13/c-design-patterns-the-visitor-pattern/">Part 6 - The Visitor Pattern</a></p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f04%2f13%2fc-design-patterns-the-visitor-pattern%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f04%2f13%2fc-design-patterns-the-visitor-pattern%2f" border="0" alt="kick it on DotNetKicks.com" /></a> <a rev="vote-for" href="http://dotnetshoutout.com/Geek-Daily-C-Design-Patterns-The-Visitor-Pattern"><img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fwww.geekdaily.net%2F2009%2F04%2F13%2Fc-design-patterns-the-visitor-pattern%2F" style="border:0px"/></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/wlvlcz5KW38" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/04/13/c-design-patterns-the-visitor-pattern/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/04/13/c-design-patterns-the-visitor-pattern/</feedburner:origLink></item>
		<item>
		<title>6 Tools To Be An Effective Web Developer</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/Xa_9fzYPSeQ/</link>
		<comments>http://www.geekdaily.net/2009/03/26/6-tools-to-be-an-effective-web-developer/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 09:06:55 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[ASP.Net]]></category>

		<category><![CDATA[JavaScript/Ajax]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Ruby/Rails]]></category>

		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/03/26/6-tools-to-be-an-effective-web-developer/</guid>
		<description><![CDATA[Over the last few years Rails has helped Ruby&#8217;s popularity explode. One of the biggest reasons for this is the time that Rails can save you. By working within a well defined framework a lot of development decisions are simplified and it is easier to be more organized. Throw in some great tools like ORM, [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few years Rails has helped Ruby&#8217;s popularity explode. One of the biggest reasons for this is the time that Rails can save you. By working within a well defined framework a lot of development decisions are simplified and it is easier to be more organized. Throw in some great tools like ORM, Unit Testing, Mocking, and more and you have a powerhouse of developer efficiency and quality.</p>
<p>There has always been and probably always will be feuds over what is the best platform but what I want to show you is that those arguments are mostly irrelevant. Regardless of what platform you choose to develop on there are most of the same tools available in one form or another. The common components, for me anyway, that help me produce high quality code faster and is easier to maintain are a good IDE, easy to use unit testing and mocking frameworks, an ORM, a MVC framework, and a good JavaScript library.</p>
<p>I am a .Net developer by trade and a PHP developer sometimes by choice. I enjoy both environments for different reasons. I am going to talk about each of these components in a bit of detail and explain why I think they are important and then at the end of the article I will provide a list of each of these components for various languages (.Net, Java, PHP, Python, and Ruby). I have decided to only list free or open source tools because they are easy for someone to try out and we all like to save a few bucks.</p>
<h3>The Integrated Development Environment (IDE)</h3>
<p>To me this is the prime essential. Sure you can program in Notepad and compile with the command line but it will likely take longer and it will require more discipline to stay organized. With a good IDE you have easy project management (all you files grouped together with tabbed browsing), syntax highlighting, compilation (if applicable), and auto complete.</p>
<p>IDE are continuously getting more and more sophisticated and plugins allow for lots more functionality like svn and git management in the IDE.</p>
<p>For me my favorite IDE is Visual Studio. There are some other great programs out there like NetBeans and Eclipse but for whatever reason I have become partial to Visual Studio.</p>
<h3>Unit Testing And Mocking</h3>
<p>These two items go hand in hand. No application is complete without proper testing. There are plenty of people on both sides of the fence when it comes to testing. I know, I was a skeptic for a along time. It just felt weird to spend time writing code to test the real code I was going to write. Finally I just decided to give it a try and it has changed the way I program. When you are focusing on how to test your code you just write cleaner code and it&#8217;s nice to have a quick way to know if the change you just made broke anything.</p>
<h3>Object Relational Mapper</h3>
<p>If you have ever used an ORM you know that it can save you a huge amount of time. One of the concerns I had before jumping to an ORM was performance. I wanted to know if using an ORM would make my application slower but I was asking the wrong question. I should have been asking whether or not the small performance hit was worth the huge time savings. The answer to that is a definite YES! Rarely in an application will the ORM be the source of poor performance and if it is it can be refactored to improve or you can use straight SQL if need be.</p>
<p>It all comes down to not worrying about performance issues before you have any. Yes it is important to keep performance in mind but using an ORM shouldn&#8217;t be anything to worry about.</p>
<h3>MVC Framework</h3>
<p>MVC has become very popular thanks in part to Rails and it&#8217;s revolution in the way we do Web Development. The key component to it&#8217;s popularity is that it separates the different concerns of your application into seperate pieces. This separation allows easier testing, better design, and makes your application more maintainable overall.</p>
<h3>JavaScript Library</h3>
<p>It seems there is a JavaScript library for just about everything these days. I remember not too long ago there were that many and JavaScript use hadn&#8217;t exploded yet. A JavaScript library is important to your productivity. The library shouldn&#8217;t compensate for poor JavaScript skills, you need a solid foundation, but should compliment a good understanding of it. The library will take care of browser compatibility issues and low level operations letting you focus on getting the job done.</p>
<p><strong>ASP.Net</strong><br />
IDE: <a href="http://www.microsoft.com/Express/">Visual Studio 2008 Express</a><br />
Unit Testing: <a href="http://nunit.com/">NUnit</a><br />
Mocking: <a href="http://ayende.com/projects/rhino-mocks.aspx">Rhino Mocks</a><br />
ORM: <a href="http://www.hibernate.org/343.html">NHibernate</a><br />
MVC: <a href="http://www.asp.net/mvc/">ASP.NET MVC</a><br />
JavaScript: <a href="http://jquery.com/">jQuery</a></p>
<p><strong>Java</strong><br />
IDE: <a href="http://www.netbeans.org/">NetBeans</a><br />
Unit Testing: <a href="http://www.junit.org/">JUnit</a><br />
Mocking: <a href="http://easymock.org/">EasyMock</a><br />
ORM: <a href="http://www.hibernate.org/">Hibernate</a><br />
MVC: <a href="http://struts.apache.org/">Struts</a><br />
JavaScript: <a href="http://jquery.com/">jQuery</a></p>
<p><strong>PHP</strong><br />
IDE: <a href="http://www.phpeclipse.com/">PHPEclipse</a><br />
Unit Testing: <a href="http://www.phpunit.de/">PHPUnit</a><br />
Mocking: <a href="http://code.google.com/p/phpmock/">PHPMock</a><br />
ORM: <a href="http://propel.phpdb.org/trac/">Propel</a><br />
MVC: <a href="http://www.symfony-project.org/">Symfony</a><br />
JavaScript: <a href="http://jquery.com/">jQuery</a></p>
<p><strong>Python</strong><br />
IDE: <a href="http://pydev.sourceforge.net/">PyDev</a><br />
Unit Testing: <a href="http://pyunit.sourceforge.net/">PyUnit</a><br />
Mocking: <a href="http://python-mock.sourceforge.net/">PythonMock</a><br />
ORM: <a href="http://www.sqlobject.org/">SQLObject</a><br />
MVC: <a href="http://www.djangoproject.com/">Django</a><br />
JavaScript: <a href="http://jquery.com/">jQuery</a></p>
<p><strong>Ruby</strong><br />
IDE: <a href="http://www.aptana.com/rails">RadRails</a><br />
Unit Testing: <a href="http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html">Test::Unit</a><br />
Mocking: <a href="http://www.testingreflections.com/node/view/4097">Mocha</a><br />
ORM: <a href="http://sequel.rubyforge.org/">Sequel</a><br />
MVC: <a href="http://rubyonrails.org/">Rails</a><br />
JavaScript: <a href="http://jquery.com/">jQuery</a></p>
<p>Be sure to <a href="http://feeds.feedburner.com/GeekDaily">grab the RSS feed</a>, get <a href="http://feedburner.google.com/fb/a/mailverify?uri=GeekDaily&#038;loc=en_US">updates by email</a>, or <a href="http://www.twitter.com/GeekDaily">follow me on Twitter</a> to stay up to date and not miss any posts.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f03%2f26%2f6-tools-to-be-an-effective-web-developer%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f03%2f26%2f6-tools-to-be-an-effective-web-developer%2f" border="0" alt="kick it on DotNetKicks.com" /></a> <a rev="vote-for" href="http://dotnetshoutout.com/Geek-Daily-6-Tools-To-Be-An-Effective-Web-Developer"><img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fwww.geekdaily.net%2F2009%2F03%2F26%2F6-tools-to-be-an-effective-web-developer%2F" style="border:0px"/></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/Xa_9fzYPSeQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/03/26/6-tools-to-be-an-effective-web-developer/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/03/26/6-tools-to-be-an-effective-web-developer/</feedburner:origLink></item>
		<item>
		<title>C# Design Patterns - The Facade Pattern</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/bl-w8Iujbrg/</link>
		<comments>http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 15:41:16 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[ASP.Net]]></category>

		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern/</guid>
		<description><![CDATA[Today I am back with another design pattern. In this post we&#8217;ll be exploring the Facade pattern.
What Is The Facade Pattern
The facade pattern is a higher level interface that simplifies and brings together multiple interfaces of a subsystem. What this means is if you want to do something but that requires interacting with multiple subsystems [...]]]></description>
			<content:encoded><![CDATA[<p>Today I am back with another design pattern. In this post we&#8217;ll be exploring the Facade pattern.</p>
<h3>What Is The Facade Pattern</h3>
<p>The facade pattern is a higher level interface that simplifies and brings together multiple interfaces of a subsystem. What this means is if you want to do something but that requires interacting with multiple subsystems you can create a facade that same only a few methods that handle all the interaction with the subsystem.</p>
<h3>Our Application Requirements</h3>
<p>In our city dog registration application lets assume there are a few things that need to be done when a new dog is registered. First the new dog and it&#8217;s owners must be entered into the system. Next the registration fee must be processed. Finally, we want the system to send the owners the welcome email.</p>
<p>This is a very simple example but this action requires 3 separate systems to do something in order to complete this one task of registering a new dog.</p>
<h3>Using The Facade Pattern</h3>
<p>For the sake of simplicity and not cluttering this post with too much code, I am not going to provide code for the sub systems, just the facade.</p>
<pre>
<div>
<span style="color: rgb(0, 0, 255);">public class</span> <span style="color: rgb(61, 133, 198);">RegistrationManager</span> : <span style="color: rgb(61, 133, 198);">IRegister</span> {
    <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IAccountingService</span> _accounting;
    <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IMessageService</span> _messaging;
    <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IRepository</span> = _repository;
</div>
<div>    <span style="color: rgb(0, 0, 255);">public</span> RegistrationManager(<span style="color: rgb(61, 133, 198);">IAccountService</span> accounting, <span style="color: rgb(61, 133, 198);">IMessagingService</span> messaging, <span style="color: rgb(61, 133, 198);">IRepository</span> repository) {
        _accounting = accounting;
        _messaging = messaging;
        _repository = repository;
    }
</div>
<div>    <span style="color: rgb(0, 0, 255);">public void</span> RegisterDog(<span style="color: rgb(61, 133, 198);">IDog</span> dog) {
        _repository.AddDog(dog);
        _accounting.ProcessPayment(dog.PaymentOrder);
        _messaging.SendWelcome(dog.Owners.Find(x => x.PrimaryContact))
    }
}</div>
</pre>
<p>As you can see this is a very simple example but it illustrates the concept of the pattern. We have taken 3 tasks, each belonging to a different sub system, and combined them into 1 task in a facade class, in this case the RegistrationManager class.</p>
<p>The RegisterDog method adds the new dog to the repository, sends the payment order to the accounting system, and sends a welcome message to the dogs owners that are flagged as primary contacts.</p>
<h3>Summing It Up</h3>
<p>I hope this post helps you understand the Facade pattern and I hope you are continuing to learn and have fun with this series.</p>
<p>Be sure to <a href="http://feeds.feedburner.com/GeekDaily">grab the RSS feed</a> or <a href="http://www.twitter.com/GeekDaily">follow me on Twitter</a> to stay up to date and not miss any posts.</p>
<h3>The C# Design Patterns Series</h3>
<p><a title="Part 1 - An Overview" href="http://www.geekdaily.net/2008/12/02/c-design-patterns-an-overview/" id="pcg0">Part 1 - An Overview</a><br />
<a title="The Decorator Pattern" href="http://www.geekdaily.net/2008/12/10/c-design-patterns-the-decorator-pattern/">Part 2 - The Decorator Pattern</a><br />
<a title="The Abstract Factory" href="http://www.geekdaily.net/2009/01/06/c-design-patterns-abstract-factory-pattern/">Part 3 - The Abstract Factory Pattern</a><br />
<a href="http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/">Part 4 - The Observer Pattern</a><br />
<a href="http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern//">Part 5 - The Facade Pattern</a></p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f03%2f09%2fc-design-patterns-the-facade-pattern%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f03%2f09%2fc-design-patterns-the-facade-pattern%2f" border="0" alt="kick it on DotNetKicks.com" /></a> <a rev="vote-for" href="http://dotnetshoutout.com/C-Design-Patterns-The-Facade-Pattern"><img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fwww.geekdaily.net%2F2009%2F03%2F09%2Fc-design-patterns-the-facade-pattern%2F" style="border:0px"/></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/bl-w8Iujbrg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/03/09/c-design-patterns-the-facade-pattern/</feedburner:origLink></item>
		<item>
		<title>Why You Want To Be A Craftsman Instead Of A Cowboy</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/9j3FTCwloDs/</link>
		<comments>http://www.geekdaily.net/2009/02/27/why-you-want-to-be-a-craftsman-instead-of-a-cowboy/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 18:10:44 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/02/27/why-you-want-to-be-a-craftsman-instead-of-a-cowboy/</guid>
		<description><![CDATA[There has been a bit of a code war going on or at least a some what heated debate on code quality and programming principles. 
I&#8217;m not going to rehash everything but I will sum up the two sides and throw my opinion into the ring. Why does my opinion matter? I&#8217;m not so sure [...]]]></description>
			<content:encoded><![CDATA[<p>There has been a bit of a code war going on or at least a some what heated debate on code quality and programming principles. </p>
<p>I&#8217;m not going to rehash everything but I will sum up the two sides and throw my opinion into the ring. Why does my opinion matter? I&#8217;m not so sure that it does but you can be the judge of that. What I do think is different about my opinion than the opinions that I have heard/read so far is that I can&#8217;t place myself in either camp. I am not a coding cowboy that just cares that &#8220;it works&#8221; and I am not a bureaucratic standards Nazi either. I&#8217;ll talk a bit more about why I am ducking for cover in no man&#8217;s land in this battle of opinions. </p>
<h3>The Coding Cowboys Say</h3>
<p>Jeff Atwood and Joel Spolsky sure hit a sore spot when they suggested that learning programming principles just wasn&#8217;t worth it and just getting it done was more important. </p>
<p>Jeff <a href="http://www.codinghorror.com/blog/archives/001225.html">likened principles and guidelines to the Ferengi</a> and their 285 Rules of Acquisition saying that every situation in programming cannot be governed by a set of rules and there isn&#8217;t a one size fits all pattern to solve everything. </p>
<p>Joel <a href="http://www.joelonsoftware.com/items/2009/01/31.html">refers to the SOLID principles</a> as &#8220;extremely bureaucratic programming that came from the mind of somebody that has not written a lot of code.&#8221; </p>
<h3>The Craftsmen Say</h3>
<p>Jeff and Joel&#8217;s comments sparked a lot of rebuttals from the ALT.Net community. It is understandable since those comments attack the very foundation of TDD and DDD. I am not going to bore you with a list of everyone that chimed in but I want to highlight a post that I think sums up this position in a clear and nice way. </p>
<p>Justin Etheredge made a <a href="http://www.codethinked.com/post/2009/02/11/Today-Ive-Realized-How-Far-We-Have-To-Go.aspx">great post</a> is response to the criticisms. I have been reading Justin&#8217;s blog for a while and I like the way he views software. He likens software development to carpentry and woodworking, both are a learned craft. You don&#8217;t get good a carpentry by throwing things together and ignoring building codes. Patterns and principles are like building codes. </p>
<h3>My View On The Whole Thing</h3>
<p>I was a bit surprised at first to hear Jeff and Joel&#8217;s comments because they are some smart guys that have produced some successful software. I highly doubt, regardless of how it came across, they intended to imply that you should ignore all guidelines and just string together your code. Unfortunately, the comments of their posts make it all too clear that this is exactly the way a lot of programmers took it. What&#8217;s worse is bad programmers will use this as a defense for their resistance to improving their skills. </p>
<p>Like I said, currently I am somewhere in no man&#8217;s land. For too long I had the mindset that would take Jeff and Joel&#8217;s comments and use them as an excuse to ignore patterns and principles. From the beginning of my education in software development, no importance was placed on &#8220;good design.&#8221; My college training only focuses on teaching the syntax and considering that &#8220;knowing&#8221; the language. </p>
<p>After a few years of living in denial, I had to accept that their was far more for me to learn and I began my journey out of the cowboy coding camp and started striving to develop software in a TDD manner. I still have a lot to learn but facts cannot be ignored. Since making an effort to improve my craft I have seen a significant drop in the amount of bugs found in new software I am producing and the bugs that are found are smaller and much similar to solve. So that is my take on the whole thing and I hope that this at least peaks someone&#8217;s interest to dig a little deeper in regard to becoming a craftsmen and taking pride in the code they produce.</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f02%2f27%2fwhy-you-want-to-be-a-craftsman-instead-of-a-cowboy%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f02%2f27%2fwhy-you-want-to-be-a-craftsman-instead-of-a-cowboy%2f" border="0" alt="kick it on DotNetKicks.com" /></a> <a rev="vote-for" href="http://dotnetshoutout.com/Why-You-Want-To-Be-A-Craftsman-Instead-Of-A-Cowboy"><img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fwww.geekdaily.net%2F2009%2F02%2F27%2Fwhy-you-want-to-be-a-craftsman-instead-of-a-cowboy%2F" style="border:0px"/></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/9j3FTCwloDs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/02/27/why-you-want-to-be-a-craftsman-instead-of-a-cowboy/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/02/27/why-you-want-to-be-a-craftsman-instead-of-a-cowboy/</feedburner:origLink></item>
		<item>
		<title>Why Being A Freelance Consultant Makes Sense</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/0yRh4GqT2Vo/</link>
		<comments>http://www.geekdaily.net/2009/02/11/why-being-a-freelance-consultant-makes-sense/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 16:22:19 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[News]]></category>

		<category><![CDATA[freelance]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/02/11/why-being-a-freelance-consultant-makes-sense/</guid>
		<description><![CDATA[It can be depressing reading the news these days. Everyday, it seems, more companies are announcing layoffs and more people are out of work. IBM even annocunced recently that they are offering to move laidoff workers to India, China, and Brazil to fill market demands. AKA they laid you off to outsource your job to [...]]]></description>
			<content:encoded><![CDATA[<p>It can be depressing reading the news these days. Everyday, it seems, more companies are announcing layoffs and more people are out of work. IBM even annocunced recently that they are <a href="http://www.informationweek.com/news/management/outsourcing/showArticle.jhtml?articleID=213000389" target="_blank">offering to move laidoff workers to India, China, and Brazil</a> to fill market demands. AKA they laid you off to outsource your job to cheaper countries. The moved workers will expect to receive salaries comparable with that of local workers. Ouch!</p>
<p>With the idea of job security pretty much non-existant, what can you do to help insulate yourself from these tough economic times? </p>
<p>Now is a perfect time to work for yourself as a freelance consultant. Yes it is! Here is why.</p>
<h3>3 Reasons You Should Consider Becoming A Freelance Consultant</h3>
<p><strong>1.</strong> Even though companies are laying people off, the jobs still need to get done. Big companies may outsource to other countries but small to medium businesses will likely look to local consultants to fill the gaps they can&#8217;t afford to fill with full-time employees.</p>
<p><strong>2.</strong> Your costs are relatively low. The costs to strike out on your own are pretty low. You can arm yourself with free and open source software to fill almost all your operational needs. I will do a post later on starting up a business using open source and free software. Health care will likely be your biggest expense.</p>
<p><strong>3.</strong> Your time is your own. Imagine walking to the hardware store, eating lunch with your significant other, or playing soccer with your kids in the middle of the day! Well, as a freelancer you can do that. You set your work hours and you decide how much you need/want to work.</p>
<p>If you have been recently laid off or are frustrated with or feel trapped in your current job maybe making the jump to being a freelance consultant is something you should consider.</p>
<p>This is an area that I&#8217;ll expand on in future posts so make sure you grab the <a href="http://feeds.feedburner.com/GeekDaily">RSS feed</a> or <a href="http://www.twitter.com/GeekDaily">follow me on Twitter</a>.</p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/0yRh4GqT2Vo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/02/11/why-being-a-freelance-consultant-makes-sense/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/02/11/why-being-a-freelance-consultant-makes-sense/</feedburner:origLink></item>
		<item>
		<title>How Does Getting Free Stuff Sound?</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/Yy6qcCahVxY/</link>
		<comments>http://www.geekdaily.net/2009/02/06/how-does-getting-free-stuff-sound/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 18:53:31 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/02/06/how-does-getting-free-stuff-sound/</guid>
		<description><![CDATA[Lately I have been enjoying the Design Pattern series and my posts on becoming a bad developer and decreasing performance have been popular. I entend to expand on these areas meaning you will see more posts on programming principles and best practices some of which will take the more sarcastic and negative side to make [...]]]></description>
			<content:encoded><![CDATA[<p>Lately I have been enjoying the Design Pattern series and my posts on becoming a bad developer and decreasing performance have been popular. I entend to expand on these areas meaning you will see more posts on programming principles and best practices some of which will take the more sarcastic and negative side to make the point. In addition to these I plan to try out a new kind of post. This will not be that frequent but I think it will be useful to you.</p>
<h3>The Proposal</h3>
<p>Occasionally I am going to review a book or service that is relevant to programming, running a website, running your own business, or technology in general. You can take a look at the <a href="http://geekdaily.tradepub.com" target="_blank">list of products I will be choosing from here</a>. There will also be a few hanging around on the right side bar as well.</p>
<h3>How To Get It Free</h3>
<p>The best part of these reviews is that you will easily be able to <strong>get these books and services for free</strong>. That&#8217;s right. These will not be paid reviews so they are my honest opinions. I will have personally used these products so I won&#8217;t promote anything that is crap and that I wouldn&#8217;t use myself.</p>
<p>In the interest of full disclosure, I do get paid for qualified leads. Meaning, if you decide you want to give the service or book a try, you fill out a small form before you receive the product. If you qualify, I get paid a couple bucks.</p>
<p>I hope that you will find these reviews useful.</p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/Yy6qcCahVxY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/02/06/how-does-getting-free-stuff-sound/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/02/06/how-does-getting-free-stuff-sound/</feedburner:origLink></item>
		<item>
		<title>C# Design Patterns - Observer Pattern</title>
		<link>http://feedproxy.google.com/~r/GeekDaily/~3/7yEMzfnIpvs/</link>
		<comments>http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 20:04:54 +0000</pubDate>
		<dc:creator>Justin</dc:creator>
		
		<category><![CDATA[ASP.Net]]></category>

		<category><![CDATA[Software Design]]></category>

		<guid isPermaLink="false">http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/</guid>
		<description><![CDATA[We&#8217;ve covered a couple of design patterns so far in our series. I have been enjoying writing these posts and I hope you have enjoyed reading them or at least got something out of them
In this post we are going to take a look at the Observer pattern.
What Is The Observer Pattern?
The Observer pattern is [...]]]></description>
			<content:encoded><![CDATA[<p><span>We&#8217;ve covered a couple of design patterns so far in our series. I have been enjoying writing these posts and I hope you have enjoyed reading them or at least got something out of them</span></p>
<p><span>In this post we are going to take a look at the Observer pattern.</span></p>
<h3>What Is The Observer Pattern?</h3>
<p><span>The Observer pattern is a way for an object to notify all of it&#8217;s dependants when something changes based on a one to many relationship.</span></p>
<h3>The Situation</h3>
<p><span>Continuing to use our city dog registration software senario, one of the project&#8217;s requirements is that the dog&#8217;s owner&#8217;s be notified whenever a dog is processed for an infraction (i.e. picked up by the dog catcher). The Observer pattern is perfectly suited to solve this problem.</span></p>
<h3><span>Setting Up Our Observer</span></h3>
<p><span>First before we create our Observer we need to define some classes and interfaces that we will need to use with the Observer.</p>
<div style="font-family:courier new,monospace">
</span><font style=" color: rgb(0, 0, 255);">public interface</font> <span style="color: rgb(61, 133, 198);">IInfraction</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Type { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(61, 133, 198);">DateTime</span> Date { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Reason { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">double</span> Fee { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
}</p>
<p><span style="color: rgb(0, 0, 255);">public class</span> <span style="color: rgb(61, 133, 198);">Infraction</span> : <span style="color: rgb(61, 133, 198);">IInfraction</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> <span style="color: rgb(0, 0, 255);">string</span> Type { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(61, 133, 198);">DateTime</span> Date { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Reason { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">double</span> Fee { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
}</p>
<p><span style="color: rgb(0, 0, 255);">public interface</span> <span style="color: rgb(61, 133, 198);">IOwner</span> {<br />
<span style="color: rgb(0, 0, 255);">&nbsp;&nbsp; &nbsp;int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> FirstName { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> LastName { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> EmailAddress { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
}</p>
<p><span style="color: rgb(0, 0, 255);">public class</span> <span style="color: rgb(61, 133, 198);">Owner</span> : <span style="color: rgb(61, 133, 198);">IOwner</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> Owner() { }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public string</span> FirstName { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public string</span> LastName { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public string</span> EmailAddress { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }</div>
<p>
}</p>
<p>The above code defines an infraction and an owner for our Observer to use. Now we can setup our Observer and the notifications when a dog gets an infraction.</p>
<div style="font-family:courier new,monospace">
<font><span style="color: rgb(0, 0, 255);">public interface</span> <span style="color: rgb(61, 133, 198);">IDog</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> Name { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">void</span> AddInfraction(<span style="color: rgb(61, 133, 198);">IInfraction</span> infraction);<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">void</span> AddOwner(<span style="color: rgb(61, 133, 198);">IOwner</span> owner);<br />
}</p>
<p><span style="color: rgb(0, 0, 255);">public class</span> <span style="color: rgb(61, 133, 198);">Dog</span> : <span style="color: rgb(61, 133, 198);">IDog</span> {<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IList</span>&lt;<span style="color: rgb(61, 133, 198);">IOwner</span>&gt; _owners;<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">private</span> <span style="color: rgb(61, 133, 198);">IList</span>&lt;<span style="color: rgb(61, 133, 198);">IInfraction</span>&gt; _infractions;</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public</span> Dog() { <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _owners = <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(61, 133, 198);">List</span>&lt;<span style="color: rgb(61, 133, 198);">Owner</span>&gt;();<br />
</font><font>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _infractions = <span style="color: rgb(0, 0, 255);">new</span> <span style="color: rgb(61, 133, 198);">List</span>&lt;<span style="color: rgb(61, 133, 198);">Infraction</span>&gt;();</font><br />
<font>&nbsp;&nbsp; &nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public void</span> AddOwner(<span style="color: rgb(61, 133, 198);">IOwner</span> owner) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _owners.Add(owner);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public void</span> AddInfraction(<span style="color: rgb(61, 133, 198);">IInfraction</span> infraction) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; _infractions.Add(infraction);</p>
<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<span style="color: rgb(56, 118, 29);">//notify owners of infraction : the Observer</span><br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">foreach</span>(<span style="color: rgb(61, 133, 198);">IOwner</span> owner <span style="color: rgb(0, 0, 255);">in</span> _owners) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">string</span> message = <span style="color: rgb(204, 0, 0);">&#8220;Dear &#8221; + owner.FirstName + &#8220;,\n\n&#8221;</span> +<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 0, 0);">&#8220;We are writing you to inform you that there has been an incident with your dog, &#8220;</span> +<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<span style="color: rgb(0, 0, 255);">this</span>.Name + <span style="color: rgb(204, 0, 0);">&#8220;, and that the city had to get involved.\n\n&#8221;</span> +<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<span style="color: rgb(204, 0, 0);">&#8220;Your dog is being held at the city dog pound for the following reason: &#8220;</span> + infraction.Reason + <span style="color: rgb(204, 0, 0);">&#8220;.&#8221;</span> +<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(204, 0, 0);">&#8220;You can pick them up anytime. There will be a fee of $&#8221;</span> + infraction.Fee + <span style="color: rgb(204, 0, 0);">&#8221; applied.&#8221;</span>;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(61, 133, 198);">MessageService</span>.SendEmail(owner.EmailAddress, <span style="color: rgb(204, 0, 0);">&#8220;cityhall@fictionalcity.com&#8221;</span>, message);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public int</span> Id { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0, 0, 255);">public string</span> Name { <span style="color: rgb(0, 0, 255);">get</span>; <span style="color: rgb(0, 0, 255);">set</span>; }<br />
}<br />
</font></div>
<p>You can see the this pattern at work in the AddInfraction method. Everytime this method is called an infraction is added to the dog&#8217;s record and all the owners are sent an email detailing the infraction and where to pick up their dog. It&#8217;s nice when you can structure your code to handle situations automatically, for you and your clients.</p>
<p>If you enjoyed this post be sure to <a href="http://feeds.feedburner.com/GeekDaily">grab the RSS feed</a> or <a href="http://www.twitter.com/GeekDaily">follow me on Twitter</a> to get notifications of new posts. Also, check out other posts in this series below.</p>
<h3>The C# Design Patterns Series</h3>
<p><a title="Part 1 - An Overview" href="http://www.geekdaily.net/2008/12/02/c-design-patterns-an-overview/" id="pcg0">Part 1 - An Overview</a><br />
<a title="The Decorator Pattern" href="http://www.geekdaily.net/2008/12/10/c-design-patterns-the-decorator-pattern/">Part 2 - The Decorator Pattern</a><br />
<a title="The Abstract Factory" href="http://www.geekdaily.net/2009/01/06/c-design-patterns-abstract-factory-pattern/">Part 3 - The Abstract Factory Pattern</a><br />
<a href="http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/">Part 4 - The Observer Pattern</a>
</p>
<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f01%2f29%2fc-design-patterns-observer-pattern%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.geekdaily.net%2f2009%2f01%2f29%2fc-design-patterns-observer-pattern%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<img src="http://feeds.feedburner.com/~r/GeekDaily/~4/7yEMzfnIpvs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/feed/</wfw:commentRss>
		<feedburner:origLink>http://www.geekdaily.net/2009/01/29/c-design-patterns-observer-pattern/</feedburner:origLink></item>
	</channel>
</rss>
