<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Patterns</title>
        <link>http://mostlylucid.net/category/18.aspx</link>
        <description>Patterns</description>
        <language>en-US</language>
        <copyright>Scott Galloway</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <item>
            <title>Why do so many people mess up Singletons?</title>
            <link>http://mostlylucid.net/archive/2008/01/27/why-do-so-many-people-mess-up-singletons.aspx</link>
            <description>&lt;p&gt;I've written about this a few times now (use the search thingy to find where) but I'm still surprised how many people mess up the Singleton pattern.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;For instance take:&lt;/p&gt;  &lt;p&gt;if (blogSettingsSingleton == null)   &lt;br /&gt;                {    &lt;br /&gt;                    blogSettingsSingleton = new BlogSettings();    &lt;br /&gt;                }    &lt;br /&gt;                return blogSettingsSingleton;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Looks ok, right? But this is a classic poor pattern when dealing with multi-threaded apps. Why? Look at the initial 'if' statement, and think what happens if multiple treads hit this at the same time...one thread could be in the process of creating this object whilst the others are evaluating the condition...&lt;/p&gt;  &lt;p&gt;If you're using &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;Singletons&lt;/a&gt; PLEASE read &lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;this article&lt;/a&gt;. The singleton pattern article from Wikipedia has the following excellent implementation of a singleton:&lt;/p&gt;  &lt;pre class="code"&gt;/// &amp;lt;summary&amp;gt;
/// Class implements singleton pattern.
/// &amp;lt;/summary&amp;gt;
public class Singleton
{
        // Private constructor to avoid other instantiation
        // This must be present otherwise the compiler provide 
        // a default public constructor
        private Singleton()
        {
        }
 
        /// &amp;lt;summary&amp;gt;
        /// Return an instance of &amp;lt;see cref="Singleton"/&amp;gt;
        /// &amp;lt;/summary&amp;gt;
        public static Singleton Instance
        {
            get
            {
                /// An instance of Singleton wont be created until the very first 
                /// call to the sealed class. This a CLR optimization that ensure that
                /// we have properly lazy-loading singleton. 
                return SingletonCreator.CreatorInstance;
            }
        }
 
        /// &amp;lt;summary&amp;gt;
        /// Sealed class to avoid any heritage from this helper class
        /// &amp;lt;/summary&amp;gt;
        private sealed class SingletonCreator
        {
          // Retrieve a single instance of a Singleton
          private static readonly Singleton _instance = new Singleton();
 
          /// &amp;lt;summary&amp;gt;
          /// Return an instance of the class &amp;lt;see cref="Singleton"/&amp;gt;
          /// &amp;lt;/summary&amp;gt;
          public static Singleton CreatorInstance
          {
            get { return _instance; }
          }
        }
}
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/pre&gt;

&lt;p&gt;This is a lazy-initializing, thread safe singleton...does sacrifice *some* performance (see the &lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;earlier article&lt;/a&gt; for details of this) but it is FAR safer than the original I showed...&lt;/p&gt;

&lt;p&gt;Oh, and one last thing...are you REALLY sure you need a Singleton? One horrible pattern I've seen is code is using Singletons to access database connections...this is VERY RARELY required and sacrifices a lot of the benefits which modern databases offer for concurrent access.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;&lt;font color="#ff0000"&gt;UPDATE:&lt;/font&gt; Umm...realized that I don't explain what a 'Singleton' is...essentially it's a pattern which limits the access of an object to a single caller at a time. Common uses for Singletons could be accessing files on a file-system where you really want to make sure that only one thread has access at one time. Oh, and to make things even more complicated you'd more commonly want to use a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock(VS.71).aspx"&gt;ReaderWriterLock&lt;/a&gt; in this scenario to allow many readers or a single writer...only &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/06/ConcurrentAffairs/"&gt;of course you wouldn't&lt;/a&gt;...told you it was complicated! Oh, and to further complicate matters in VS2008 and above you'd probably want &lt;a href="http://www.bluebytesoftware.com/blog/PermaLink,guid,c4ea3d6d-190a-48f8-a677-44a438d8386b.aspx"&gt;ReaderWriterLockSlim&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1238.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid>http://mostlylucid.net/archive/2008/01/27/why-do-so-many-people-mess-up-singletons.aspx</guid>
            <pubDate>Mon, 28 Jan 2008 00:47:55 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2008/01/27/why-do-so-many-people-mess-up-singletons.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1238.aspx</wfw:commentRss>
        </item>
        <item>
            <title>To struct or not to struct</title>
            <link>http://mostlylucid.net/archive/2007/10/09/to-struct-or-not-to-struct.aspx</link>
            <description>I've been commenting on &lt;a href="http://weblogs.asp.net/bschooley/archive/2007/10/09/asp-net-using-a-struct-to-make-working-with-viewstate-easier.aspx"&gt;this post&lt;/a&gt; by &lt;a href="http://weblogs.asp.net/bschooley/"&gt;Bernal Schooley&lt;/a&gt; on a method using structs to 'simplify' using ViewState. Bernal has had a &lt;a href="http://weblogs.asp.net/bschooley/archive/2007/09/29/asp-net-clean-up-your-use-of-viewstate.aspx"&gt;couple of posts&lt;/a&gt; around ViewState and methods of making it's use simpler. I have to say the comments on the posts are more useful for me that the posts themselves (as is often the way...comments are still on the blog right &lt;img alt="" src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /&gt;). &lt;br /&gt;
One problem I do have is advocating the use of structs for this stuff...now don't get me wrong, I am aware of some advantages around structs; which go away slightly when using Generics as the constant boxing/unboxing no longer happens...There does seem to be a lot of misunderstanding around structs though...they're not always faster!&lt;br /&gt;
Structs are stored on the stack rather than the heap, this makes accessing and using them faster (often &lt;a href="http://blogs.vbcity.com/hotdog/archive/2004/08/11/170.aspx"&gt;dramatically faster&lt;/a&gt;!) . However you have to be aware of the limitations around structs...one biggie is that &lt;a href="http://msdn2.microsoft.com/en-us/library/ah19swz4(VS.71).aspx"&gt;over 16 bytes&lt;/a&gt; you lost a lot of the advantage of this speedup - don't be storing a ton of data in a struct (well, not a ton...over 16 bytes!).&lt;br /&gt;
The other biggie is &lt;a href="http://msdn2.microsoft.com/en-us/library/aa664476(vs.71).aspx"&gt;boxing structs&lt;/a&gt;...again in this case you've flipping them onto the heap rather than the stack...so you lose the 'stack' advantage again...&lt;br /&gt;
So, story is structs can be great but be careful with them...there's a newbie mistake in thinking that structs are these great, lightweight objects you can use however you want...they're not. Unless you can *really* justify using a struct, don't bother! In my entire .NET programming career I used structs maybe 5 times...and for very specific reasons!&lt;img src="http://mostlylucid.net/aggbug/1220.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid>http://mostlylucid.net/archive/2007/10/09/to-struct-or-not-to-struct.aspx</guid>
            <pubDate>Tue, 09 Oct 2007 18:15:47 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2007/10/09/to-struct-or-not-to-struct.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1220.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Playing with .NET Remoting</title>
            <link>http://mostlylucid.net/archive/2005/01/25/playing-with-.net-remoting.aspx</link>
            <description>&lt;p&gt;Recently had the chance to dig into remoting in a bit more detail (for the Bulk Mail app I've mentioned before). I have to say, it's both more difficult and a lot easier than I imagined!&lt;br /&gt;Having to modify my class to allow use from a remoting client was a little wierd; I wanted to use &lt;a href="http://www.devarticles.com/c/a/ASP.NET/Understanding-.NET-Remoting/5/"&gt;SingleCall mode&lt;/a&gt; - with a simple response to keep performance up, unfortunately this has led to quite a radical reworking of my main Engine class (and subsequent bug-fixing...it wasn't that tight in the first place). The actual set up of remoting is however amazingly easy, letting me simple switch from local to remoting versions with a simple bit of config...e.g.&lt;/p&gt;&lt;div style="border: 1pt solid windowtext; padding: 0pt; background: white none repeat scroll 0%; font-size: 8pt; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; color: black; font-family: Verdana;"&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;application&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;client&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;wellknown&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;type&lt;/span&gt;&lt;span style="color: blue;"&gt;="SurgeEngine.EngineFacade, SurgeEngine"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;url&lt;/span&gt;&lt;span style="color: blue;"&gt;="tcp://localhost:9080/SurgeEngine"/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;channels&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;ref&lt;/span&gt;&lt;span style="color: blue;"&gt;="tcp"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;port&lt;/span&gt;&lt;span style="color: blue;"&gt;="0"&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;serverProviders&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;                &lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;formatter&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;ref&lt;/span&gt;&lt;span style="color: blue;"&gt;="binary"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;typeFilterLevel&lt;/span&gt;&lt;span style="color: blue;"&gt;="Full"&lt;/span&gt;&lt;span style="color: fuchsia;"&gt; &lt;/span&gt;&lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;serverProviders&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;                &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;channels&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;client&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;application&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;    &lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;system.runtime.remoting&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Oh, I did use a &lt;a href="http://www.dofactory.com/Patterns/PatternFacade.aspx"&gt;Facade pattern&lt;/a&gt; to help reduce the type and number of changes I had to make to my core engine (specifically to reduce the amount of thread-handling code in the core engine...&lt;/p&gt;&lt;p&gt;One oddity I did come across though was trying to use remoting from an ASP.NET site - which is what this app was doing, acting as a web-service proxy to another remoting server on the same box (simplifies things for non-.NET clients using the app...config etc...). No idea where I found it but this code in my Global.asax.cs helped a lot:&lt;/p&gt;&lt;div style="border: 1pt solid windowtext; padding: 0pt; background: white none repeat scroll 0%; font-size: 8pt; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; color: black; font-family: Verdana;"&gt;&lt;p style="margin: 0px;"&gt;        &lt;span style="color: blue;"&gt;protected&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Application_Start(Object sender, EventArgs e)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            &lt;span style="color: blue;"&gt;string&lt;/span&gt; configFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;            RemotingConfiguration.Configure(configFile);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;        }&lt;/p&gt;&lt;/div&gt;&lt;!--EndFragment--&gt;&lt;p&gt;All this really does is aid the app in identifying the correct config file to use (which is actually tirckier than you'd expect.).&lt;/p&gt;&lt;p&gt;The only other hassle I had was an annoying error related to a change introduced in .NET 1.1 to do with typeFilterLevel - &lt;a href="http://www.codeproject.com/csharp/PathRemotingArticle.asp"&gt;this article sorts it all out...&lt;/a&gt;&lt;!--EndFragment--&gt;&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/990.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blog Author</dc:creator>
            <guid>http://mostlylucid.net/archive/2005/01/25/playing-with-.net-remoting.aspx</guid>
            <pubDate>Tue, 25 Jan 2005 20:02:00 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2005/01/25/playing-with-.net-remoting.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/990.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Patterns and Practices...suck!</title>
            <link>http://mostlylucid.net/archive/2004/07/20/patterns-and-practices.suck.aspx</link>
            <description>&lt;p&gt;I think I've made it pretty clear in the past that I think that one of the weakest areas of the Microsoft 'developer experience' is the &lt;a href="http://www.microsoft.com/resources/practices/default.mspx"&gt;Patterns &amp;amp; Practices area&lt;/a&gt;, don't believe me? OK, try and find an article about the Singleton pattern on the site; hint, don't use the Search feature, it returns a link to the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/CachingBlock.asp"&gt;Caching Application block&lt;/a&gt;  for 'Singleton' and nothing at all for 'Singleton Pattern'! When you do manage to find it (&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/ImpSingletonInCsharp.asp"&gt;here&lt;/a&gt;), you may notice a few things:&lt;/p&gt;&lt;p&gt;1. It doesn't really explain where / why you'd want to use it, here's the 'Context'&lt;/p&gt;&lt;p&gt;&lt;!--StartFragment --&gt; &lt;em&gt;'You are building an application in C#. You need a class that has only one instance, and you need to provide a global point of access to the instance. You want to be sure that your solution is efficient and that it takes advantage of the Microsoft .NET common language runtime features. You may also want to make sure that your solution is thread safe. '&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Which is technically accurate, absolutely...ok, so why would you actually want to use it? Some examples may help here!&lt;/p&gt;&lt;p&gt;2. This really isn't the easiest or even the 'best' implementation - for my money, &lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;this is&lt;/a&gt; - has a lot of versions explaining the benefits / drawbacks of each one.&lt;/p&gt;&lt;p&gt;I've complained about this before, reason I'm doing it again? I was trying to find a decent implementation of a specific pattern, the &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DispatcherView.html"&gt;Dispatcher View&lt;/a&gt; - eventually I went to the &lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html"&gt;Sun Patterns site&lt;/a&gt; and translated from the J2EE version into C#...which is a pain in the ass! I can't find the post at the moment but I read some stuff on someone's blog that the focus had been on the 'professional' developer as opposed to the 'opportunist' on the P&amp;amp;P site...meaning those with formal comp-sci training versus those who chose to become developers after having qualified in a different subject. &lt;br /&gt;Hmm...I don't know if the UK is unusual, but I'd say that of the many developers I've worked with, around 5% have actually been comp-sci graduates - and they haven't been easily identifiable by their skill level. &lt;br /&gt;I find this really annoying, patterns should be the universal language of all developers, sure, the 'Enterprise Developer' will probably rely on patterns more (as the use of patterns can greatly simplify the creation and future understanding of complex enterprise systems) but I really believe that Microsoft have dropped the ball in not pushing patterns more to the general developer community. Sites like &lt;a href="http://www.dofactory.com/Patterns/Patterns.aspx"&gt;DoFactory&lt;/a&gt; do fill in part of the gap but I'm still puzzled by the Patterns agnosia on sites like &lt;a href="http://msdn.microsoft.com/"&gt;MSDN&lt;/a&gt;, even the &lt;a href="http://msdn.microsoft.com/architecture"&gt;Architecture center&lt;/a&gt; barely mentions them...come on, it's like building a house out of raw materials like clay and wood rather than using things like bricks and doors. &lt;/p&gt;&lt;p&gt;Anyway, rant over...&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/899.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blog Author</dc:creator>
            <guid>http://mostlylucid.net/archive/2004/07/20/patterns-and-practices.suck.aspx</guid>
            <pubDate>Tue, 20 Jul 2004 17:42:00 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2004/07/20/patterns-and-practices.suck.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/899.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Interesting site - with a focus on Patterns in .NET</title>
            <link>http://mostlylucid.net/archive/2004/03/10/interesting-site---with-a-focus-on-patterns-in-.net.aspx</link>
            <description>&lt;p&gt;Found this &lt;a href="http://www.ipattern.com/"&gt;site really interesting&lt;/a&gt; from Maxim V. Karpov, basically it's a blog with a focus on the use of design patterns in .NET - which I personally think are currently not widely underused but could provide a huge boost to a whole lot of developers. Maxim recently wrote an article looking at the &lt;a href="http://ipattern.com/simpleblog/CommentView.aspx?entryid=37"&gt;ASP.NET Out Of Process Session State&lt;/a&gt; - which is in itself an implementation of the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/DesInterceptingFilter.asp"&gt;Intercepting Filter pattern&lt;/a&gt;. If you're interested in patterns in .NET you could do a lot worse than look at the &lt;a href="http://www.microsoft.com/resources/practices/"&gt;Microsoft Patterns site&lt;/a&gt; - whilst it isn't perfect (I'd personally like to see a WHOLE lot more example code) it is a great introduction.&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/774.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blog Author</dc:creator>
            <guid>http://mostlylucid.net/archive/2004/03/10/interesting-site---with-a-focus-on-patterns-in-.net.aspx</guid>
            <pubDate>Wed, 10 Mar 2004 21:17:00 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2004/03/10/interesting-site---with-a-focus-on-patterns-in-.net.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/774.aspx</wfw:commentRss>
        </item>
        <item>
            <title>More on Patterns</title>
            <link>http://mostlylucid.net/archive/2003/09/14/more-on-patterns.aspx</link>
            <description>&lt;p&gt;Found &lt;a href="http://www.dofactory.com/Patterns/Patterns.aspx"&gt;this&lt;/a&gt; on the &lt;a href="http://www.furrygoat.com/"&gt;Furrygoat&lt;/a&gt; site, this is a truly excellent site on the &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0201633612/mostlylucid-21"&gt;GoF&lt;/a&gt; design patterns (you'll see this alot, it refers to &lt;a href="http://www.amazon.co.uk/exec/obidos/ASIN/0201633612/mostlylucid-21"&gt;this book&lt;/a&gt; - the original book on design patterns). If you're creating applications in any language, I really recommend you get at least a passing knowledge of what patterns are and how they can be used.&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/556.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Blog Author</dc:creator>
            <guid>http://mostlylucid.net/archive/2003/09/14/more-on-patterns.aspx</guid>
            <pubDate>Sun, 14 Sep 2003 22:20:00 GMT</pubDate>
            <comments>http://mostlylucid.net/archive/2003/09/14/more-on-patterns.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/556.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>