<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8148570280253114288</atom:id><lastBuildDate>Fri, 01 Nov 2024 09:58:40 +0000</lastBuildDate><category>ruby</category><category>rake</category><category>TDD</category><category>Tools</category><category>c#</category><category>Patterns</category><category>ReSharper</category><category>ASP.NET</category><category>YAML</category><category>Actual Items</category><category>Certification</category><category>Continuous Integration</category><category>DSVP</category><category>NDepend</category><category>Personal</category><category>Refactoring</category><category>StructureMap</category><title>Creed, Cult, and Code</title><description></description><link>http://creedcultcode.blogspot.com/</link><managingEditor>noreply@blogger.com (dalesmithtx)</managingEditor><generator>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-7885776756312582813</guid><pubDate>Sat, 14 Jan 2012 23:06:00 +0000</pubDate><atom:updated>2012-01-13T15:08:25.797-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake Fundamentals: FileLists</title><description>&lt;p&gt;In the last post, we created a rakefile that will copy a discreet set of *.bin files to a package directory for distribution using a single “publish” task.&amp;#160; But it’s pretty verbose.&amp;#160; We can refactor a bit to make the rakefile smaller, and make it handle an arbitrary list of *.bin files to be published to the /package directory using a FileList.&amp;#160; A FileList is pretty simple – it’s just an array of file names.&amp;#160; We’ll gather up all the *.bin files in the source/bin directory, and iterate through them to dynamically create file tasks for each of them and append each of those file tasks to the publish task’s prerequisite list.&amp;#160; Here we go:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;require &#39;rake&#39;

BIN_DIR     = &amp;quot;source/bin&amp;quot;
PACKAGE_DIR = &amp;quot;package&amp;quot;

directory PACKAGE_DIR

BUILD_PRODUCTS = FileList[File.join(BIN_DIR, &amp;quot;**/*.bin&amp;quot;)]
BUILD_PRODUCTS.each do |product|
packaged = product.sub(BIN_DIR, PACKAGE_DIR)
file packaged =&amp;gt; product do
cp product, packaged, :verbose =&amp;gt; true
end
task :publish =&amp;gt; [PACKAGE_DIR, packaged]  
end

desc &amp;quot;publish *.bin files to #{PACKAGE_DIR}&amp;quot;
task :publish
&lt;/pre&gt;&lt;p&gt;We cut out a bunch of stuff we don’t really need, and all we’re left with on the command line is the publish task:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjbQe2J73GW9S_0qa7Grn3VJ0fPM-3J2lWQPf208fYuesEDMfxyDZB5W-6tE0ie9_fKCWlcp9etA3gNcRcYlr8ByNS5nkbtOlaChAI5KBiuVvfO6-igwfx9ER-_BMb2tcwDMl0N99zJA/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK2QmYIwHtU5B-1KvH6C9molwiWIKQWVy71jG9XMVEK6X2289KETTmSzl36DG9c5wS18ODa1LYFDXTaBhNOug9bPiJajYV9EiN1g8K5JqcFrIvqwjwapRsFZbypccouxhxKJYEQkwMzw/?imgmax=800&quot; width=&quot;481&quot; height=&quot;205&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We don’t really care about all the individual file tasks, or the PACKAGE_DIR directory task, we just want our development team to care about the publish task.&amp;#160; So we set BUILD_PRODUCTS to a list of all the *.bin files in the BIN_DIR, and stuffed them all into the publish task that appears in our task list.&amp;#160; And to make it appear in the task list, we just give it a description after we get out of the .each do…end loop.&amp;#160; The completed publish task works just like it did before, except that now it can handle a completely arbitrary list of *.bin files.&amp;#160; Try it out – run “rake publish”, add a file called “file4.bin” to /source/bin, and then run “rake publish” again and see what happens.&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2011/03/rake-fundamentals-filelists.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK2QmYIwHtU5B-1KvH6C9molwiWIKQWVy71jG9XMVEK6X2289KETTmSzl36DG9c5wS18ODa1LYFDXTaBhNOug9bPiJajYV9EiN1g8K5JqcFrIvqwjwapRsFZbypccouxhxKJYEQkwMzw/s72-c?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-3683441945361309729</guid><pubDate>Sat, 14 Jan 2012 23:04:00 +0000</pubDate><atom:updated>2012-01-13T15:08:03.129-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake Fundamentals: directory tasks</title><description>&lt;p&gt;A build system is about building software.&amp;#160; And on a purely mechanical level, the work of building software is largely about creating files and moving them around.&amp;#160; The task keyword is the general workhorse for doing all kinds of things in Rake.&amp;#160; But you can create specialized tasks focused on automating particular things.&amp;#160; Rake comes with a couple of special kinds of tasks for managing directories and files.&amp;#160; &lt;/p&gt;&lt;h4&gt;The directory task&lt;/h4&gt;&lt;p&gt;Remember how the keyword “task” is really just a call to a method named “task()”?&amp;#160; Well the “directory” keyword is very similar – it’s really just a call to a method named “directory()”.&amp;#160; “directory” is a special kind of task that has one main purpose: it creates the directory it names if that directory doesn’t exist.&amp;#160; You don’t need to provide a do…end block parameter to a directory task, just a directory name.&amp;#160; Here’s a little rakefile to illustrate what I mean:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;require &#39;rake&#39;

BIN_DIR       = &amp;quot;source/bin&amp;quot;
PACKAGE_DIR   = &amp;quot;package&amp;quot;

desc &amp;quot;create a #{BIN_DIR} directory&amp;quot;
directory BIN_DIR

desc &amp;quot;create a #{PACKAGE_DIR} directory&amp;quot;
directory PACKAGE_DIR
&lt;/pre&gt;&lt;p&gt;There are a couple of new concepts here:&amp;#160; 1) BIN_DIR and PACKAGE_DIR are Ruby constants.&amp;#160; By convention, Ruby constants are expressed in all caps with underscores.&amp;#160; 2) The #{…} stuff is Ruby string replacement syntax.&amp;#160; So here’s what we see when we look at the task list for this rakefile:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF7hVi5D_v0FKYq73514E1B91uc4aeF-PsauW_lF16eXGLUymj8L9eIMj1Kwx5nzWuZW_Zum76F33Evti3VV0Oot4pveNH21K2a_yCy4f4R9OODHI7mbB9r-gLoaE9Xeqb0rtEA3jHLw/s1600-h/image_thumb%5B1%5D%5B2%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image_thumb[1]&quot; border=&quot;0&quot; alt=&quot;image_thumb[1]&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTujLlcmDGF2WH9vrnadJ5Gv6gpXROqs5T94UUTRabS0Vb8omDJMNVF25T07gCOvruuOqlgJrky2-9kSnLXDmvVJv5E4LtlNxcNzKQWxeM8mr1rxh-mUNeNtM4E8ocscIiFOOpxpSeLw/?imgmax=800&quot; width=&quot;481&quot; height=&quot;173&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We have two tasks: one for creating a directory named “package”, and another for creating a directory named “source/bin”.&amp;#160; Since we typically work with compiled languages in the .NET world, there will usually be a compile step in our build process that will take care of creating a /bin directory for us.&amp;#160; But since we’re just pretending right now, I threw it in just for funsies.&amp;#160; You can call these tasks from the command line, and since the directories they name don’t initially exist, rake creates those directories:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9NHdI5y9-O3bRV6zo5ZDBRSBWy9pbv8Soft4Zuun6KaUKl7veiT23gAKL8Cz2mEt4fVFrz5cbMD7yjXU6uihJW7rI7dkh-KdDFaYb26PrDMcGB8hkqTMzT5_DDPg2dtZgNnvwNPoAgA/s1600-h/image_thumb%5B4%5D%5B2%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image_thumb[4]&quot; border=&quot;0&quot; alt=&quot;image_thumb[4]&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMk_S8lbQQ__tNpmRDd4HPifULp-ltuc0WDfezuh-YcRegcG2Q6HraWrYO__QhVztpKa2f77mpvFu11WarwpsXGyWdNVw_6i9Jolm02aO09IoN38PF_1ODKwWK3Y7zG46DMX1WOPpcMg/?imgmax=800&quot; width=&quot;482&quot; height=&quot;485&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Making a directory is pretty simple – you just make the directory, and then you have the directory you wanted.&amp;#160; That’s why you don’t have to pass a do…end block to the directory task – the directory task already knows how to create a directory.&amp;#160; Ok, I hear what you’re saying: big deal.&amp;#160; And you’re right, calling “rake package” from the command line is not particularly useful when you could just call “md package” on the command line.&amp;#160; But directory tasks are &lt;em&gt;&lt;strong&gt;very&lt;/strong&gt;&lt;/em&gt; useful when you use them as prerequisites for file tasks.&lt;/p&gt;&lt;p&gt;Next up: file tasks&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2011/03/rake-fundamentals-directory-tasks.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTujLlcmDGF2WH9vrnadJ5Gv6gpXROqs5T94UUTRabS0Vb8omDJMNVF25T07gCOvruuOqlgJrky2-9kSnLXDmvVJv5E4LtlNxcNzKQWxeM8mr1rxh-mUNeNtM4E8ocscIiFOOpxpSeLw/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-3711630212723174748</guid><pubDate>Sat, 14 Jan 2012 23:03:00 +0000</pubDate><atom:updated>2012-01-13T15:07:38.765-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake Fundamentals: file tasks</title><description>&lt;h4&gt;The file task&lt;/h4&gt;&lt;p&gt;The “file” task keyword is a call to a method called, you guessed it, “file()”.&amp;#160; Like the directory task, it’s purpose is to create the thing that it names.&amp;#160; But making a file is a bit more involved than making a directory – you have to know what goes into the file when you make it.&amp;#160; What’s the name and extension of the file?&amp;#160; What’s the source for the data in the file?&amp;#160; Should there be any kind of transformation, reformatting, or translation of the source data to the data to be saved in the file?&amp;#160; What directory should you save the file in?&amp;#160; You can provide all that info to the file task when you define it.&amp;#160; Here’s some pseudo-code for a file task:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;desc &amp;quot;copy source file to target file&amp;quot;
file target_file =&amp;gt; source_file do
cp source_file, target_file
end 
&lt;/pre&gt;&lt;p&gt;This isn’t a real file task, don’t try to run it.&amp;#160; But what’s going on here?&amp;#160; The name of this task is “target_file”, and it has a prerequisite called “source_file”.&amp;#160; And if the file task decides that it’s supposed to execute the do…end block, rake uses the “cp” command to copy the file named “source_file” to a file named “target_file”.&amp;#160; How does the file task decide that the do…end block needs to be executed?&amp;#160; Two things factor into that decision: 1) if target_file doesn’t exist, then it obviously needs to be created, so the do…end block gets executed.&amp;#160; 2) If the source_file is newer than the target_file, that means that the source_file has changed since the last time that the target_file was created, and the do…end block gets executed again so that the target_file will get refreshed with the changes in source_file.&lt;/p&gt;&lt;p&gt;Ok, let’s pretend.&amp;#160; Let’s go back to our little rakefile we used to create directories.&amp;#160; And let’s pretend that we have a source/bin directory that contains some binary files that are the result of compilation – we’ll call them “file1.bin”, “file2.bin”, and “file3.bin”.&amp;#160; And furthermore, let’s pretend that we want to package those files up for distribution.&amp;#160; We can write some file tasks to make that happen:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;require &#39;rake&#39;

BIN_DIR = &amp;quot;source/bin&amp;quot;
PACKAGE_DIR = &amp;quot;package&amp;quot;

desc &amp;quot;create a #{BIN_DIR} directory&amp;quot;
directory BIN_DIR

desc &amp;quot;create a #{PACKAGE_DIR} directory&amp;quot;
directory PACKAGE_DIR


desc &amp;quot;copy file1.bin to package&amp;quot;
file &amp;quot;package/file1.bin&amp;quot; =&amp;gt; [PACKAGE_DIR, &amp;quot;source/bin/file1.bin&amp;quot;] do |t|
cp t.prerequisites[1], t.name, :verbose =&amp;gt; true
end

desc &amp;quot;copy file2.bin to package&amp;quot;
file &amp;quot;package/file2.bin&amp;quot; =&amp;gt; [PACKAGE_DIR, File.join(BIN_DIR, &amp;quot;file2.bin&amp;quot;)] do |t|
cp t.prerequisites[1], t.name, :verbose =&amp;gt; true
end

desc &amp;quot;copy file3.bin to package&amp;quot;
file &amp;quot;package/file3.bin&amp;quot; =&amp;gt; [PACKAGE_DIR, File.join(BIN_DIR, &amp;quot;file3.bin&amp;quot;)] do |t|
cp t.prerequisites[1], t.name, :verbose =&amp;gt; true
end
&lt;/pre&gt;&lt;p&gt;And here’s our task list now:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD8w8TUFY7eFZ4R-UicvWMcNWAXu5G57ArWTN41jaOd3CdUfc9jHlfaB4KiJ7Y9Ej8HIWpt_gT3PWybJps-OGJg3YySS-yykSpF8EZNekw99Hf8pQMrFJfsUqA48r63HCw_UZQNqXhSw/s1600-h/image%5B12%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzsd7CgECmoE4-nbzlMq_MLjTeYY3Rmac-_YaJsOwEm3H7xrIoo_2q0LuMxlMXwP04AChEjSfyFDzvrRUO3ickzB4RmEKcR90DmM6NKS70NqQA8wOK9WRjtxh5NV8OokMkrS_AVb0UQ/?imgmax=800&quot; width=&quot;474&quot; height=&quot;229&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In our file “package/file1.bin” task, there are two prerequisites: PACKAGE_DIR and “source/bin/file1.bin”.&amp;#160; If we execute “rake package/file1.bin”, the first thing that will happen is the package directory will get created since it doesn’t already exist.&amp;#160; And since package/file1.bin doesn’t exist either, our do…end block will get executed.&amp;#160; That do…end block looks a bit different than anything we’ve seen so far, but it’s really not that complicated.&amp;#160; Just like a lambda in c#, you can pass parameters to a do…end block in Ruby – in this case |t| represents the file task, and we’re passing it into our do…end block so that we can have access to some info about the task, particularly the prerequisites list and the name of the task.&amp;#160; “cp t.prerequisites[1], t.name, :verbose =&amp;gt; true” is very similar to the “cp source_file, target_file” line from the pseudo-code file task above.&amp;#160; In this case, the source_file is “t.prerequisites[1]” – in other words, the source_file is “source/bin/file1.bin”, which is the value in element 1 of the file task’s prerequisites array.&amp;#160; The target_file is “t.name” – in other words, the target_file is “package/file1.bin”, the name of the file task.&amp;#160; And the “:verbose =&amp;gt; true” thing just means “tell me what you’re doing when you copy this file.”&amp;#160; If we run this task, here’s what we get:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibRYSbHONHzbCUcPUxvr5-JJDiIHadiQEQTZehCn6dLB16_5boOs0hHlajbFP0Jj8ogwzr4hV8Fnf-nVmrtds5QVlvAG-xXLBRrEOXQTp5kb4mMsSxCstrPwyMaZ6Wt2d54b-QRpcPRA/s1600-h/image%5B18%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6fGJ4sY6GOJ8xvsDd6n8lXj9Vwxhx8q25bF3Mkz6bXZG6UqmJeILwxfa85VUzHmWbtAR9-JocLWpjZ8JyipObuwxwmYrmBTprDxX8XQHyzpQFgdcUnYoSQV8GNtdkxeh_TX0C6uIh7A/?imgmax=800&quot; width=&quot;479&quot; height=&quot;836&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Before we run the task, there’s no package directory.&amp;#160; After we run the task, there’s a package directory and it contains file1.bin.&amp;#160; Cool.&lt;/p&gt;&lt;p&gt;The file “package/file2.bin” task looks a little bit different. Instead of a source_file prerequisite called “source/bin/file2.bin”, we’ve got this: &lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Consolas&quot;&gt;File.join(BIN_DIR, “file2.bin”)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;File.join() is a convenient Ruby method for formatting string input into properly structured path+filenames.&amp;#160; “source/bin” and “file2.bin” are appended together and separated by a “/” character, and the result is “source/bin/file2.bin”.&lt;/p&gt;&lt;p&gt;I see you rolling your eyes again: whooptie-do, we can make files from the command line.&amp;#160; Yep, I agree, the way we’ve set up our rakefile so far doesn’t really give us a compelling reason to use file and directory tasks.&amp;#160; Calling each file task from the command line seems really cumbersome.&amp;#160; What if we had a “publish” task that published all three of our *.bin files to the /package directory in one fell swoop?&amp;#160; Let’s add this to the end of our rakefile:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;desc &amp;quot;copy file1.bin to package&amp;quot;
task :publish =&amp;gt; &amp;quot;package/file1.bin&amp;quot;

desc &amp;quot;copy file2.bin to package&amp;quot;
task :publish =&amp;gt; &amp;quot;package/file2.bin&amp;quot;

desc &amp;quot;copy file3.bin to package&amp;quot;
task :publish =&amp;gt; &amp;quot;package/file3.bin&amp;quot;

&lt;/pre&gt;&lt;p&gt;It looks like we’re adding three “publish” tasks, but we’re really only adding one:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8eNMzKQoQQbhbHMPsDG_foMCx3QgdhDmi7uRGsMCgLt49xq9bAUGWCEcvC7NR5Y6uNjhFO6j5P-QQklslvgYRAOtNWrUh2jbRJjWPwi2CHsZFOAGItgw58YMpuuG0_9lyzL1tj6d5pA/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5N0y73DZGwC-if6H83o4qx20Z-LrK2hyphenhyphenK-VvlM5ELl-5UllX6hRvNMKKug82-t-5U2OC1_pe-UDIVCZt6RliwDdLoo3sAnJTl0BS4zwlROiOAiAWSji-nc5YAaO54oIFEC4wVnKcy8w/?imgmax=800&quot; width=&quot;549&quot; height=&quot;213&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ruby allows you to do some pretty fancy dynamic stuff, and rake takes advantage of that by allowing you to “re-open” a task that has already been defined and add some more stuff to it.&amp;#160; In our case, we’re re-opening the “publish” task and adding a new prerequisite for each of our *.bin files.&amp;#160; The result is a single publish task that copies all three *.bin files to the /package directory:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFwxGPawVlxzQzS1EMyAs0TAL2Fx3GSaU-tTR8vGEeo2-DGny0J89SBn9LlX2gXAUeG-BvWHzXJMRME2dVaRamejzRieJpJyo3OW13z875usEB9exzN_-scHXxrHlOI0JRFc-JqBmQfw/s1600-h/image%5B28%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsGZ6IB_04Z_EZ0iNqgk5ex4EXx2UyQ4mG-m2JzK0iGifjQv8zTVGnBzVyFhlsC_96nTequSo9pxrL4xjXL5sFOt-zCxsR0w2hyphenhyphena_-K_u4YCH1TnqEX4-uNnT8BkakfmarxYSGVFrQZg/?imgmax=800&quot; width=&quot;477&quot; height=&quot;662&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ok, now we’re getting somewhere.&amp;#160; Now if only one of our source/bin/*.bin files changes, only the changed file will get copied to the /package folder.&amp;#160; Open up source/bin/file2.bin and put some random text in it, and then run “rake publish” again:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8ivSlkc-sW5Gv7oxbOoZWe7bGvaQMKsg3OR7tcwSHK4Dvu4zVoUcCezhU88_nRopvIIrfSO3fUwFQUOMhaJDdtIm6_MkvKXP2az81whFBrsc7KxNV9ueqhvVwHeEgA2Yp3nTRXvwwWQ/s1600-h/image%5B33%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCREqq8itTWhFmfYAH9_UGJP40Vv8OwcYtLge0oShVamKsYKDVo96KTkWi3B8dMWE14laFpmlpdq4Bkyn1q4QHI9Uk2ZwHXB9_uvRWaKCzHzmktuNxu-wvtAf5wiagre5yvoBA4eezSg/?imgmax=800&quot; width=&quot;470&quot; height=&quot;411&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;We’re making progress, but our rakefile is still way too verbose.&amp;#160; We need to find a way to reduce the amount of code it takes to copy these files out to /package.&amp;#160; And we should also be able to copy an arbitrary list of files, not just a discreet list we have to keep updating.&lt;/p&gt;&lt;p&gt;Next up: FileLists&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2011/03/rake-fundamentals-file-tasks.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGzsd7CgECmoE4-nbzlMq_MLjTeYY3Rmac-_YaJsOwEm3H7xrIoo_2q0LuMxlMXwP04AChEjSfyFDzvrRUO3ickzB4RmEKcR90DmM6NKS70NqQA8wOK9WRjtxh5NV8OokMkrS_AVb0UQ/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-3936551333923748593</guid><pubDate>Fri, 13 Jan 2012 23:02:00 +0000</pubDate><atom:updated>2012-01-13T15:05:05.106-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake Fundamentals: tasks with prerequisites</title><description>&lt;p&gt;Rake tasks can have other tasks as prerequisites.&amp;#160; That means that a tasks prerequisites are executed before the task itself when the task is called from the command line.&amp;#160; Just like Nant, if you have a lot of small tasks you often run together, it’s convenient to roll them up into one task with prerequisites.&amp;#160; Let’s use rake to rock out: &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwOLipU3LvCKeNRpLzWjNXLeR1FMvTqKpfmJXbFFPF5CpDyS5hAxy_X0vmFONWZ_AKhHRQIWY7auLw2P3_GlTQcMLozAwPP4cHI2GuQ_6d4ZY3KUkFHgkNvxowBIjZ3Vsvpi_9y8-EYQ/s1600-h/image%5B23%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVAK7aK9SvoSsg9kIBWNDvOZFkUat16HpHqCB78SHrYFmkAqVSAw1Xz_QlqCfjiINl53letgIUAfI8GuaYdxQMU2gwHy4_W-UOhYe5bIpWnKCRgZ1W1w5ht9mrYWJ-zh3Jrak0zDNpw/?imgmax=800&quot; width=&quot;283&quot; height=&quot;376&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;require &#39;rake&#39;

desc &amp;quot;open guitar case and get guitar&amp;quot;
task :get_axe do
puts &amp;quot;opening guitar case&amp;quot;
puts &amp;quot;grabbing telecaster&amp;quot;
end

desc &amp;quot;plug guitar into amp&amp;quot;
task :crank_up do
puts &amp;quot;plugging into 1959 fender tremolux&amp;quot;
puts &amp;quot;turning up volume&amp;quot;
end

desc &amp;quot;play A chord&amp;quot;
task :play_a do
puts &amp;quot;playing A chord&amp;quot;
end

desc &amp;quot;play D chord&amp;quot;
task :play_d do
puts &amp;quot;playing D chord&amp;quot;
end

desc &amp;quot;play E chord&amp;quot;
task :play_e do
puts &amp;quot;playing E chord&amp;quot;
end

desc &amp;quot;bask in the glory of adulation&amp;quot;
task :take_bow do
puts &amp;quot;taking a bow&amp;quot;
puts &amp;quot;winking at the girl in the front row&amp;quot;
end

desc &amp;quot;give the people what they want&amp;quot;
task :rock_the_house =&amp;gt; [:get_axe, :crank_up, :play_a, :play_d,
:play_a, :play_e, :take_bow]&lt;/pre&gt;&lt;p&gt;This rakefile defines these tasks:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpIzPO6S23YO1mnR8IXjdn3JEp0PscTVRVa1WA0x6V6fbLbqeWoWFZqH604HCP4ET_3Lz_Ewbok9TdTx9YopapVNoX0kd2AfQpPbR4VpC3jiV31DrQaAkPRh9nQ64cnmOFrntKB1APig/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXVi_U9tdWxUqAzGDhkzrYHo5jzDPrlu5I8ab1LStfMftC6hg0X3sYIKesgomjb2uys3hBjaOe8qOxkw7mgU4r00rg9iwJ6J2Itg8aiBUKdwXle3fGpAEiUUth_7diFtL5CrbAUp4laQ/?imgmax=800&quot; width=&quot;502&quot; height=&quot;216&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And you could call each of these tasks individually if you wanted to.&amp;#160; But we want to rock the house, right?&amp;#160; So all we need to do is call “rake rock_the_house”.&amp;#160; According to the prerequisite list in the :rock_the_house task, rocking the house should consist of getting out our axe, cranking up, jamming some chords in this order: ADAEA, and bowing to a standing ovation.&amp;#160; Let’s give it a try and see what happens:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIAoKwHN8tnlhgL_CkWmynNiiMuPI7XAWLsPRZa_TMpuU686pd19ptvN9JB_QYVQJRQ3IK9DW2HmHg3D_CnUVpt2sDo6xAJD7fmdqX2L8br4j3CWlFfVKd4X5xbPSMYj0UTs8CduWCiw/s1600-h/image%5B8%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg22PiJsfsFMXho6ORurDgUDSVLubBR0kvUJVy9umeVizWy7yW6eTKcLWyd_NsS7y1-Pz0uQIOc1dZUfPxVF_r1WvruYfa_G8TSGDLuEE1Cb64YQQ2voH233BKEVmW8cC5-hCc1fJue9A/?imgmax=800&quot; width=&quot;507&quot; height=&quot;247&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Our rock_the_house task ran all the prerequisites, except it didn’t play all the chords we told it to play – we only played ADE, not ADAEA.&amp;#160; LAME!&amp;#160; That’s because rake keeps track of tasks it has executed, and by default will only execute them once.&amp;#160; That might be cool for some tasks, but we want to play the blues, so we have to re-enable our “play_a” task every time we execute it so that we can execute it again.&amp;#160; Let’s fix our rakefile by creating a “play_the_blues” task that knows how to play our chords correctly:&lt;/p&gt;&lt;pre class=&quot;brush: ruby; ruler: true;&quot;&gt;require &#39;rake&#39;

desc &amp;quot;open guitar case and get guitar&amp;quot;
task :get_axe do
puts &amp;quot;opening guitar case&amp;quot;
puts &amp;quot;grabbing telecaster&amp;quot;
end

desc &amp;quot;plug guitar into amp&amp;quot;
task :crank_up do
puts &amp;quot;plugging into 1959 fender tremolux&amp;quot;
puts &amp;quot;turning up volume&amp;quot;
end

desc &amp;quot;play A chord&amp;quot;
task :play_a do
puts &amp;quot;playing A chord&amp;quot;
end

desc &amp;quot;play D chord&amp;quot;
task :play_d do
puts &amp;quot;playing D chord&amp;quot;
end

desc &amp;quot;play E chord&amp;quot;
task :play_e do
puts &amp;quot;playing E chord&amp;quot;
end

desc &amp;quot;bask in the glory of adulation&amp;quot;
task :take_bow do
puts &amp;quot;taking a bow&amp;quot;
puts &amp;quot;winking at the girl in the front row&amp;quot;
end

task :play_the_blues do
Rake::Task[:play_a].invoke
Rake::Task[:play_a].reenable

Rake::Task[:play_d].invoke

Rake::Task[:play_a].invoke
Rake::Task[:play_a].reenable

Rake::Task[:play_e].invoke

Rake::Task[:play_a].invoke
end

desc &amp;quot;give the people what they want&amp;quot;
task :rock_the_house =&amp;gt; [:get_axe, :crank_up, :play_the_blues, :take_bow]&lt;/pre&gt;&lt;p&gt;Sometimes instead of calling a task as a prerequisite, you want to invoke it directly from within another task.&amp;#160; Calling the invoke() method on Rake::Task[] is how you do that.&amp;#160; Once you’ve called a task, you can reenable it to be called again by using Rake::Task[].reenable().&amp;#160; We’ve modified our “rock_the_house” task by calling our new “play_the_blues” task as a prerequisite.&amp;#160; Notice that since we didn’t give our “play_the_blues” task a description, it doesn’t show up on the task list when you type “rake –T”.&amp;#160; But it’s still available for use.&amp;#160; Also, notice that we didn’t provide a do…end block to our “rock_the_house” task.&amp;#160; Since we defined everything we need for rocking the house in our other tasks, we only needed to provide the “rock_the_house” task with prerequisites.&amp;#160; Let’s see what happens now:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEOpHubMjWqVoKiAzpqjmd9QN37Q2Ox7kaVWqeKx2zMS5WIqPrsiFvkhJOs3JRYNdf7ceDFZWE4x8XX1UDd1un4j5zEwoLFuzkxFUz3DlLDQIxcgHOX_8qMiA0E27O4N2b-kHGdCsc_A/s1600-h/image%5B16%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRe2IuC7s_lPjirl-KH9_ZKyI3d8frcwtJiAEynF6eJkipatmHYp6wLEfxLHeBUprVKzo5XI1xQD7Zw_Ee_aYX4_KswxAvYT9eRmj868Z87DDMl6HKiFVvHiLWYIlje98nwYrQqj6T_Q/?imgmax=800&quot; width=&quot;500&quot; height=&quot;269&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Perfect!&amp;#160; All the chords get played in the right order.&amp;#160; We’ve got a single task to call from the command line that can do all the things we want it to do.&amp;#160; &lt;/p&gt;&lt;p&gt;Next up: directory and file tasks&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2011/03/rake-fundamentals-tasks-with.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmVAK7aK9SvoSsg9kIBWNDvOZFkUat16HpHqCB78SHrYFmkAqVSAw1Xz_QlqCfjiINl53letgIUAfI8GuaYdxQMU2gwHy4_W-UOhYe5bIpWnKCRgZ1W1w5ht9mrYWJ-zh3Jrak0zDNpw/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-218125665461277623</guid><pubDate>Fri, 13 Jan 2012 23:02:00 +0000</pubDate><atom:updated>2012-01-13T15:05:02.662-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake Fundamentals: rakefiles and tasks</title><description>&lt;h4&gt;&lt;strong&gt;Ok, what is Rake again?&amp;#160; &lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Rake is a collection of Ruby scripts that live deep within the bowels of your Ruby installation.&amp;#160; Since you made sure you checked the box that adds the Ruby stuff to your PATH variable as you stepped through the Ruby installer wizard, you now have easy access to your Ruby installation and all of the special scripts it contains right from the command line.&amp;#160; To make use of those Ruby scripts, you do a couple of things:&lt;/p&gt;&lt;p&gt;1) Create a &lt;strong&gt;rakefile&lt;/strong&gt;, which is itself a ruby script containing named tasks you can run from the command line. &lt;/p&gt;&lt;p&gt;2) Run one or more of those tasks from the command line like so: &lt;/p&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;C:\sandbox\rakefun\&amp;gt; rake mytask&lt;/font&gt;   &lt;h4&gt;&lt;strong&gt;And what’s a rakefile?&amp;#160; &lt;/strong&gt;&lt;/h4&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;That command you just issued told rake to look for a file called c:\sandbox\rakefun\rakefile.rb and execute a task called ‘mytask’. You can call the rakefile something else if you want to, but if you name it “rakefile.rb”, you don’t have to include the “-f my_special_rakefile_name_because_im_a_unique_delicate_flower.rb” switch on the rake command line call – just less to type if you stick to the convention. It’s easy to create a rakefile: open up notepad, type in your tasks, save it as “rakefile.rb”, and you’re done. No compiling. No real need for fancy IDE’s, just any old text editor will do. I like &lt;a href=&quot;http://www.flos-freeware.ch/notepad2.html&quot; target=&quot;_blank&quot;&gt;Notepad2&lt;/a&gt;, and &lt;a href=&quot;http://www.activestate.com/komodo-edit&quot; target=&quot;_blank&quot;&gt;Komodo Edit&lt;/a&gt; is another nice free one with Ruby syntax highlighting. So, what exactly is in a rakefile?&lt;/font&gt;   &lt;h4&gt;tasks&lt;/h4&gt;&lt;p&gt;The fundamental building block of a rakefile is the “task”.&amp;#160;&amp;#160; Here’s a hello world rakefile that has one task in it called “:say_hi”.&lt;/p&gt;&lt;pre class=&quot;brush: ruby;&quot;&gt;require &#39;rake&#39;

desc &amp;quot;My first rake task&amp;quot;
task :say_hi =&amp;gt;[] do
puts &amp;quot;Hello, dude!&amp;quot;
end&lt;/pre&gt;&lt;p&gt;Ok, I fudged a little bit: when you open your editor to create your rakefile, you should actually require ‘rake’ at the beginning of the script.&amp;#160; This tells Ruby to find the rake.rb ruby script and pull it into your rakefile when Ruby parses it.&amp;#160; Ruby parses your rakefile any time you make a call to it with the rake keyword on the command line.&lt;/p&gt;&lt;p&gt;Rake provides a keyword called “task”.&amp;#160; The task keyword is actually just a call to a method named “task()” that lives somewhere in the rake.rb ruby script.&amp;#160; But through the magic of Ruby, the task() method call in your rakefile is formatted as you see above.&amp;#160; Takes a little getting used to.&amp;#160; Every time you call a task in your rakefile, Ruby parses the entire file, and all the task() method calls get executed.&amp;#160; But don’t worry – as each task() method call is executed, Ruby is just looking through the rakefile to gather up the name of each task, and the code that Ruby should run when that task name is called from the command line.&amp;#160; So if we had “:task1” and “:task2” in our rakefile, and we called “rake task1” from the command line, Ruby would know that we have both :task1 and :task2 available, but it would only run the code associated with task1. &lt;/p&gt;&lt;p&gt;There are two arguments being passed to task(), and if you’re not familiar with Ruby, they’re a little hard to distinguish:&lt;/p&gt;&lt;p&gt;1) The first argument is “&lt;font style=&quot;background-color: #ffff00&quot;&gt;:say_hi =&amp;gt;[]&lt;/font&gt;” – This is a Ruby hash object, which is just a collection of key/value pairs.&amp;#160; In this case the hash contains only one key/value pair.&amp;#160; The key is the symbol “:say_hi”, which by convention becomes the name of the task.&amp;#160; The value is “[]”, which is Ruby parlance for an empty array.&amp;#160; In more complex tasks, this array would contain the names of other tasks which should be prerequisites to this task.&amp;#160; Ruby is pretty forgiving, and rake takes advantage of that, so if you have no prerequisites you don’t actually have to include the “=&amp;gt;[]” part; and when you have one or more prerequisites, you can exclude the brackets and just supply a comma-separated list of task names. &lt;/p&gt;&lt;p&gt;2) The second argument is this highlighted block of code starting with “do” and ending with “end”:    &lt;br /&gt;
task :say_hi =&amp;gt;[] &lt;font style=&quot;background-color: #ffff00&quot;&gt;do      &lt;br /&gt;
&amp;#160; puts &amp;quot;Hello, dude!&amp;quot;       &lt;br /&gt;
end&lt;/font&gt;     &lt;br /&gt;
A code block is a special Ruby construct that you can think of like an anonymous method or a lambda.&amp;#160; When you call a rake task, rake first executes all the prerequisite tasks you listed in the array in the first argument, and then executes the code in the do…end code block.&amp;#160; If you only want to run prerequisite tasks without executing any other code, just don’t include a do…end code block. &lt;/p&gt;&lt;p&gt;The :say_hi task is called from the command line like this: &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiAd6L0R5orGW4BYWGd0Mq0H3ANWALMzEXGqKHnJmkO0erWituc0o2k6CkjHtDFRJesCtcRsw-7ytTilc_HxsI2O4pHQoOlWo-ALflK-BpgR7oyPtXi5yjY7l4D1HuJ3h-ept9-C_Qfg/s1600-h/image%5B3%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq4xRicfs68BsMIYxHSGhgLbrn0Ym1tCVIsjt-pqX86hjAUJ_B6MGJf_Cq4CE10Sf5HDRHMROO0heL-tvJH_tFPYcW3h0s7B7dfRuzxdyDmmxT9QOuCoIQ0pw2AuhCpgApnukhFM8YkA/?imgmax=800&quot; width=&quot;375&quot; height=&quot;129&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Get a list of tasks with rake -T&lt;/h4&gt;&lt;p&gt;Tasks decorated with a “desc” are shown when you call “rake –T”, “rake –tasks”, or “rake –D” on the command line:&amp;#160; &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw-LpobS1vh7X0_EbKC70ezlWkUngK8ohuUIiUh52FyKDjfwvAZb0Rfjb24hlxhvQSNAK-BP9OH2IXdEA4ql4lER3OXGm2l_wRh7y4qIuH5IILu9T9kMJNc6ppcXivIC685QIQtzl8Zw/s1600-h/image%5B7%5D.png&quot;&gt;&lt;img style=&quot;background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px&quot; title=&quot;image&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCeASK1g7ZA6LRjTowMmvKwLqGnr9SB5dc0zr9iTcl8o9oYxUgM1uIFTN-0SHQ_PrJNKI4rfxQIm8NKOL_I0-jEB2JJI1yLE6GaKl0MdN8bCu78uHvm1NuRJMwRXU8OfvCgyaNMWyKdw/?imgmax=800&quot; width=&quot;377&quot; height=&quot;295&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Trebuchet MS&quot;&gt;Tasks with no “desc” are not shown in the task list, but can still be called from the command line, or used as prerequisites for other tasks.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Next time: Tasks with prerequisites.&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2011/02/rake-fundamentals-rakefiles-and-tasks.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq4xRicfs68BsMIYxHSGhgLbrn0Ym1tCVIsjt-pqX86hjAUJ_B6MGJf_Cq4CE10Sf5HDRHMROO0heL-tvJH_tFPYcW3h0s7B7dfRuzxdyDmmxT9QOuCoIQ0pw2AuhCpgApnukhFM8YkA/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2400452883935495698</guid><pubDate>Fri, 13 Jan 2012 22:57:00 +0000</pubDate><atom:updated>2012-01-13T15:04:58.815-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Rake. Huh?</title><description>Lately I’ve been using &lt;a href=&quot;http://rake.rubyforge.org/&quot; target=&quot;_blank&quot;&gt;rake&lt;/a&gt; at my office to build .NET solutions with Derick Bailey’s wonderful &lt;a href=&quot;http://albacorebuild.net/&quot;&gt;albacore&lt;/a&gt; gem.&amp;nbsp; But I’ve had lots of questions from others on my team about rake:&lt;br /&gt;
&lt;strong&gt;1) What the heck is rake?&lt;/strong&gt;&lt;br /&gt;
The official line on rake: it is a build system written in Ruby inspired by the make build system from the world of c.&amp;nbsp; If that doesn’t really mean anything to you, just think of rake this way: it’s just a task runner.&amp;nbsp; A rake script is a convenient place to script out small tasks that you have to do every day – tasks that don’t take long individually, but that you’re performing multiple times per hour while you are writing code.&amp;nbsp; Automating those little rote tasks will save you time, and will cut down on the number of silly errors you get performing those tasks by hand.&lt;br /&gt;
&lt;strong&gt;2) A build system?&amp;nbsp; Why do I need some fancy build system when I can just click the “Build Solution” menu option in Visual Studio?&lt;/strong&gt;&lt;br /&gt;
Well first of all, having a build system outside of Visual Studio doesn’t keep you from using the Visual Studio build tools.&amp;nbsp; A good build system should work alongside the IDE, not against it.&amp;nbsp; But more importantly, when you have a complex solution with one or more deployable apps, some redistributable assemblies, and multiple test projects, you’ve got a lot of stuff to manage; a good build system enables you to manage all that stuff with a measure of convenience that Visual Studio just isn’t designed to provide.&lt;br /&gt;
&lt;strong&gt;3)&amp;nbsp; Why rake instead of &lt;/strong&gt;&lt;a href=&quot;http://nant.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;NAnt&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;?&amp;nbsp; Are you just trying to be cool?&lt;/strong&gt;&lt;br /&gt;
NAnt is a perfectly useful build system, and I’ve used it for years.&amp;nbsp; And with &lt;a href=&quot;http://code.google.com/p/uppercut/&quot; target=&quot;_blank&quot;&gt;UppercuT&lt;/a&gt;, NAnt is certainly easier to use than it used to be.&amp;nbsp; But it’s still just XML.&amp;nbsp; Same thing goes for MSBuild.&amp;nbsp; Ultimately you’re talking about filling out an XML configuration file. If I want a custom target type that does something NAnt (or MSBuild) doesn’t do out of the box, I have to use a real programming language to implement the guts of the target; so now I’ve got yet another project to manage.&amp;nbsp; I’m sure there are people who love it and use it very successfully, but it’s just not my cup of tea.&amp;nbsp; Not only is it not my cup of tea: &lt;em&gt;it makes me hate tea&lt;/em&gt;.&amp;nbsp; I’m a programmer, not a form-filler-outer.&amp;nbsp; I want a programming language, not an XML configuration file.&amp;nbsp; &lt;br /&gt;
&lt;strong&gt;4) We’re building .NET apps on Windows machines.&amp;nbsp; Why automate with rake instead of PowerShell?&lt;/strong&gt;&lt;br /&gt;
I’ve seen some very compelling demos of &lt;a href=&quot;http://jameskovacs.com/2009/10/14/releasing-psake-v100-psake-v200/&quot; target=&quot;_blank&quot;&gt;psake&lt;/a&gt;, another make-inspired build system, written in PowerShell.&amp;nbsp; It’s certainly more to my liking than an XML-based build system.&amp;nbsp; But PowerShell is vendorscript.&amp;nbsp; I would rather spend time using a language that is a more transferrable skill, like Ruby.&amp;nbsp; &lt;br /&gt;
Those are the “why” questions I get about rake, and my lame attempts to legitimize my desire to mess around with Ruby at work.&amp;nbsp; I’m off and running on rake now, and the rest of the questions I get usually start with “how”.&amp;nbsp; I’m hoping to write a few posts answering those questions, and I’ll update this post with links to other posts in the series as I go.&lt;br /&gt;
&lt;h4&gt;&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;;&quot;&gt;&lt;strong&gt;Installing Ruby and Rake&lt;/strong&gt;&lt;/span&gt;&lt;/h4&gt;&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;;&quot;&gt;Before we talk about rake, rakefiles, and tasks, we’ll need a couple of things:&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;;&quot;&gt;1) &lt;strong&gt;Ruby&lt;/strong&gt; – rake is really just a set of Ruby scripts. And what do you need to run Ruby scripts? Ruby! The easiest way to get up and running with Ruby on a Windows box download &lt;a href=&quot;http://rubyinstaller.org/downloads/&quot; target=&quot;_blank&quot;&gt;the latest Ruby One-click Installer&lt;/a&gt; (version 1.9.2 as of this blog post), and just run it. &lt;strong&gt;&lt;em&gt;Important: Make sure you check the box that adds the Ruby stuff to your PATH variable as you step through the installer wizard.&amp;nbsp; &lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrFNb5MfSKRk0eAocZBByp-DjMEJNtvPdJF_ceclmiBdh_Tc6WedJ3gIUaAU3yz9WUq007pvBYSC2gn1cZWyv_de6H5FUVBaWKovEMR3Rb-8MsIN53FdeBTPUC0ZNGpDefaJY-JU120Q/s1600-h/image%5B6%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;370&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqeMYdql6C-Gh8vX33n6TLPs9y8iYkQGU9H9fX2n7onNms9HRkDCoGgqMfCpOmoZ_26vUJ5NWoeKvT60yE-il7mb2fVlwTNzRTEiET407TvNsrrnrtcx0EnVhtKUeWOU62MMYDorYViA/?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;474&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Once you’ve gotten through the wizard, open up a command prompt and type “ruby –v” to see the version number.&amp;nbsp; You should see something like this:&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi02q6AQmCkPGOejDa9duoD6QBlNjG1H-pEpUawF8qQoNFhDTli6x2huhkQ_WbJMZw3P1Qxj7PCzJ61Zg1KwBB7UQQmU0mMXDplYzyxG7WpwFtW5DHyhp-_uSsUQIlaJDnaEx09t0kEA/s1600-h/image%5B4%5D.png&quot;&gt;&lt;img alt=&quot;image&quot; border=&quot;0&quot; height=&quot;107&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuiG11OH8Zueal-PyYBT4tycF7kLkjgkVkuOHIHN3t2FVS5kkYawGxkAvP8L4gdjoy82m7zZi298tTVgp_y4Bho6doT-BGfyNoWgSfD5zylYxiXZe6RbwflagWyJ4kr4MzjCKuPuXqyA/?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;image&quot; width=&quot;335&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
If you see a message saying something along the lines of “ruby is not a recognized command”, just reboot.&amp;nbsp; Windows just needs to deal with the PATH variable.&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Trebuchet MS&#39;;&quot;&gt;2) &lt;strong&gt;Rake&lt;/strong&gt; – now that you’ve got Ruby installed, open up a command prompt and type&lt;/span&gt; &lt;br /&gt;
&lt;pre class=&quot;brush: ruby;&quot;&gt;gem install rake&lt;/pre&gt;and hit enter.&amp;nbsp; The “gem” keyword hooks you into Ruby’s package management system – you’re telling Ruby to grab the “rake” package from the &lt;a href=&quot;http://rubygems.org/&quot; target=&quot;_blank&quot;&gt;RubyGems&lt;/a&gt; repository, and install it in your local Ruby installation.&amp;nbsp; A bunch of stuff that won’t make a lot of sense will scroll by in the command window.&amp;nbsp; But at the end of it, once you get back to a command prompt, you’ll be ready to run rake scripts.&amp;nbsp; &lt;br /&gt;
3) &lt;strong&gt;A text editor&lt;/strong&gt; – ok, three things.&amp;nbsp; Notepad works just fine.&amp;nbsp; If you want something fancier, there’s &lt;a href=&quot;http://www.activestate.com/komodo-edit&quot; target=&quot;_blank&quot;&gt;Komodo Edit&lt;/a&gt;, &lt;a href=&quot;http://www.flos-freeware.ch/notepad2.html&quot; target=&quot;_blank&quot;&gt;Notepad2&lt;/a&gt;, &lt;a href=&quot;http://notepad-plus-plus.org/&quot; target=&quot;_blank&quot;&gt;Notepad++&lt;/a&gt; , etc.&amp;nbsp; And if you wanna pay for a nice Ruby editor, &lt;a href=&quot;http://www.jetbrains.com/&quot; target=&quot;_blank&quot;&gt;JetBrains&lt;/a&gt; (the people behind the wonderful &lt;a href=&quot;http://www.jetbrains.com/resharper/&quot; target=&quot;_blank&quot;&gt;ReSharper&lt;/a&gt;) have a good one called &lt;a href=&quot;http://www.jetbrains.com/ruby/&quot; target=&quot;_blank&quot;&gt;RubyMine&lt;/a&gt;.&amp;nbsp; I like RubyMine a lot, and I got lucky and picked up a copy for $29.&amp;nbsp; Every once in a while they put it on sale, you just gotta check the website for it.&lt;br /&gt;
&lt;br /&gt;
Next up: rakefiles and tasks</description><link>http://creedcultcode.blogspot.com/2011/02/rake-huh.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqeMYdql6C-Gh8vX33n6TLPs9y8iYkQGU9H9fX2n7onNms9HRkDCoGgqMfCpOmoZ_26vUJ5NWoeKvT60yE-il7mb2fVlwTNzRTEiET407TvNsrrnrtcx0EnVhtKUeWOU62MMYDorYViA/s72-c?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-5484896060553596083</guid><pubDate>Fri, 06 Feb 2009 03:44:00 +0000</pubDate><atom:updated>2009-02-05T21:38:52.182-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Certification</category><category domain="http://www.blogger.com/atom/ns#">DSVP</category><title>Announcing: the Dale Smith Valued Professional (DSVP) Program</title><description>&lt;p&gt;&lt;u&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: &lt;strong&gt;Scott Bellware has just made the grade as well.&amp;#160; Welcome to the program, Scott!&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;UPDATE: The DSVP program welcomes Louis Salin.&amp;#160; Way to go Louis!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Karl Seguin (among others) is a bit &lt;a href=&quot;http://codebetter.com/blogs/karlseguin/archive/2009/02/03/why-aren-t-i-an-mvp.aspx&quot; target=&quot;_blank&quot;&gt;miffed&lt;/a&gt; about Microsoft&#39;s Most Valuable Professional (MVP) program.&amp;#160; Or at least mystified.&amp;#160; Seems that the rules of induction to the program have become a bit obscure.&amp;#160; Why does Microsoft have the MVP program?&amp;#160; &lt;a href=&quot;http://mvp.support.microsoft.com/gp/mvpexecsum&quot; target=&quot;_blank&quot;&gt;According to Microsoft&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;We present the MVP Award to thank individuals for their exceptional contributions to technical communities worldwide. When a community participant sees an MVP in a technical community, whether in a newsgroup, as a user group host, a conference speaker, or a respondent in forums, that community participant can be confident that the information shared by the MVP will be of the highest caliber and will help every user make the most of the technology.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So what kind of community contributions does Microsoft consider &amp;quot;exceptional&amp;quot;?&amp;#160; What kind of information shared by MVPs in various forums does Microsoft consider to be &amp;quot;of the highest caliber&amp;quot;?&amp;#160; I don&#39;t know - they don&#39;t really spell it out.&amp;#160; But Microsoft is a publicly traded company, so I&#39;m sure their primary goal is providing value for their shareholders.&amp;#160; If I were in Microsoft&#39;s shoes I would consider information that benefits me in achieving that goal to be &amp;quot;exceptional&amp;quot; and &amp;quot;of the highest caliber&amp;quot;.&lt;/p&gt;  &lt;p&gt;I&#39;m not in Microsoft&#39;s shoes.&amp;#160; In fact, I&#39;m not wearing shoes at all (I&#39;m from Mississippi).&amp;#160; And I have my own goals, chief among which is providing value for my employer and my customers so that I can earn a paycheck (hey, a guy&#39;s gotta eat).&amp;#160; As it turns out, Karl Seguin has helped me achieve my goals over and over again by his activity in the community, as have many others.&amp;#160; Those folks deserve an award!&lt;/p&gt;  &lt;p&gt;So I hereby institute: &amp;lt;insert fanfare here&amp;gt; the &lt;strong&gt;DALE SMITH VALUED PROFESSIONAL (DSVP) PROGRAM&lt;/strong&gt;.&amp;#160; Why do I have the DSVP program?&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Dale Smith presents the DSVP Award to thank individuals for their exceptional contributions to technical communities in which Dale Smith participates or trolls. When a community participant sees a DSVP in a technical community, whether in a newsgroup, as a user group host, a conference speaker, or a respondent in forums, that community participant can be confident that the information shared by the DSVP will be that which Dale Smith considers to be of the highest caliber and will help Dale Smith make the most of the technology.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here are some questions you&#39;re probably asking yourself:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How do I become a Certified DSVP?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Well that&#39;s really kind of up to me, Dale Smith (see above).&amp;#160; If you would like to be considered for the program, feel free to apply via the comment box below.&amp;#160; We will consider your application carefully, and my legal team will contact you when a decision has been reached.&amp;#160; I guess the main thing to remember here is this: some are born great, some achieve &lt;em&gt;greatness&lt;/em&gt;, and others have &lt;em&gt;greatness thrust upon them&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;What does being a Certified DSVP get me?&lt;/strong&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;First of all&lt;/strong&gt;: Once a DSVP, always a DSVP.&amp;#160; None of this you-have-to-renew-once-a-year stuff.&amp;#160; That&#39;s just the kind of guy I am.&amp;#160; (To be honest with you, this one is more about me avoiding paperwork than anything else.) &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;: I&#39;ll give you a warm smile and a hearty handshake if I ever run into you at a conference or something.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;: You will have the right to use the letters D, S, V, and P after your name, like so - &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Dale Smith, DSVP&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;See?&amp;#160; Pretty spiffy, huh?&amp;#160; If you use this baby after your name, you better believe that folks will know that when they see you in a technical community, whether in a newsgroup, as a user group host, a conference speaker, or a respondent in forums, that Dale Smith thinks you are one righteous dude.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Last, but not least&lt;/strong&gt;:&amp;#160; You&#39;re welcome to use this nifty badge on your blog, business cards, and any other self-promotional marketing materials you desire:&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://dalesmithtx.googlepages.com/DSVP.jpg&quot; /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;So why is the badge a cassette tape?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Microsoft is a lot cooler than I am.&amp;#160; No, seriously, they really are.&amp;#160; Granted, they sometimes exhibit some bewildering behavior in the way that they engage the development community.&amp;#160; But the fact is, their achievements both in business and technology far outshine mine.&amp;#160; So receiving an award from them, compared to an award from me, would be like getting the entire recorded output of the Replacements on pristine vinyl, still in the original unopened shrink wrap, plus all Paul Westerberg&#39;s and Chris Mars&#39;s solo material, records from Tommy Stinson&#39;s post-Mats bands Bash-n-Pop, Perfect, and even the new one from Guns &#39;n&#39; Roses.&amp;#160; While we&#39;re at it, let&#39;s throw in a high-quality bootleg of whatever you can find from Bob Stinson&#39;s post-Mats band Static Taxi.&lt;/p&gt;  &lt;p&gt;In contrast, getting an award from me is like getting a self-made cassette from a local unsigned band.&amp;#160; Nothing earth-shattering, mind you, but certainly earnest, sincere, charming.&amp;#160; Definitely has its moments.&amp;#160; And twenty years from now you&#39;ll probably run across it again in a box of long-forgotten tapes, and you&#39;ll throw it in the deck and think, &amp;quot;Oh yeah!&amp;#160; I remember this!&amp;#160; This was actually pretty cool!&amp;quot;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;And now I&#39;m going to induct Karl Seguin as the very first Certified DSVP.&lt;/strong&gt;&amp;#160; So here goes:&lt;/p&gt;  &lt;p&gt;Yea and verily, be it known henceforth and forevermore that Karl Seguin is hereby Certified as a Dale Smith Valued Professional (DSVP) in the region of Ottawa, Ontario.&amp;#160; Oh, what the heck!&amp;#160; Let&#39;s make Karl&#39;s jurisdiction all of Canada!&amp;#160; Congrats, Karl!&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;bookmark_title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;ti=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;title=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html&amp;amp;t=The Dale Smith Valued Professional (DSVP) Program&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2009/02/announcing-dale-smith-valued.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-3704879873822279185</guid><pubDate>Tue, 14 Oct 2008 05:34:00 +0000</pubDate><atom:updated>2008-10-14T20:18:28.797-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><category domain="http://www.blogger.com/atom/ns#">Refactoring</category><category domain="http://www.blogger.com/atom/ns#">ReSharper</category><title>Refactoring Legacy ASP.NET Code-Behind with ReSharper</title><description>&lt;p&gt;I&#39;ve been on a refactoring kick lately.&amp;#160; And with the state of the legacy code at my office, I&#39;ll be refactoring for a very long time to come.&amp;#160; This is a write-up of a refactor I did at work, altered enough so that I don&#39;t violate my NDA.&amp;#160; But I think there&#39;s enough of the real story left to illustrate what I was talking about last time: you can indeed beautify even the ugliest code.&amp;#160; A couple of items to note: 1) we&#39;re still on .NET 2.0 (no we haven&#39;t migrated to 3.5 yet - don&#39;t ask!), and 2) I&#39;m not going to touch on testing much in this post.&amp;#160; I really want to focus on the fact that you can positively affect some seriously messed up code with some pretty simple steps.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Participant&lt;/b&gt;&lt;b&gt;Details Refactor&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;We have a legacy ASP.NET web app that has some very tangled code-behind pages which need to be addressed.&amp;#160; There are lots of items on the legacy app development wish list.&amp;#160; Near the top, we have a strong desire to pull .NET 1.1 custom components out of our legacy app and replace them with our .NET 2.0 custom components.&amp;#160; It would be wonderful if we only had to switch references to affect this change, but there are too many barriers in our code to a solution that simple.&amp;#160; Another wish list item is testability, which means our code has to be restructured in such a way as to make it easily testable.&amp;#160; If we tried to do all of this at one time we would most assuredly fail.&amp;#160; Instead, we have to approach the problem with a series of smaller steps with an eye toward refactoring large pages over multiple iterations.&lt;/p&gt;  &lt;p&gt;The ParticipantDetails.aspx.cs file is a good example of a code-behind file that has grown large and cumbersome: it has 3384 lines of code in it.&amp;#160; It has many long methods in it, the longest of which is GetParticipant() at nearly 900 lines.&amp;#160; This method essentially does three things: &lt;/p&gt;  &lt;p&gt;&amp;#160; 1) fetches participant info from the database, &lt;/p&gt;  &lt;p&gt;&amp;#160; 2) formats that data for display, and &lt;/p&gt;  &lt;p&gt;&amp;#160; 3) assigns formatted data to the appropriate controls on the page.&amp;#160; &lt;/p&gt;  &lt;p&gt;To deal with this page, and particularly long methods like GetParticipant(), I approached it with three goals for this iteration: &lt;/p&gt;  &lt;p&gt;&amp;#160; 1) make the methods much smaller, each focused on a single task, and therefore more easily readable and maintainable,&lt;/p&gt;  &lt;p&gt;&amp;#160; 3) move the persistence coupling entirely out of this page, and instead couple the page to a set of Data Transfer Objects, and&lt;/p&gt;  &lt;p&gt;&amp;#160; 2) apply the MVP pattern to this page to move as much code as possible into more testable classes.&lt;/p&gt;  &lt;p&gt;I used ReSharper extensively for this refactor, particularly the Extract Method feature.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Small Methods&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;At 900 lines, GetParticipant() is extremely difficult to read, and even more difficult to modify correctly.&amp;#160; It&#39;s easy to believe that the primary purpose of writing code is to allow the developer to give operational commands to a computer.&amp;#160; We have to change our thinking here: that&#39;s the secondary purpose.&amp;#160; The code we write is a living document that contains business information.&amp;#160; The primary purpose I have when writing code is to create a document that allows me and you and everyone of our developers to communicate about how our company does business.&amp;#160; A 900 line method conceals that information by adding noise.&amp;#160; We reduce that noise and strengthen the real message of our code by separating concerns into multiple methods and classes.&amp;#160; (By the way, this has the nice side effect of breaking dependencies and reducing coupling, which will make our code much easier to change in the future.)&lt;/p&gt;  &lt;p&gt;Granted, we will end up with &amp;quot;class explosion&amp;quot;.&amp;#160; But the alternative is what we have now: &amp;quot;method bloat&amp;quot;.&amp;#160; A code base with many small classes containing small methods is much easier to maintain than a few huge classes with very long methods.&amp;#160; How long is too long?&amp;#160; I like to be able to see every line of a method on one screen.&amp;#160; I have a rule of thumb called the &amp;quot;head rule&amp;quot;: if I can&#39;t fit the whole method in my head, it&#39;s too long.&amp;#160; How much can I fit in my head?&amp;#160; Well, if I&#39;m looking at the method on my screen and I hold my head next to it, if the method is longer than my head then it&#39;s too long. J&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Data Transfer Object (DTO)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A Data Transfer Object (DTO), as the pattern is described by Martin Fowler, is &amp;quot;an object that carries data between processes in order to reduce the number of method calls&amp;quot;.&amp;#160; A DTO contains nothing but simple properties, no business logic inside the getters and setters for each property, and no methods at all.&amp;#160; I used ReSharper to help me create a DTO called ParticipantDetailsDTO.&amp;#160; &lt;/p&gt;  &lt;p&gt;I started by declaring an ParticipantDetailsDTO variable at the top of the method.&amp;#160; ReSharper immediately notices that I don&amp;#8217;t have a class called ParticipantDetailsDTO in my solution and turns the new class name red.&amp;#160; When put my cursor on the class name and click Alt+Enter, a menu appears that offers to create a new ParticipantDetailsDTO class for me.&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://dalesmithtx.googlepages.com/ReSharperCreateClassMenu.jpg&quot; /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I lucked out a bit when it was time to fill out the DTO.&amp;#160; Most of the controls on the page are hydrated from private variables rather than directly from the Business 1.1 objects.&amp;#160; My next step was to delete the declarations of those private variables.&amp;#160; When I did that, ReSharper turned the variable names red wherever they appeared in the method.&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://dalesmithtx.googlepages.com/ParticipantBefore.jpg&quot; /&gt; &lt;/p&gt;  &lt;p&gt;.&lt;/p&gt;  &lt;p&gt;.&lt;/p&gt;  &lt;p&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://dalesmithtx.googlepages.com/ParticipantBefore2.jpg&quot; /&gt; &lt;/p&gt;  &lt;p&gt;Then, I prefixed every bad variable with &amp;#8220;participantDetailsDTO&amp;#8221;.&amp;#160; Resharper asked me if I wanted to create a new property in ParticipantDetailsDTO called &amp;#8220;strAsstEmail&amp;#8221;.&amp;#160; I took Resharper&amp;#8217;s advice, and I worked my way through the whole method this way, filling out the ParticipantDetailsDTO class with new properties as I needed them.&amp;#160; I also changed the property names to make them a bit more readable: e.g., strAsstEmail became AssistantEmail.&amp;#160; Since the participant concept contains collections of other things (like Groups, Jobs, Specialties, etc.), I ended up needing several other DTOs.&amp;#160; ParticipantDetailsDTO now contains List&amp;lt;T&amp;gt; properties for those collections.&amp;#160; At the end of this process, all the controls on the page were dependent on DTOs rather than individual private variables.&amp;#160; I had created a &lt;strong&gt;&lt;em&gt;seam -&lt;/em&gt;&lt;/strong&gt; I&#39;m sure I&#39;m not using that term as strictly as Michael Feathers intended, but I think the idea is similar: a specific place in my class meant to be moved or otherwise modified without affecting the rest of the class.&lt;/p&gt;  &lt;p&gt;From there, still in the page code-behind, I started pulling similar code together: anything that was concerned with hydrating participantDetailsDTO got moved into a separate method.&amp;#160; Same with all the other DTOs: each got its own method.&amp;#160; This was a bit tricky.&amp;#160; Sometimes I ran into code that decided how certain property values should be set.&amp;#160; I had to be careful to preserve this code.&amp;#160; But at the end of it, I had a number of methods that were all about hydrating the participantDetailsDTO and its collections.&amp;#160; So I put them all into a class called ParticipantDetailsDTORepository and moved that class into the Vega.Common assembly.&amp;#160; I also created an interface for it called IParticipantDetailsDTORepository &amp;#8211; more about that in a minute.&amp;#160; I ended up with something like this:&lt;/p&gt;  &lt;p&gt;&lt;img height=&quot;461&quot; src=&quot;http://dalesmithtx.googlepages.com/ParticipantDetailsDiag1.jpg&quot; width=&quot;730&quot; /&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This is just a quick sketch, but I think you can see the bones of the design.&amp;#160; This implementation of the IParticipantDetailsDTORepository works only with the .NET 1.1 components.&amp;#160; IParticipantDetailsDTORepository contains a method called GetParticipantDetailsDTO(int participantId).&amp;#160; When the time comes to switch this page over to the .NET 2.0 Business Components, we&amp;#8217;ll write a new implementation of this repository interface that pulls participant info from the BC components.&amp;#160; That should be a goal in our next iteration.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Model View Presenter (MVP)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;So we&amp;#8217;ve moved our participant fetch logic out of the code-behind.&amp;#160; And obviously the code that assigns values to page controls has to stay in the code-behind (&lt;i&gt;or does it?&lt;/i&gt;).&amp;#160; But I see no reason for the data formatting code to remain here.&amp;#160; This is where the model view presenter (MVP) pattern comes in.&amp;#160; I declared an empty IParticipantDetailsView and made the page inherit from it.&amp;#160; I also created a ParticipantDetailsPresenter class in Vega.Common &amp;#8211; this is where I put all the formatting logic, and pretty much any other logic that wasn&amp;#8217;t directly concerned with hydrating page controls.&amp;#160; I made heavy use of Resharper&amp;#8217;s Extract Method feature here.&amp;#160; So now we also have something like this:&lt;/p&gt;  &lt;p&gt;&lt;img src=&quot;http://dalesmithtx.googlepages.com/ParticipantDetailsDiag2.jpg&quot; /&gt; &lt;/p&gt;  &lt;p&gt;It is actually possible, and even desirable, to move control-hydration code into the presenter, but I didn&amp;#8217;t go that far.&amp;#160; I would love to go that direction and show it all under unit tests, but I didn&amp;#8217;t have time in this post.&amp;#160; &lt;/p&gt;  &lt;p&gt;We&#39;re not done yet.&amp;#160; There is still much more we can do to simplify this page.&amp;#160; But the result so far is that the persistence-related code has been moved out into testable classes, the ParticipantDetails code-behind is now about 1200 lines instead of more than 3300, the code is much easier to read and understand, and we have an upgrade path to more easily switch out our persistence mechanism when we&#39;re ready.&amp;#160; Next time, I&#39;ll talk about testing to detect change to ensure that the DTO built from the new persistence mechanism is the same as from the original mechanism.&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;bookmark_title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;ti=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;title=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html&amp;amp;t=Refactoring Legacy ASP.NET Code-Behind with ReSharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  &lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:25b8174e-d89b-4840-bf11-8c282d95498f&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/ASP.NET&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/c#&quot; rel=&quot;tag&quot;&gt;c#&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Patterns&quot; rel=&quot;tag&quot;&gt;Patterns&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Refactoring&quot; rel=&quot;tag&quot;&gt;Refactoring&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/ReSharper&quot; rel=&quot;tag&quot;&gt;ReSharper&lt;/a&gt;&lt;/div&gt;  </description><link>http://creedcultcode.blogspot.com/2008/10/refactoring-legacy-aspnet-code-behind.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-8377502393287574978</guid><pubDate>Sun, 28 Sep 2008 03:00:00 +0000</pubDate><atom:updated>2008-10-14T20:20:02.828-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">NDepend</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>NDepend, or a Young .NET Programmer&amp;#39;s Illustrated Primer</title><description>&lt;h4&gt;&lt;strong&gt;Bootstraps&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;I have said before that I have no axe to grind against Microsoft, and I stand by that.&amp;#160; They set out long ago to have a computer on every desktop and Microsoft software running on every computer.&amp;#160; They have gone a long way towards achieving that goal, and in the process they have brought value to more people than I can count.&amp;#160; Since their inception they have produced operating systems, languages, and development tools that have allowed people without computer science backgrounds to learn how to program computers to do actual stuff.&amp;#160; &lt;/p&gt;  &lt;p&gt;Now, granted, Microsoft has promoted development techniques that are much more in line with their own marketing plans than with sound design principles.&amp;#160; But I cannot think of a time during Microsoft&#39;s existence when information about sound design principles was unavailable, or when Microsoft has ever actively sought to squelch that information.&amp;#160; And I&#39;m old.&lt;/p&gt;  &lt;p&gt;I guess my point is this: Microsoft has produced some really nice tools, and it&#39;s up to me as a developer to use those tools wisely.&amp;#160; But it&#39;s also up to me to find other tools and techniques that help me to be more effective as a developer.&amp;#160; I feel a constant call to improve myself as a developer.&amp;#160; I also feel a call to watch old Twilight Zone episodes on YouTube.&amp;#160; But that first call is still there, and I respond to it too.&amp;#160; I certainly benefit from my efforts to learn and grow, and my team benefits from my efforts as well.&amp;#160; And ultimately, so does my company.&lt;/p&gt;  &lt;p&gt;Many companies I have worked for have thought of their developers as commodities, particularly those who use Microsoft technologies.&amp;#160; Approaching hiring, training, and project management practices from a commodity perspective has lead to commodity behavior in many developers: one MCP is as good as another; it Microsoft didn&#39;t invent it, it can&#39;t be good; we&#39;re all &amp;quot;human resources&amp;quot; rather than &amp;quot;personnel&amp;quot;.&amp;#160; &lt;/p&gt;  &lt;p&gt;If you&#39;re in this situation, I have good news for you: you can take the red pill.&amp;#160; You don&#39;t have to wait for your employer to educate you about your chosen profession.&amp;#160; You can take the grass by the roots and educate yourself.&amp;#160; There are tons of resources out there for you.&amp;#160; One of those resources is a great little tool called &lt;a href=&quot;http://www.ndepend.com&quot; target=&quot;_blank&quot;&gt;NDepend&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;A Real-World Example&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;The purpose of NDepend is to give you views into the actual structure of your software, regardless of how you intended to design it, that you would otherwise be unaware of.&amp;#160; By blindly following the herd rather than thinking about long term design consequences, we often end up with some silly, expensive situations.&amp;#160; NDepend can help us pinpoint the details of those situations so that we can address them.&lt;/p&gt;  &lt;p&gt;A while back Chad Myers posted about &lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/archive/2008/07/15/project-anti-pattern-many-projects-in-a-visual-studio-solution-file.aspx&quot; target=&quot;_blank&quot;&gt;the hazards of having WAAAAAAYYYYYY too many projects in a single solution file&lt;/a&gt;. I have wanted to write a post on NDepend for a while now.&amp;#160; &lt;a href=&quot;http://blog.andreloker.de/post/2008/07/08/NDepend-code-metrics-at-your-service.aspx&quot; target=&quot;_blank&quot;&gt;Others have already written better overviews than I could produce&lt;/a&gt;.&amp;#160; And the NDepend tool itself ships with a whole host of how-to&#39;s in its documentation.&amp;#160; Instead, I want to write about how we use NDepend at my office to address problems like those Chad describes, and that will probably take more than one post.&lt;/p&gt;  &lt;p&gt;At my office we definitely suffer from the malady Chad describes.&amp;#160; Our problem started innocently enough: years ago, we thought that we should package our API so granularly that we could deploy different pieces of it in an easy and atomic way.&amp;#160; Well, it has proven not to be easy, but it is certainly atomic.&amp;#160; And not in the good way.&amp;#160; As we have added to our codebase over the years, we kept following the idea of many granular assemblies, but we somehow lost sight of the goal of easy deployment, and we ignored our need for maintainability.&amp;#160; We now have a single solution file for assemblies meant to be shared among multiple applications that has nearly 150 projects in it.&amp;#160; NEARLY 150!!!&amp;#160; How do you even start to address a situation like that?&amp;#160; Step 1 is admitting you have a problem.&amp;#160; So first, we&#39;ll consolidate our assemblies, and manage our code with namespaces and project folders.&amp;#160; But that&#39;s the subject of another post.&lt;/p&gt;  &lt;p&gt;Step 2 is finding dead code and eliminating it, and that&#39;s the subject of this post.&amp;#160; My problem here is that I&#39;m under an NDA, so I can&#39;t show you details of the real situation, although I would love to.&amp;#160; Instead here&#39;s a very trivial example to illuminate a couple of concepts: &lt;a href=&quot;http://dalesmithtx.googlepages.com/CouplingExample.zip&quot; target=&quot;_blank&quot;&gt;download&lt;/a&gt;.&amp;#160; At work, I&#39;ve got a (HUGE!) set of shared assemblies, and a couple of apps that consume those assemblies.&amp;#160; So my example contains code meant to represent a situation like that: the CouplingExample assembly is the stand-in for the shared assemblies, and the CouplingExample.ConsoleApplication and CouplingExample.UnitTests assemblies represent the apps that depend on our shared assemblies.&lt;/p&gt;  &lt;p&gt;NDepend ships with a SQL-like scripting language called Code Query Language (CQL).&amp;#160; CQL allows you to write custom queries about the assemblies you&#39;re analyzing based on several different kinds of code metrics.&amp;#160; NDepend ships with a bunch of pre-built CQL queries to give you a good starting place for cracking into your code.&amp;#160; Since I&#39;m trying to kill dead code, the metric I&#39;m particularly interested in is &lt;a href=&quot;http://www.ndepend.com/Metrics.aspx#MethodCa&quot; target=&quot;_blank&quot;&gt;afferent coupling&lt;/a&gt;, or actually the lack of it.&amp;#160; For CouplingExample, I want to know which methods in the CouplingExample assembly have no methods that depend directly on them.&amp;#160; I&#39;m interested in non-public methods - it&#39;s a pretty safe bet that any non-publicly accessible method in my assembly that has nothing depending on it is dead code, and can therefore be eliminated.&amp;#160; But I&#39;m also interested in public methods with an afferent coupling of zero.&amp;#160; Since I know all the applications that consume my shared assemblies, I can include those app assemblies in the same NDepend project.&amp;#160; I can narrow down the scope of my CQL query just by including an ASSEMBLIES list.&amp;#160; I swiped NDepend&#39;s canned &amp;quot;Potentially unused methods&amp;quot; query, and bent it to my own bidding like so:&lt;/p&gt;  &lt;div&gt;   &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;     &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #008000&quot;&gt;// &amp;lt;Name&amp;gt;Potentially unused shared assembly methods&amp;lt;/Name&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; WARN IF Count &amp;gt; 0 IN SELECT TOP 10 METHODS FROM ASSEMBLIES &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;CouplingExample&amp;quot;&lt;/span&gt;  WHERE &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;  MethodCa == 0 AND            &lt;span style=&quot;color: #008000&quot;&gt;// Ca=0 -&amp;gt; No Afferent Coupling -&amp;gt; The method is not used in the context of this application.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;  !IsEntryPoint AND            &lt;span style=&quot;color: #008000&quot;&gt;// Main() method is not used by-design.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;  !IsExplicitInterfaceImpl AND &lt;span style=&quot;color: #008000&quot;&gt;// The IL code never explicitely calls explicit interface methods implementation.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;  !IsClassConstructor AND      &lt;span style=&quot;color: #008000&quot;&gt;// The IL code never explicitely calls class constructors.&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;  !IsFinalizer                 &lt;span style=&quot;color: #008000&quot;&gt;// The IL code never explicitely calls finalizers.&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;My NDepend project contains the shared assembly and the application assemblies that consume it.&amp;#160; But this query only looks at methods in the CouplingExample assembly.&amp;#160; When I run the query, NDepend paints a pretty picture of my code for me.&amp;#160; Here&#39;s a context map showing all the assemblies I analyzed, and highlighting the methods in the CouplingExample assembly that have no other methods depending on them, either internally inside CouplingExample, or externally from the UnitTests and ConsoleApplication assemblies:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&lt;a href=&quot;http://lh5.ggpht.com/dalesmithtx/SN7zYuJYL7I/AAAAAAAAAFU/iMcYOpGAu-c/s1600-h/coupling_example_ndepend%5B8%5D.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;151&quot; alt=&quot;coupling_example_ndepend&quot; src=&quot;http://lh4.ggpht.com/dalesmithtx/SN7zYwhiOkI/AAAAAAAAAFY/WdoFkO1FS7o/coupling_example_ndepend_thumb%5B6%5D.jpg?imgmax=800&quot; width=&quot;706&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;You can easily see which methods have no other methods depending on them, the ones in bright blue (and conveniently named &amp;quot;Public_no_afferent_coupling()&amp;quot; and &amp;quot;Private_no_afferent_coupling()&amp;quot;). Back in real life, I used the query above with all 140+ assembly names in it pointed at my shared assemblies and the consuming app assemblies.&amp;#160; Here&#39;s a scrubbed version of the resulting context map:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&lt;a href=&quot;http://lh3.ggpht.com/dalesmithtx/SN7zZQ6T53I/AAAAAAAAAFc/E_561fOOEXE/s1600-h/unused_methods_NDA%5B7%5D.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;172&quot; alt=&quot;unused_methods_NDA&quot; src=&quot;http://lh4.ggpht.com/dalesmithtx/SN7zZtdnN9I/AAAAAAAAAFg/5vVrLd1DY0I/unused_methods_NDA_thumb%5B5%5D.jpg?imgmax=800&quot; width=&quot;704&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Look at that!&amp;#160; Tangled up in blue!&amp;#160; Literally THOUSANDS of lines of code we can just drop.&amp;#160; What a great feeling.&amp;#160; I ran this picture by people in our group who, unlike me, actually have authority to buy stuff.&amp;#160; Almost immediately, they put a line item in the budget for 10 NDepend licenses.&amp;#160; This thing sells itself.&amp;#160; And I feel confident that once more of our developers have begun to use it, we&#39;ll end up buying a license for everyone in the group.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;This one little query for dead code is just the very top snowflake on the tip of the iceberg.&amp;#160; NDepend gives you a myriad of insights into how your code actually works, empowering you to make it better, and educating you on how to create better designs in the future.&amp;#160; A really cool feature of NDepend is its integration with Visual Studio: if you include the .pdb files in the NDepend project, you can just double-click on a method to bring it up in Visual Studio.&amp;#160; I&#39;m a ReSharper nut - I think &lt;a href=&quot;http://codebetter.com/blogs/patricksmacchia/&quot; target=&quot;_blank&quot;&gt;Patrick Smacchia&lt;/a&gt; hit the nail on the head when he said that what ReSharper does for you on a micro-level, NDepend does for you on a macro-level.&amp;#160; But the code metric analysis NDepend offers also puts it in a different realm than a refactoring tool like ReSharper.&amp;#160; I think these two tools make a very powerful team together.&amp;#160; Next time, I&#39;ll talk a bit about how we are beginning to use ReSharper to address situations like this one that NDepend illuminated for us.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;We are now (finally!) giving attention to cleaning up messy old code.&amp;#160; As we move along, I hope to write about other examples of how we change our code after examining it with NDepend, so stay tuned.&amp;#160; This kind of stuff isn&#39;t only for the uber-geeks, it&#39;s for the day-to-day programmer who wants to improve skills, improve code, and deliver better products.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;
&lt;span class=&quot;sbmLink&quot;&gt;
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;bookmark_title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;ti=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;title=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html&amp;amp;t=NDepend, or a Young .NET Programmer&#39;s Illustrated Primer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;

&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:16f3ace8-a18f-47bc-ba21-01fff450748a&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/ASP.NET&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/c#&quot; rel=&quot;tag&quot;&gt;c#&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/NDepend&quot; rel=&quot;tag&quot;&gt;NDepend&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Patterns&quot; rel=&quot;tag&quot;&gt;Patterns&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Tools&quot; rel=&quot;tag&quot;&gt;Tools&lt;/a&gt;&lt;/div&gt;  </description><link>http://creedcultcode.blogspot.com/2008/09/ndepend-or-young-net-programmer.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/dalesmithtx/SN7zYwhiOkI/AAAAAAAAAFY/WdoFkO1FS7o/s72-c/coupling_example_ndepend_thumb%5B6%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-4064169049384212903</guid><pubDate>Sun, 17 Aug 2008 06:24:00 +0000</pubDate><atom:updated>2008-10-14T20:22:13.363-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><category domain="http://www.blogger.com/atom/ns#">StructureMap</category><title>Boba Fett, Greedo, and StructureMap</title><description>&lt;p&gt;&amp;quot;&lt;i&gt;Austin, Texas. You will never find a more wretched hive of scum and villainy. We must be cautious.&lt;/i&gt;&amp;quot;&lt;/p&gt;  &lt;p&gt;These words were uttered by an inhabitant of the the wastelands around Austin.&amp;#160; Shrouded in mystery, most people think he&#39;s nothing more than a crazy old wizard.&amp;#160; He keeps to himself mostly, occasionally seen associating with &lt;a href=&quot;http://altdotnet.org/&quot; target=&quot;_blank&quot;&gt;the lowest sort of riff-raff&lt;/a&gt;, and forever spouting &lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/archive/2006/08/07/148071.aspx&quot; target=&quot;_blank&quot;&gt;mumbo-jumbo&lt;/a&gt; about some &lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/archive/tags/Test+Driven+Development/default.aspx&quot; target=&quot;_blank&quot;&gt;bizarre religion&lt;/a&gt; he follows.&amp;#160; But there are those who know his true identity, that he is in fact the legendary Jedi &lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/default.aspx&quot; target=&quot;_blank&quot;&gt;Obi-Wan Kejeremy&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ahhh, forget it.&amp;#160; I just can&#39;t keep up the extended metaphor anymore.&amp;#160; In keeping with &lt;a href=&quot;http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&quot; target=&quot;_blank&quot;&gt;my last post&lt;/a&gt;, I was going to go into some long, labored Star-Warsy exposition about Jeremy&#39;s new padawans, &lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/default.aspx&quot; target=&quot;_blank&quot;&gt;Chad&lt;/a&gt; and &lt;a href=&quot;http://flimflan.com/blog/default.aspx&quot; target=&quot;_blank&quot;&gt;Josh&lt;/a&gt;, and the work they&#39;ve done with him on a secret weapon called &lt;a href=&quot;http://structuremap.sourceforge.net/Default.htm&quot; target=&quot;_blank&quot;&gt;StructureMap&lt;/a&gt;.&amp;#160; But it&#39;s late, I&#39;m tired, and I want to finish this post tonight, so let&#39;s just skip right to the point, mmmmm-kay?&amp;#160; I took the code I wrote for the last post and used StructureMap to decouple things a bit further after reading through Chad&#39;s articles (&lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/archive/2008/07/15/structuremap-basic-scenario-usage.aspx&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/archive/2008/07/17/structuremap-medium-level-usage-scenarios.aspx&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;) as well as a bunch of stuff Jeremy has written about StructureMap.&amp;#160; Since there are still those among us who are fashionably late to the .NET 3.5 party, I used StructureMap 2.0.&amp;#160; I also thought a bit more about the design and changed some things around after looking at &lt;a href=&quot;http://flimflan.com/blog/HelloStructureMap.aspx&quot; target=&quot;_blank&quot;&gt;Josh&#39;s code&lt;/a&gt; (and, let&#39;s be honest, outright stealing some of his code).&amp;#160; And no, I didn&#39;t write tests for this stuff, and yes, I know that makes me a lazy jerk.&amp;#160; See sentence four in this paragraph.&lt;/p&gt;  &lt;p&gt;So here&#39;s how the Program class changed:&lt;/p&gt;  &lt;div&gt;   &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;     &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Program&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;         Configure();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;         IAppEngine appEngine = ObjectFactory.GetInstance&amp;lt;IAppEngine&amp;gt;();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;         appEngine.Run();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Configure()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         StructureMapConfiguration.UseDefaultStructureMapConfigFile = &lt;span style=&quot;color: #0000ff&quot;&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;         StructureMapConfiguration.BuildInstancesOf&amp;lt;IAppEngine&amp;gt;().TheDefaultIsConcreteType&amp;lt;AppEngine&amp;gt;();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;         StructureMapConfiguration.BuildInstancesOf&amp;lt;IOutputDisplay&amp;gt;().TheDefaultIsConcreteType&amp;lt;ConsoleOutputDisplay&amp;gt;();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;         StructureMapConfiguration.BuildInstancesOf&amp;lt;IStuffStrategy&amp;gt;().TheDefaultIsConcreteType&amp;lt;LitterOfKittens&amp;gt;();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;         StructureMapConfiguration.BuildInstancesOf&amp;lt;IDrinkingEstablishment&amp;gt;()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;             .TheDefaultIs(&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;             Registry.Instance&amp;lt;IDrinkingEstablishment&amp;gt;()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;                 .UsingConcreteType&amp;lt;Cantina&amp;gt;()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;                 .WithProperty(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;name&amp;quot;&lt;/span&gt;).EqualTo(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Mos Eisley Cantina&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;             );&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I love it!&amp;#160; That Configure() method allowed me to break almost every dependency.&amp;#160; The only time I&#39;m actually using the &lt;font face=&quot;Courier&quot; color=&quot;#0000ff&quot; size=&quot;2&quot;&gt;new&lt;/font&gt; keyword is in the AppEngine (lines 15 and 22), and if I weren&#39;t falling asleep I could probably figure out a way to get rid of it there too.&lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; AppEngine : IAppEngine&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; IDrinkingEstablishment _drinkingEstablishment;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; IOutputDisplay _outputDisplay;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; AppEngine(IDrinkingEstablishment drinkingEstablishment, IOutputDisplay outputDisplay)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;         _drinkingEstablishment = drinkingEstablishment;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;         _outputDisplay = outputDisplay;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Run()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;         GetANewPatron(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Boba Fett&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;         _drinkingEstablishment.SetStuffStrategy(200, &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; ConfusionOfWeasels());&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;         GetANewPatron(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Greedo&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;         _outputDisplay.Get();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetANewPatron(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;         IPatron patron = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; BountyHunter(name);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;         _drinkingEstablishment.WelcomePatron(patron);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;foreach&lt;/span&gt; (IStuff thing &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; patron.Basket)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt;             _outputDisplay.Put(thing.DoSomething(patron));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;So, without further adieu, you can download my little experiment and peruse it to your heart&#39;s content if you just &lt;a href=&quot;http://dalesmithtx.googlepages.com/StrategyPatternWithStructureMap.zip&quot; target=&quot;_blank&quot;&gt;click right here&lt;/a&gt;.&amp;#160; Laugh at it all you want to.&amp;#160; I&#39;ll be asleep.&lt;/p&gt;
&lt;span class=&quot;sbmLink&quot;&gt;
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;bookmark_title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;ti=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;title=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html&amp;amp;t=Boba Fett, Greedo, and StructureMap&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;

&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:416d12dd-799f-4098-8a3c-78afba153d94&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/c#&quot; rel=&quot;tag&quot;&gt;c#&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Patterns&quot; rel=&quot;tag&quot;&gt;Patterns&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/StructureMap&quot; rel=&quot;tag&quot;&gt;StructureMap&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Star%20Wars&quot; rel=&quot;tag&quot;&gt;Star Wars&lt;/a&gt;&lt;/div&gt;  </description><link>http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-structuremap.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-6330793165634964578</guid><pubDate>Sat, 16 Aug 2008 09:13:00 +0000</pubDate><atom:updated>2008-10-14T20:23:52.781-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">Patterns</category><title>Boba Fett, Greedo, and the Strategy Pattern</title><description>&lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/dalesmithtx/SKaaKSOQ0PI/AAAAAAAAAEE/hs5T0Fa0WCY/s1600-h/bobafett%5B2%5D.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;112&quot; alt=&quot;bobafett&quot; src=&quot;http://lh6.ggpht.com/dalesmithtx/SKaaKTHWHDI/AAAAAAAAAEI/hlfHaNBy0IY/bobafett_thumb.jpg?imgmax=800&quot; width=&quot;131&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; Bounty hunting is a difficult line of work.&amp;#160; Think about it:&amp;#160; 1) Jobs are generally consulting gigs rather than full-time employment.&amp;#160;&amp;#160; 2) You&#39;re brought in at the last minute, usually to clean up someone else&#39;s mess, under a lot of pressure to save the day.&amp;#160; 3) There are long hours, difficult problems to solve, and any benefits or vacation days come out of your own back pocket.&amp;#160; So give Boba Fett and Greedo a little respect.&amp;#160; They&#39;re willing to go flying off to the seedy backwaters of the galaxy, at great personal expense, mind you, turning over every stone until they find the Rebel scum they&#39;ve been told to bring in.&amp;#160; All because the megalomaniacal creeps they work for run huge bureaucratic organizations filled with nothing but boot-licking sycophants and lackeys who can&#39;t seem to catch one measly smuggler and his smelly walking-carpet sidekick.&amp;#160; And if they should happen to run across this smuggler, who knows what kind of lethal stunt this half-witted, scruffy-looking nerf herder is liable to pull to get away from them.&amp;#160; Here&#39;s just one example: &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/dalesmithtx/SKaaK_TPm5I/AAAAAAAAAEM/YgJnmlSz9sw/s1600-h/image%5B10%5D.png&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;237&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/dalesmithtx/SKaaLJn520I/AAAAAAAAAEQ/uLNyk8KGQNY/image_thumb%5B4%5D.png?imgmax=800&quot; width=&quot;494&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Shocking, isn&#39;t it?&amp;#160; I know.&amp;#160; It&#39;s called the &lt;a href=&quot;http://www.dofactory.com/Patterns/PatternStrategy.aspx&quot; target=&quot;_blank&quot;&gt;StrategyPattern&lt;/a&gt;, and if you&#39;re not looking out for it, well you might just end up with some brand new ventilation courtesy of Han&#39;s blaster.&amp;#160; Here&#39;s how it works: &lt;/p&gt;  &lt;p&gt;Let&#39;s say you find yourself in a particular context, like, say, a cantina on a desert planet.&amp;#160; Bartender gives you a drink, and you&#39;re parched, so you reach for it.&amp;#160; But wait!!&amp;#160; Is that beaker really filled with good old Membrosia?&amp;#160; How do you know nobody has slipped the bartender a couple hundred galactic credits along with a bottle marked &amp;quot;Membrosia&amp;quot;, but which is really heavily spiked with carsunum?&amp;#160; What does the bartender care?&amp;#160; All he knows is he gets a free bottle and two hundred credits out of the deal - makes no difference to him.&amp;#160; People keel over in his place all the time.&amp;#160; Seems like a pretty good &lt;em&gt;&lt;strong&gt;strategy&lt;/strong&gt;&lt;/em&gt; for knocking you off, wouldn&#39;t you say? &lt;/p&gt;  &lt;p&gt;Here&#39;s another strategy pattern scenario I bet you didn&#39;t think about:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/dalesmithtx/SKaaLTfDm2I/AAAAAAAAAEU/SkZIuOMUJxQ/s1600-h/image%5B17%5D.png&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;233&quot; alt=&quot;image&quot; src=&quot;http://lh3.ggpht.com/dalesmithtx/SKaaLwrJ9tI/AAAAAAAAAEY/Y-tIj_43wks/image_thumb%5B9%5D.png?imgmax=800&quot; width=&quot;492&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Boba Fett is a bounty hunter.&amp;#160; &lt;/p&gt;  &lt;div&gt;   &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;     &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; BountyHunter : ICantinaPatron&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; IList&amp;lt;IStuff&amp;gt; _basket = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; List&amp;lt;IStuff&amp;gt;();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; BountyHunter(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;         _name = name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _name; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; IList&amp;lt;IStuff&amp;gt; Basket&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;         get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _basket; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;He happens to walk into the Mos Eisley cantina on a day when they&#39;re giving away stuff to all the cantina patrons: today, it&#39;s fuzzy animals. (Don&#39;t ask me.&amp;#160; Some corporate marketing idiot from the cantina&#39;s Membrosia distributor thought it would be a good promotional gimmick.)&amp;#160; &lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Cantina&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; _bribe;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; StuffStrategy _stuffStrategy = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; LitterOfKittens();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; AcceptBribe(&lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; bribe)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;         _bribe = bribe;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; SetStuffStrategy(StuffStrategy stuffStrategy)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; (_bribe &amp;gt; 100) _stuffStrategy = stuffStrategy;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; ICantinaPatron GetPatron(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;         ICantinaPatron cantinaPatron = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; BountyHunter(name);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;         _stuffStrategy.GetStuff(cantinaPatron);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; cantinaPatron;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; StuffStrategy&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetStuff(ICantinaPatron cantinaPatron);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;interface&lt;/span&gt; IStuff&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; DoSomething(ICantinaPatron patron);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;interface&lt;/span&gt; IFuzzyAnimal : IStuff&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Name { get; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; MakeNoise();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Play();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt;&amp;#160; &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;So when Boba Fett takes his basket of stuff from the barkeep and opens it up to see what he got, he discovers a litter of adorable kittens named Blossom, Minty, Butterscotch, Cotton Candy, Blue Belle, Snuzzle, and Rainbow Dash.&lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Kitten : IFuzzyAnimal&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _playmate;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; Kitten(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;         _name = name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _name; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; MakeNoise()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;             &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Hi, &amp;quot;&lt;/span&gt; + _playmate + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;!  My name is &amp;quot;&lt;/span&gt; + _name +&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;             &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;, and I&#39;m a kitten!  Meow!  prrrrr  prrrrrrrrrrrr&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Play()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _name + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot; blinks her big grey eyes and paws &amp;quot;&lt;/span&gt; + _playmate + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;&#39;s finger adorably.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; DoSomething(ICantinaPatron patron)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt;         _playmate = patron.Name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; MakeNoise() + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt; + Play() + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; LitterOfKittens : StuffStrategy&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetStuff(ICantinaPatron cantinaPatron)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Blossom&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Minty&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Butterscotch&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  42:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Cotton Candy&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  43:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Blue Belle&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  44:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Snuzzle&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  45:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Kitten(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Rainbow Dash&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  46:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  47:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here&#39;s what happens when Boba Fett plays with each kitten, and it&#39;s just the cutest thing you&#39;ve ever seen.&amp;#160; Almost brings a tear to your eye:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/dalesmithtx/SKaaMCihcAI/AAAAAAAAAEc/9eCVvp-RYzs/s1600-h/image%5B22%5D.png&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;238&quot; alt=&quot;image&quot; src=&quot;http://lh6.ggpht.com/dalesmithtx/SKaaMjyl9YI/AAAAAAAAAEg/d-22pr9udAU/image_thumb%5B12%5D.png?imgmax=800&quot; width=&quot;644&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/dalesmithtx/SKaaM61Pt7I/AAAAAAAAAEk/CM6cGXo4oOc/s1600-h/greedo%5B2%5D.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;147&quot; alt=&quot;greedo&quot; src=&quot;http://lh6.ggpht.com/dalesmithtx/SKaaM1Jo5bI/AAAAAAAAAEo/LJlYImmMonI/greedo_thumb.jpg?imgmax=800&quot; width=&quot;128&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; Greedo is also a noble bounty hunter, but he has a dark secret: he just loves fuzzy, adorable kittens!&amp;#160; He&#39;s so excited when he sees what Boba Fett got that he completely forgets about the Strategy Pattern!&amp;#160; Oh no!&amp;#160; Greedo beware!&amp;#160; While Greedo is distracted, Han has slipped the barkeep a bribe along with another group of &amp;quot;fuzzy animals&amp;quot;:&lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;internal&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Program&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; Cantina _cantina;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; Main(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;         _cantina = &lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Cantina();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;         GetANewPatron(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Boba Fett&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;         _cantina.AcceptBribe(200);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;         _cantina.SetStuffStrategy(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; ConfusionOfWeasels());&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;         GetANewPatron(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Greedo&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;         Console.Read();&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetANewPatron(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;         ICantinaPatron patron = _cantina.GetPatron(name);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;         Console.WriteLine(patron.Name + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot; enters the cantina&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;foreach&lt;/span&gt; (IStuff thing &lt;span style=&quot;color: #0000ff&quot;&gt;in&lt;/span&gt; patron.Basket)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;             Console.WriteLine(thing.DoSomething(patron));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; Weasel : IFuzzyAnimal&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; _playmate;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; Weasel(&lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; name)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt;         _name = name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Name&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt;         get { &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _name; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  42:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  43:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  44:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; MakeNoise()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  45:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  46:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  47:&lt;/span&gt;             &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Hi, &amp;quot;&lt;/span&gt; + _playmate + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;!  My name is &amp;quot;&lt;/span&gt; + _name +&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  48:&lt;/span&gt;             &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;, and I&#39;m a weasel!  SSHHHHREEEIIIIKKKK!!!  HISSSSSSSS!!!!!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  49:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  50:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  51:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; Play()&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  52:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  53:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; _name + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot; rips &amp;quot;&lt;/span&gt; + _playmate + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot; a new orifice.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  54:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  55:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  56:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;string&lt;/span&gt; DoSomething(ICantinaPatron patron)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  57:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  58:&lt;/span&gt;         _playmate = patron.Name;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  59:&lt;/span&gt;         &lt;span style=&quot;color: #0000ff&quot;&gt;return&lt;/span&gt; MakeNoise() + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt; + Play() + &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;\r\n&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  60:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  61:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  62:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  63:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; ConfusionOfWeasels : StuffStrategy&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  64:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  65:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;override&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;void&lt;/span&gt; GetStuff(ICantinaPatron cantinaPatron)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  66:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  67:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Lefty&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  68:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;One Eye&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  69:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Sanchez&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  70:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Scar&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  71:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Ashes&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  72:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Blade&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  73:&lt;/span&gt;         cantinaPatron.Basket.Add(&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt; Weasel(&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;Rainbow Dash&amp;quot;&lt;/span&gt;));&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  74:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  75:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;What does poor Greedo get in his basket?&amp;#160; That&#39;s right: a really nasty confusion of weasels (that&#39;s the right term for a collection of weasels; I looked it up) named Lefty, One Eye, Sanchez, Scar, Ashes, Blade, and (oddly enough) Rainbow Dash!&amp;#160; Greedo flew halfway across the galaxy to bring Han back to Jabba, but instead here&#39;s what he gets for his troubles:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://lh4.ggpht.com/dalesmithtx/SKaaNcZgQtI/AAAAAAAAAEs/ft1qHWUXifA/s1600-h/image%5B26%5D.png&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;263&quot; alt=&quot;image&quot; src=&quot;http://lh4.ggpht.com/dalesmithtx/SKaaN20KhAI/AAAAAAAAAEw/KIfBxSa2Z-I/image_thumb%5B14%5D.png?imgmax=800&quot; width=&quot;679&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;So what&#39;s the morale of this tale?&amp;#160; If you&#39;re a galactic bounty hunter and you ever find yourself in a desert planet cantina that&#39;s giving away baskets of fuzzy animals, be super careful, because what you think is gonna be a litter of kittens might just turn out to be a confusion of weasels.&amp;#160; And, oh yeah, the Strategy Pattern is a good way to achieve some nice decoupling in your design.&amp;#160; But seriously, don&#39;t forget about the weasel part.&lt;/p&gt;
&lt;span class=&quot;sbmLink&quot;&gt;
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;bookmark_title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;ti=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;title=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html&amp;amp;t=Boba Fett, Greedo, and the Strategy Pattern&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;

&lt;div class=&quot;wlWriterSmartContent&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1c9ba00a-aa8b-4d45-b69a-cbdabff4e3cb&quot; style=&quot;padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px&quot;&gt;Technorati Tags: &lt;a href=&quot;http://technorati.com/tags/c#&quot; rel=&quot;tag&quot;&gt;c#&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Patterns&quot; rel=&quot;tag&quot;&gt;Patterns&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/StructureMap&quot; rel=&quot;tag&quot;&gt;StructureMap&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/Star%20Wars&quot; rel=&quot;tag&quot;&gt;Star Wars&lt;/a&gt;&lt;/div&gt;  </description><link>http://creedcultcode.blogspot.com/2008/08/boba-fett-greedo-and-strategy-pattern.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/dalesmithtx/SKaaKTHWHDI/AAAAAAAAAEI/hlfHaNBy0IY/s72-c/bobafett_thumb.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-1404080527925000200</guid><pubDate>Sat, 07 Jun 2008 03:45:00 +0000</pubDate><atom:updated>2008-10-14T18:19:19.971-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ReSharper</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Tracking Technical Debt in ReSharper - Follow-up</title><description>&lt;p&gt;Wow!&amp;#160; The good folks at &lt;a href=&quot;http://www.jetbrains.com&quot; target=&quot;_blank&quot;&gt;JetBrains&lt;/a&gt; found me and gave me a &lt;a href=&quot;http://blogs.jetbrains.com/dotnet/2008/05/talking-resharper-2/&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt;!&amp;#160; Thanks guys!&lt;/p&gt;  &lt;p&gt;If you remember, we&#39;re still in the land of waterfalls, where everything has a signature and an arbitrary deadline, and a long schedule littered with milestones instead of actual released software.&amp;#160; While marching toward that deadline, we&#39;ve built up a lot of techinical debt, and we&#39;ve been &lt;a href=&quot;http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&quot; target=&quot;_blank&quot;&gt;tracking it in ReSharper&lt;/a&gt; for about a month now.&amp;#160; Well the time has finally come when we think we can begin to pay off some of that debt.&amp;#160; We decided that since we had finished all, or at least most, of the features we set out to build that we could afford to spend some time focusing on those items we could have implemented better during development.&amp;#160; &lt;/p&gt;  &lt;p&gt;Our tracking scheme paid off quite nicely.&amp;#160; There was one refinement that helped some, a Live Template for a //DEBT tag, like so:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;//DEBT - &lt;font color=&quot;#800000&quot;&gt;$type$&lt;/font&gt;.&lt;font color=&quot;#800000&quot;&gt;$member$&lt;/font&gt; - &lt;font color=&quot;#000080&quot;&gt;$END$&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font color=&quot;#000080&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;The &lt;font color=&quot;#800000&quot;&gt;$type$&lt;/font&gt; variable is set to the &amp;quot;Containing type name&amp;quot; macro, and the &lt;font color=&quot;#800000&quot;&gt;$member$&lt;/font&gt; variable is set to the &amp;quot;Containing type member name&amp;quot; macro.&amp;#160; Did the same thing for the //HACK and //TODO tags.&amp;#160; We used the TODO Explorer to dump our //DEBT out to a list we could email around, and no matter how the list was sorted the type and member info made it easy to see where our //DEBT was.&amp;#160; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;I have to say, once we introduced the idea of tracking //DEBT right there in our code, it became really easy to convince other developers on our team to focus on completing features rather than get bogged down in endless optimization.&amp;#160; A little switch flipped in everyone&#39;s head once we realized that we could rely on our //DEBT list to remind us of things we need to come back to again.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;bookmark_title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;ti=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html&amp;amp;t=Tracking Technical Debt in ReSharper - Follow-up&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/06/tracking-technical-debt-in-resharper.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-5012541139039777550</guid><pubDate>Thu, 05 Jun 2008 05:48:00 +0000</pubDate><atom:updated>2008-06-04T22:51:46.996-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">YAML</category><title>Parsing YAML files in Ruby - Part 2</title><description>&lt;p&gt;I wish I had a clip reel I could roll after a dude with a really deep voice said, &amp;quot;Previously on Parsing YAML files in Ruby&amp;quot;.&amp;#160; But I don&#39;t.&amp;#160; So here&#39;s a &lt;a href=&quot;http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&quot; target=&quot;_blank&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ruby is Narnia.&amp;#160; I spend my real life in c#, a perfectly serviceable language.&amp;#160; I&#39;m comfortable there, I kind of know my way around, and I&#39;ve come to depend on it to make my living.&amp;#160; But when I have a few spare moments here and there, I get to wander off into this magical fairy-land and have adventures with strange and wonderful creatures.&amp;#160; Like the YAML.&amp;#160; In case you forgot what our YAML looks like, here he is:&lt;/p&gt;  &lt;div&gt;   &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;     &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; ---&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; shared paths:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;   build share : \\buildshare.mydomain.com\Builds&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt; local paths:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;   references  : \references&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt; custom assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;   - location: \Dev\Components\Business\Core\Trunk\Latest\Debug&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;     assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;       - name : MyNamespace.Core&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;         files:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;           - binary    : MyNamespace.Core.dll&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;           - debug     : MyNamespace.Core.pdb&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;           - document  : MyNamespace.Core.xml&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;       &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;   - location: \Dev\Components\Framework\Trunk\Debug&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;     assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;       - name : MyNamespace.Framework.Core&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;         files:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;           - binary    : MyNamespace.Framework.Core.dll&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;           - debug     : MyNamespace.Framework.Core.pdb&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;           - document  : MyNamespace.Framework.Core.xml&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt; vendor assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;   - location: \vendor\DotNet Commons\Logging\2.0&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt;     assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;       - name : Dotnet.Commons.Logging&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt;         files:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt;           - binary    : Dotnet.Commons.Logging.dll&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt; testing assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt;   - location: \vendor\Nunit\2.4.3&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt;     assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt;       - name : NUnit.Framework&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt;         files:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;           - binary    : nunit.framework.dll&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;         &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt;   - location: \vendor\Rhino.Mocks\3.3.0.906&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;     assemblies:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt;       - name : Rhino.Mocks&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  42:&lt;/span&gt;         files:&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  43:&lt;/span&gt;           - binary    : Rhino.Mocks.dll&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  44:&lt;/span&gt;           - document  : Rhino.Mocks.xml&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  45:&lt;/span&gt; ...&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Last time I told you how easy it was to access data in *.yml files in Ruby.&amp;#160; I&#39;ve taken idea that a little further, and I cooked up this class:&lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; require &lt;span style=&quot;color: #006080&quot;&gt;&#39;yaml&#39;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;class&lt;/span&gt; References&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;   attr_accessor :debug_mode&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;   def initialize(references_file_name=&lt;span style=&quot;color: #006080&quot;&gt;&#39;references.yml&#39;&lt;/span&gt;,debug_mode=&lt;span style=&quot;color: #0000ff&quot;&gt;true&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;     @refs = open(references_file_name) {|f| YAML.load(f) }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     @debug_mode = debug_mode&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt;   def shared_root_directory&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;     @refs[&lt;span style=&quot;color: #006080&quot;&gt;&#39;shared paths&#39;&lt;/span&gt;][&lt;span style=&quot;color: #006080&quot;&gt;&#39;build share&#39;&lt;/span&gt;]&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;   def get_filenames(assembly_list_name, *file_types)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;     get_node(@refs, assembly_list_name) &lt;span style=&quot;color: #0000ff&quot;&gt;do&lt;/span&gt; |assembly_list|&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;       assembly_list.each &lt;span style=&quot;color: #0000ff&quot;&gt;do&lt;/span&gt; |packing_list|&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;         get_node(packing_list, &lt;span style=&quot;color: #006080&quot;&gt;&#39;assemblies&#39;&lt;/span&gt;){|assembly| get_names(assembly, packing_list[&lt;span style=&quot;color: #006080&quot;&gt;&#39;location&#39;&lt;/span&gt;],file_types){|filename| &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; filename}}&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;       end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;     end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;   &lt;span style=&quot;color: #0000ff&quot;&gt;private&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;   def concatenate(*locators)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;     concatenated = String.&lt;span style=&quot;color: #0000ff&quot;&gt;new&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;     locators.each { |locator| concatenated &amp;lt;&amp;lt; (locator =~ /\A(?!\\)/ ? &lt;span style=&quot;color: #006080&quot;&gt;&#39;\\&#39; : &#39;&lt;/span&gt;&lt;span style=&quot;color: #006080&quot;&gt;&#39;) &amp;lt;&amp;lt; locator.sub(/\\\Z/, &#39;&lt;/span&gt;&lt;span style=&quot;color: #006080&quot;&gt;&#39;) }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;     return concatenated&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt;   def get_names(assembly, path,file_types)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt;     get_node(assembly, &#39;&lt;/span&gt;files&#39;) &lt;span style=&quot;color: #0000ff&quot;&gt;do&lt;/span&gt; |file| &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt;       parse_filenames(file,file_types){|filename| &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; concatenate(shared_root_directory,path,filename)}&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;     end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt;   def get_node(data_store, find_key)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;     &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; data_store[find_key] &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; data_store.kind_of? Hash&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt;     data_store.each{|node| get_node(node, find_key){|subnode| &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; subnode}} &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; data_store.kind_of? Array&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt;   def parse_filenames(file_node,file_types)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt;     file_node.keys.each {|key| &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; file_node[key] unless filter(key,file_types)} &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; file_node.kind_of? Hash&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt;     file_node.each{|element| parse_filenames(element,file_types){|&lt;span style=&quot;color: #0000ff&quot;&gt;value&lt;/span&gt;| &lt;span style=&quot;color: #0000ff&quot;&gt;yield&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;value&lt;/span&gt;}} &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; file_node.kind_of? Array&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;   def filter(key,file_types)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt;     (!@debug_mode &amp;amp;&amp;amp; key==&lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;debug&amp;quot;&lt;/span&gt;) || (!file_types.include?(key) unless file_types.empty?)&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt; end&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;With this References class, you can do something like this (pay attention - here&#39;s where it starts to get cool):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;refs = References.new
    &lt;br /&gt;refs.get_filenames(&amp;quot;custom assemblies&amp;quot;,&amp;quot;binary&amp;quot;){|filename| puts filename}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you get something like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;\\buildshare.mydomain.com\Builds\Dev\Components\Business\Core\Trunk\Latest\Debug\MyNamespace.Core.dll
    &lt;br /&gt;\\buildshare.mydomain.com\Builds\Dev\Components\Framework\Trunk\Debug\MyNamespace.Framework.Core.dll&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let&#39;s start with &lt;font face=&quot;Courier New&quot;&gt;get_node()&lt;/font&gt; on line 30.&amp;#160; This method is an iterator.&amp;#160; I don&#39;t know why, but it took a long time for the lightbulb to go off in my head over Ruby&#39;s usage of the yield keyword.&amp;#160; Turns out, it works just like all the Ruby books say it does.&amp;#160; Really, why would they lie?&amp;#160; In this case, on line 31, we&#39;re getting the value located in an element in the data_store hash picked out by the find_key variable, and &lt;em&gt;yield&lt;/em&gt;ing that value back to the calling method.&amp;#160; And that calling method better have a code block to execute once it receives a value, or we&#39;re gonna get a big ol&#39; runtime exception.&amp;#160; For the &lt;font face=&quot;Courier New&quot;&gt;get_filenames()&lt;/font&gt; call in our script, on line 14 we&#39;re saying, &amp;quot;Look in the top-most hash in the references.yml file and find me a node with a key called &#39;custom assemblies&#39;&amp;quot;.&amp;#160; Remember: the way our YAML file is laid out, it&#39;s just a big, weird hash of arrays and hashes.&amp;#160; We have to write code to ferret out the info we want, and in this case ultimately we want a list of filenames.&lt;/p&gt;

&lt;p&gt;There&#39;s another interesting thing happening on line 31.&amp;#160; There&#39;s an if statement at the end of the line.&amp;#160; If you tried to get away with something like that in c# land, they&#39;d lock you up and throw away the key.&amp;#160; Ahh, but here in Narnia, animals talk, trees walk, and all sorts of silly things happen.&amp;#160; You can even say &amp;quot;hey, do this thing if this other thing is true&amp;quot;, they way people do.&amp;#160; No fussy brackets, or parentheses, or overly strict formatting rules to worry about.&amp;#160; Line 31 takes care of the case when data_store is a hash.&amp;#160; If data_store is not a hash, it&#39;s an array of hashes, and we take care of that on line 32, using a little recursion magic to get at the hash in each element of the array.&lt;/p&gt;

&lt;p&gt;I think of the contents of &#39;custom assemblies&#39; as an assembly_list, and each assembly_list contains packing_lists, each with a location and a list of assemblies at that location.&amp;#160; Each assembly can have more than one file associated with it - in this case I&#39;ve listed the binary dll, the debug symbol pdb file, and the xml document associated with our custom assemblies.&amp;#160; I&#39;m asking References to get just the binary files in &#39;custom assemblies&#39;.&amp;#160; Now that I&#39;ve got the &#39;custom assemblies&#39; node, I already know that the assembly_list is an array, so I can just iterate through it with .each to get each packing_list. (That&#39;s the reason I wrote get_node() in the first place - as I was learning about YAML and Ruby, I wasn&#39;t sure what object types I was dealing with as I drilled down through the YAML file.&amp;#160; I could probably simplify the get_node() iterator now that I understand the structure of the file better, but I&#39;ll save refactoring for another time.)&amp;#160;&amp;#160; A packing_list is a hash containing a &#39;location&#39; that can have multiple &#39;assemblies&#39;.&amp;#160; Line 15 says, &amp;quot;Get me the filenames for every assembly in this packing_list, and I&#39;m really only want the ones that match this list of file_types&amp;quot;.&lt;/p&gt;

&lt;p&gt;The * in front of file_types in the get_filenames() signature makes it an optional parameter.&amp;#160; You don&#39;t have to specify the type of file you&#39;re looking for, and if you don&#39;t then you get back everything.&amp;#160; But if you do specify a list of file_types, that list is used in the filter() method, which is called on line 35.&amp;#160; Another cool Ruby-ish way of saying something: using the &lt;em&gt;unless&lt;/em&gt; keyword.&amp;#160; Line 35 says, &amp;quot;Take a look at all the keys in the file_node hash, and give me back the file_node value for each key unless the key should be filtered out.&amp;quot;&lt;/p&gt;

&lt;p&gt;I&#39;m hoping to put plain old Ruby classes and YAML together with Rake so that I can sweep angle brackets out of my life forever, and I&#39;ll post my progress as I learn.&amp;#160; Now I&#39;m sure that there are better ways of expressing these things in Ruby.&amp;#160; But I&#39;m new here.&amp;#160; I&#39;m still enjoying my Turkish Delight and hot tea.&amp;#160; I still have a lot to learn about Narnia, but for now it&#39;s back to the real world.&amp;#160; &lt;/p&gt;
&lt;span class=&quot;sbmLink&quot;&gt;
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;bookmark_title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;ti=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;title=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html&amp;amp;t=Parsing YAML Files in Ruby - Part 2&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/06/parsing-yaml-files-in-ruby-part-2.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-6330955262589720655</guid><pubDate>Sat, 31 May 2008 22:41:00 +0000</pubDate><atom:updated>2008-05-31T15:42:52.413-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>Introducing Developer Testing Into an Existing Team - Project Manager Thoughts</title><description>&lt;p&gt;&lt;a href=&quot;http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&quot; target=&quot;_blank&quot;&gt;Last time&lt;/a&gt;, I posted our developer&#39;s thoughts on the answer to this question: What was the tipping point for you that helped you decide automated developer testing was a worthwhile thing?&lt;/p&gt;  &lt;p&gt;Here&#39;s what one of our project managers thought:&lt;/p&gt;  &lt;p&gt;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: I&#39;ve asked some of our developers that question, but I&#39;m curious about your perspective as a project mangler, err..., I mean manager&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: The past weeks on [our current project] have shown the value&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: for sure&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: The challenge is getting the business folks to agree on that value&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: What value have you been able to see?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: We saw that we could refactor and not miss a beat&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: assumes that your project is going to have time to refactor. When you only get one shot at integration testing that&#39;s a challenge&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: too often we follow the path of (1) code in silos (2) come together for a few days of integration (3) jump into QA&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: right&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: in that case the value goes way down because any refactoring the team does is in their spare time as they fix bugs and prepare for launch&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Do you think you are going to be able to sell it to the business folks?&amp;#160; Or do you see a need to do so?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: (from my perspective, as long as they&#39;re getting sausage, why do they care what happens in the sausage factory?)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: my last point was it still has value on the NEXT project or even the next hotfix. It increases your chances for quality follow on releases&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: sure&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: understood but if they KNOW about it they are going to fight to give you less time as you&#39;re doing work that could be cut&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: I dig what you&#39;re saying&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: If you just build it in and don&#39;t draw attention to it ... then yes &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: build it into the schedule I mean&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: At some point when we have an hour or so, I would really like for the [our current project] and [our other current project] teams to sit down and talk through a &amp;quot;lessons learned&amp;quot; session on this stuff&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Not so much a post-mortem specific to our projects,... &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: right&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: a technical seminar sorta&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: But a post-mortem about the development techniques we used in an agile setting and in a waterfall setting&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: pros and cons&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: right&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: yep I mean it had a cost in [our current project] but since the work so far has been so lop-sided on the UI side compared to the rest of the engineering folks, we had time&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: right - that&#39;s an important point...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: I want to claim victory, but I want to claim it on solid ground, not by hiding behind latency elsewhere in the project&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: I guess I&#39;m looking for a real measure of the value that developer testing has brought to us so far, and what we think we need to change if we expect to get more value out of it on future development&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: ok&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;Project Manager&lt;/font&gt;: yeah I agree I don&#39;t like hiding tasks&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;bookmark_title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;ti=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html&amp;amp;t=Introducing Developer Testing Into an Existing Team - Project Manager Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into_31.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2284221569116260909</guid><pubDate>Sat, 31 May 2008 22:31:00 +0000</pubDate><atom:updated>2008-05-31T15:33:50.573-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>Introducing Developer Testing Into an Existing Team - Developer Thoughts</title><description>&lt;p&gt;My friend &lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/default.aspx&quot; target=&quot;_blank&quot;&gt;Chad Myers&lt;/a&gt; posted recently about &lt;a href=&quot;http://www.lostechies.com/blogs/chad_myers/archive/2008/05/27/introducing-quality-first-notions-into-an-existing-team.aspx&quot; target=&quot;_blank&quot;&gt;Introducting Quality-first Notions Into an Existing Team&lt;/a&gt;.&amp;#160; Since you are such a devoted fan of my blog, you undoubtedly know that we have recently introduced Test Driven Development, or at least automated developer testing, to our team in the context both a waterfall project and an Agile project.&amp;#160; Chad&#39;s post made me interested to see what folks on our team thought about developer testing now that they have been doing it for a bit.&amp;#160; So I&amp;#8217;ve been asking folks what they think of developer testing, specifically whether or not they thought it was worth it and what it was that made them think that.&amp;#160; My point in doing this is that I want to gain actual value from our testing efforts, and not just remain in the &amp;#8220;testing enthusiast&amp;#8221; camp.&amp;#160; I, of course, am sold on the idea of developer testing, but I thought you would like to see some of the responses I got:&lt;/p&gt;  &lt;p&gt;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: What was the tipping point for you that helped you decide automated developer testing was a worthwhile thing?_________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 1&lt;/font&gt;: Well, I&#39;d say there was no tipping point.&amp;#160; It was more of a feeling of: I can&#39;t wait until we get this going.&amp;#160; Here are my feelings.&lt;/p&gt;  &lt;p&gt;- The last shop I worked in used it and it proved its worth over and over.&amp;#160; I was the one who setup and ran the test scripts so I saw the effort through from beginning to end first hand.&lt;/p&gt;  &lt;p&gt;- It&#39;s another means to increase our test coverage although it&#39;s not meant to be a substitute for other types of testing.&lt;/p&gt;  &lt;p&gt;- It helps enforce more testing by developers.&amp;#160; For those developers who have not been exposed to test driven development, it&#39;s a big change.&amp;#160; It&#39;s easy to just write code but it&#39;s also risky.&amp;#160; Test driven development allows the developer a chance to think things through before writing code.&lt;/p&gt;  &lt;p&gt;- I like to see you smile.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Aww, that&#39;s so sweet!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 1&lt;/font&gt;: heh heh&lt;/p&gt;  &lt;p&gt;_________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 2&lt;/font&gt;: when I ran nUnit and saw all the blinky green lights?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: good point&lt;/p&gt;  &lt;p&gt;_________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 3&lt;/font&gt;: hmm... &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 3&lt;/font&gt;: i guess i&#39;d have to say finding mistakes in code while writing tests, which saves you some time up front when you start smoke testing.&amp;#160; it showed me that you are not just investing additional time - you&#39;re saving time in other areas, so the overall investment is only slightly more, but the benefits are far reaching. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Very cool&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: DEV 2&#39;s answer:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; DEV 2: when I ran nUnit and saw all the blinky green lights&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Yours is a bit more helpful&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 3&lt;/font&gt;: haha... that&#39;s a big one too... until you see all green, you hate testing :-()&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 3&lt;/font&gt;: :-)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: yup&lt;/p&gt;  &lt;p&gt;_________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 4&lt;/font&gt;: I think the real selling point for me occurs when you later make some changes you don&#39;t anticipate will be problematic and then find out some the tests failed.&amp;#160; If not for the testing, there would have been issues.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 4&lt;/font&gt;: You can also refactor with much greater confidence.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: DEV 2&#39;s answer:&lt;/p&gt;  &lt;p&gt;&amp;#160; DEV 2: when I ran nUnit and saw all the blinky green lights&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 4&lt;/font&gt;: I think he meant red.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: :)&lt;/p&gt;  &lt;p&gt;__________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: yea for me it was the first time I broke a test&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: went oh rainbow&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: that saved me 2 hours&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: I transposed two strings&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: was supposed to be string str3 = str1 + str2;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: instead I did&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: string str3 = str2 + str1&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: in one function&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: unit test caught it instantly&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: would have taken me at least 2 hours to get UI setup to test&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: yeah&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Yeah, for me it was really hooking up automated testing with CI, which we haven&#39;t really emphasized here yet&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: At least not on our current project&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: As soon as it clicked with me that a failed test means a failed build, I got it&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: yea&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: I think DEV 7 has best def yet though&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: its used like double blind accounting&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: &amp;amp; for the same reason&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: chances are you won&#39;t make the same mistake in the same way both places&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: right, I like that&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 5&lt;/font&gt;: yea so do I&lt;/p&gt;  &lt;p&gt;____________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 6&lt;/font&gt;: hmmmm&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 6&lt;/font&gt;: for one confidence in your code of what it does and does not ...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: Do you remember if there was a particular incident?&amp;#160; Or was it more of a general sense, arrived at through multiple tests?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 6&lt;/font&gt;: ... and knowing what you delivered in regard to the business rules in the spec ...&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 6&lt;/font&gt;: yea a general sense via tests&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 6&lt;/font&gt;: no ah hah moment :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: right&lt;/p&gt;  &lt;p&gt;____________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: Your and DEV 8&#39;s respect&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: that ain&#39;t worth much&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: I have to be honest I did not do it as much as I should have&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: And let it slide by the wayside when the project got well under way&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: :(&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: I just lost it&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: your respect that is&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: nah&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: So, I hope to win your argument I get more issues with my code :)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: I am still interested in approaching code that way&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: What are the implications of introducing developer testing to a legacy environment?&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: Just felt very rushed through much of the project&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: sure&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: that&#39;s the reason I&#39;m asking though - just wondering what it has really gained us so far, and what we would change in future development efforts to get more out of developer testing&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: I know I dropped it around the time I had issues testing DB calls&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: But I see that as soon as those calls are at least a call away thet get mocked out anyway&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: so that&#39;s in interesting point - getting tangled up in physical dependencies is definitely a stumbling block to widespread adoption&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: understanding techniques on how to deal with those situations would help, but&amp;#160; we have to have a vision on why we should do this in the first place&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: More practice would have let me see that it&#39;s not such a huge issue&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: Cool&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: sure, absolutely&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: I&#39;m also interested in how to communicate the vision of what testing brings to others in our organization&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: Well hopefully you can get some good examples out of [our current project] code&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: and [our other current project]&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: Leave it anonymous though, so people don&#39;t think that I cause so many bugs&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: LOL&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 7&lt;/font&gt;: hehheeh&lt;/p&gt;  &lt;p&gt;___________________________________________________________&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 8&lt;/font&gt;: i just generally think automated developer machines (ADM) are very cool&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#ff0000&quot;&gt;DEV 8&lt;/font&gt;: but it was when Chad [Myers] came to [my former employer] and showed us the error of our ways.&amp;#160; I was converted by an itinerant preacher&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;font color=&quot;#004080&quot;&gt;dalesmithtx&lt;/font&gt;: :)&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;bookmark_title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;ti=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;title=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html&amp;amp;t=Introducing Developer Testing Into an Existing Team - Developer Thoughts&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/05/introducing-developer-testing-into.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2149861886703665288</guid><pubDate>Wed, 14 May 2008 03:17:00 +0000</pubDate><atom:updated>2008-05-13T20:19:01.161-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ReSharper</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>My new favorite Resharper feature</title><description>&lt;p&gt;I love the Find Dependent Code menu option in ReSharper.&amp;#160; If you could see me now you would see a blissed out smile on my face and a bunch of cartoon hearts and flowers shooting out the top of my head.&lt;/p&gt;  &lt;p&gt;A huge ugly legacy application I work on consumes custom components, and these components change from time to time.&amp;#160; I had to make such a change today, and I was worried about how to figure out where I was going to get roasted by the legacy app dragon.&amp;#160; Once again, ReSharper to the rescue: all I had to do was right click on the assembly name in my references list and then click Find Dependent Code.&amp;#160; After thinking about it for about a minute, ReSharper popped the Find Results window up with a list like this (I changed the names to protect the innocent):&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh3.ggpht.com/dalesmithtx/SCpZz2VNprI/AAAAAAAAABs/sbpaHguii6A/s1600-h/FindDependentCode%5B5%5D.jpg&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;363&quot; alt=&quot;FindDependentCode&quot; src=&quot;http://lh6.ggpht.com/dalesmithtx/SCpZ0mVNpsI/AAAAAAAAAB0/FwirvAtKO74/FindDependentCode_thumb%5B3%5D.jpg?imgmax=800&quot; width=&quot;797&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;More than 1400 lines of code affected.&amp;#160; I&#39;m not happy about that, but I am happy that I can sort by file name and get a really useful, drill-downable, clickable list of files I need to check out.   &lt;br /&gt;ReSharper!&amp;#160; Run away with me!&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;bookmark_title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;ti=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;title=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html&amp;amp;t=My new favorite Resharper feature&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/05/my-new-favorite-resharper-feature.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/dalesmithtx/SCpZ0mVNpsI/AAAAAAAAAB0/FwirvAtKO74/s72-c/FindDependentCode_thumb%5B3%5D.jpg?imgmax=800" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2981808431242398125</guid><pubDate>Tue, 13 May 2008 05:25:00 +0000</pubDate><atom:updated>2008-05-13T20:12:58.067-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">YAML</category><title>Parsing YAML files in Ruby</title><description>&lt;p&gt;I&#39;ve been messing around with &lt;a href=&quot;http://rake.rubyforge.org/&quot; target=&quot;_blank&quot;&gt;rake&lt;/a&gt; lately, hoping to find a build tool that is fairly well documented, well-supported, and doesn&#39;t make me dig through a pile of angle-brackets.&amp;#160; At work, we store all our third-party assemblies on a centralized share.&amp;#160; So one of the first tasks in any build file is to copy third-party assemblies locally before you can compile.&amp;#160; It makes sense to me to specify reference assemblies in a human-readable data file and then read them in at runtime using a custom-written class for the occasion.&amp;#160; But don&#39;t forget: I&#39;m on a mission to vanquish XML from my build process at all cost.&amp;#160; A fool&#39;s errand perhaps, but my errand none the less.&lt;/p&gt;  &lt;p&gt;Enter &lt;a href=&quot;http://www.yaml.org/&quot; target=&quot;_blank&quot;&gt;YAML&lt;/a&gt;.&amp;#160; Simple and elegant, YAML dispenses with lots of overhead and requires just enough structure to make it perfect for config files.&amp;#160; Here&#39;s an example:&lt;/p&gt;  &lt;div&gt;   &lt;div class=&quot;csharpcode&quot;&gt;     &lt;div&gt;       &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;         &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; ---&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt; shared paths:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt;   lib share   : \\MySharedServer\lib&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;   vendor      : \vendor&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt; local paths:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;   references  : \references&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt; custom assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  10:&lt;/span&gt;   - location: \Dev\Components\Business\Core\Trunk\Latest\Debug&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  11:&lt;/span&gt;     assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  12:&lt;/span&gt;       - name: MyNamespace.Core&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  13:&lt;/span&gt;         files:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  14:&lt;/span&gt;           - output    : MyNamespace.Core.dll&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  15:&lt;/span&gt;           - debug     : MyNamespace.Core.pdb&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  16:&lt;/span&gt;           - document  : MyNamespace.Core.xml&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  17:&lt;/span&gt;       &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  18:&lt;/span&gt;   - location: \Dev\Components\Framework\Trunk\Debug&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  19:&lt;/span&gt;     assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  20:&lt;/span&gt;       - name: MyNamespace.Framework.Core&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  21:&lt;/span&gt;         files:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  22:&lt;/span&gt;           - output    : MyNamespace.Framework.Core.dll&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  23:&lt;/span&gt;           - debug     : MyNamespace.Framework.Core.pdb&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  24:&lt;/span&gt;           - document  : MyNamespace.Framework.Core.xml&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  25:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  26:&lt;/span&gt; vendor assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  27:&lt;/span&gt;   - location: \DotNet Commons\Logging\2.0&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  28:&lt;/span&gt;     assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  29:&lt;/span&gt;       - name: Dotnet.Commons.Logging&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  30:&lt;/span&gt;         files:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  31:&lt;/span&gt;           - output    : Dotnet.Commons.Logging.dll&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  32:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  33:&lt;/span&gt; testing assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  34:&lt;/span&gt;   - location: \Nunit\2.4.3&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  35:&lt;/span&gt;     assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  36:&lt;/span&gt;       - name: NUnit.Framework&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  37:&lt;/span&gt;         files:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  38:&lt;/span&gt;           - output    : nunit.framework.dll&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  39:&lt;/span&gt;         &lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  40:&lt;/span&gt;   - location: \Rhino.Mocks\3.3.0.906&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  41:&lt;/span&gt;     assemblies:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  42:&lt;/span&gt;       - name: Rhino.Mocks&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  43:&lt;/span&gt;         files:&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  44:&lt;/span&gt;           - output    : Rhino.Mocks.dll&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  45:&lt;/span&gt;           - document  : Rhino.Mocks.xml&lt;/pre&gt;

        &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;  46:&lt;/span&gt; ...&lt;/pre&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;pre class=&quot;alteven&quot;&gt;&lt;span class=&quot;lnum&quot;&gt;&lt;/span&gt;What I&#39;ve essentially got here is a hierarchical collection of hashes and arrays.&amp;#160; So in Ruby all I have to do is this :&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;font face=&quot;Courier New&quot;&gt;require &#39;yaml&#39; 
    &lt;br /&gt;refs = open(&#39;references.yml&#39;) {|f| YAML.load(f) }&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;and I&#39;ve got direct access in code to all my data.&amp;#160; What threw me at first was the idea that there would be an easy XPath-like way to say &amp;quot;give me a list of all the output files in the custom assemblies node&amp;quot;.&amp;#160; Instead, you have to write some parsing code, but it turns out it&#39;s not that hard.&amp;#160; Here&#39;s the Ruby code I wrote to answer my query:&lt;/p&gt;

&lt;div&gt;
  &lt;div style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;
    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   1:&lt;/span&gt; require &lt;span style=&quot;color: #006080&quot;&gt;&#39;yaml&#39;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   3:&lt;/span&gt; refs = open(&lt;span style=&quot;color: #006080&quot;&gt;&#39;references.yml&#39;&lt;/span&gt;) {|f| YAML.load(f) }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   5:&lt;/span&gt; refs[&lt;span style=&quot;color: #006080&quot;&gt;&#39;custom assemblies&#39;&lt;/span&gt;].each &lt;span style=&quot;color: #0000ff&quot;&gt;do&lt;/span&gt; |location|&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   6:&lt;/span&gt;   location[&lt;span style=&quot;color: #006080&quot;&gt;&#39;assemblies&#39;&lt;/span&gt;].each &lt;span style=&quot;color: #0000ff&quot;&gt;do&lt;/span&gt; |assembly| &lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   7:&lt;/span&gt;     assembly[&lt;span style=&quot;color: #006080&quot;&gt;&#39;files&#39;&lt;/span&gt;].each {|file| &lt;span style=&quot;color: #0000ff&quot;&gt;if&lt;/span&gt; file[&lt;span style=&quot;color: #006080&quot;&gt;&#39;output&#39;&lt;/span&gt;] then puts &lt;span style=&quot;color: #006080&quot;&gt;&amp;quot;        #{file[&#39;output&#39;]}&amp;quot;&lt;/span&gt; end }&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   8:&lt;/span&gt;   end&lt;/pre&gt;

    &lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;&lt;span style=&quot;color: #606060&quot;&gt;   9:&lt;/span&gt; end&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I&#39;m sure there are much more elegant ways to write that code, and as I learn idiomatic Ruby I&#39;ll write better Ruby code.&amp;#160; But for now, here&#39;s why this works:&amp;#160; my little config file is basically just a big, weird hash with five nodes.&amp;#160; The &amp;quot;shared paths&amp;quot; node contains a hash, or map in YAML terms, of 2 nodes: lib share and vendor.&amp;#160; The &amp;quot;local paths&amp;quot; node contains a hash with one node.&amp;#160; &amp;quot;custom assemblies&amp;quot; is different: it contains a list with two items, and each list item contains a hash with two nodes (&amp;quot;location&amp;quot; and &amp;quot;assemblies&amp;quot;).&amp;#160; If we keep digging down, the &amp;quot;files&amp;quot; node contains an array of hashes - the sample above digs down to this level and prints the file name if the hash key is &amp;quot;output&amp;quot;.&lt;/p&gt;
&lt;span class=&quot;sbmLink&quot;&gt;
  &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;bookmark_title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;ti=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;title=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;

        &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html&amp;amp;t=Parsing YAML files in Ruby&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/05/parsing-yaml-files-in-ruby.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2184163300170085719</guid><pubDate>Wed, 23 Apr 2008 04:44:00 +0000</pubDate><atom:updated>2008-05-13T20:56:08.874-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ReSharper</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Tracking Technical Debt in ReSharper</title><description>&lt;p&gt;I love ReSharper. It&#39;s purely platonic. After all, I am a married man. But it&#39;s always there for me: my trusty little sidekick, my own personal Sancho Panza. Its array of helpful features is truly impressive: it enhances editing capabilities; it helps me organize the classes in my projects; it cleans up my code for me; it tells me when I&#39;m missing references; it offers suggestions for more readable conditional statements; it&#39;s a floor wax, a dessert topping, and a gentle laxative.&lt;/p&gt;  &lt;p&gt;One of my favorite ReSharper features is the To-do Explorer. It scans your code base filtering on comment tags you define (&amp;quot;//TODO&amp;quot;, et al) and gives you a clickable sorted list of those items. It&#39;s nicer than the VS TaskList in that you can sort the results in different ways (my favorite being by namespace and type), and you can copy the results to the clipboard or save them out to a text file.&lt;/p&gt;  &lt;p&gt;Since swinging into TDD at our office in the last few weeks, we&#39;ve started taking the idea of &lt;a href=&quot;http://www.martinfowler.com/bliki/TechnicalDebt.html&quot;&gt;Technical Debt&lt;/a&gt; very seriously. As we&#39;re working through our implementation, we recognize that there are some deadlines which will force us to make some compromises on design decisions. That&#39;s ok as long as we don&#39;t forget to go back and re-work those things later. We&#39;ve found that an easy way to track those things is to mark them with the comment tag &amp;quot;//DEBT&amp;quot; and set up a ReSharper To-do Explorer filter for that tag. Then when we&#39;re planning our next phase, we&#39;ve got a sortable, printable list of items we know we have to prioritize into the project plan.&lt;/p&gt;  &lt;p&gt;Taking that idea a bit further, we decided to standardize on the following three code comment tags and create ReSharper To-do Explorer filters for each:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;//HACK == a HACK is something we put in place knowing it was wrong to begin with, and knowing it has to be taken care of as quickly as possible. &lt;/li&gt;    &lt;li&gt;//TODO == a TODO could be anything that we need to complete by the end of the current iteration. &lt;/li&gt;    &lt;li&gt;//DEBT == a technical debt is a calculated decision to complete a feature in this iteration using a design we know we will need to refactor in a future iteration.&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;When we take a look at To-do Explorer, we get something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/dalesmithtx/SA6-j-QgSQI/AAAAAAAAABY/e7kMcFS5yJM/TechnicalDebtLog%5B7%5D.jpg&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;538&quot; alt=&quot;TechnicalDebtLog&quot; src=&quot;http://lh4.ggpht.com/dalesmithtx/SA6-keQgSRI/AAAAAAAAABg/KYmLQa9KMZU/TechnicalDebtLog_thumb%5B5%5D.jpg&quot; width=&quot;716&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So before the end of the current iteration, we know we need to clean up our HACKs and TODOs.&amp;#160; And at the beginning of the next iteration, we can throw the DEBTs in with the requirements to be prioritized and worked into the iteration plan.&lt;/p&gt;  &lt;p&gt;I&#39;m sure there are other ways to track technical debt that offer more info, but this is a quick, easy, and cheap way.&lt;/p&gt; &lt;span class=&quot;sbmLink&quot;&gt;   &lt;table cellspacing=&quot;1&quot; cellpadding=&quot;1&quot;&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td class=&quot;sbmText&quot;&gt;Share this post : &lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to backflip&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.backflip.com/add_page_pop.ihtml?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/backflip4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blinkbits!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blinkbits.com/bookmarklets/save.php?v=1&amp;amp;source_url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blinkbit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to blogmemes&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.blogmemes.net/post.php?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/blogmemes4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to buddymark&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://buddymarks.com/s_add_bookmark.php?bookmark_url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;bookmark_title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/buddymar4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to complore&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://complore.com?q=node/add/flexinode-5&amp;amp;url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/complore4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.icio.us&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://del.icio.us/post?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliciou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to del.iri.ous!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://de.lirio.us/bookmarks/sbmtool?action=add&amp;amp;address=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/deliriou4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to digg&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://digg.com/submit?phase=2&amp;amp;url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/digg14.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to dotnetkicks&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.dotnetkicks.com/kick/?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/CropperCapture154.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to furl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.furl.net/store?s=f&amp;amp;to=0&amp;amp;u=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;ti=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/furl4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to live&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/live4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to magnolia!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://ma.gnolia.com/bookmarklet/add?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/magnolia4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to netvouz!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://netvouz.com/action/submitBookmark?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/netvouz4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to reddit!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://reddit.com/submit?url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/reddit4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to shadow&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.shadows.com/bookmark/saveLink.rails?page=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/shadows6.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to spurl&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.spurl.net/spurl.php?v=3&amp;amp;url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/spurl8.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to technorati!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://technorati.com/faves/?add=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/technora4.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to wists&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://www.wists.com/?action=add&amp;amp;url=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;title=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/wists9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; onmouseout=&quot;mOut(this)&quot;&gt;&lt;a class=&quot;sbmDim&quot; onmouseover=&quot;mOvr(this)&quot; title=&quot;Post it to yahoo!&quot; onmouseout=&quot;mOut(this)&quot; href=&quot;http://myweb.yahoo.com/myresults/bookmarklet?u=http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html&amp;amp;t=Tracking technical debt in Resharper&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://blogs.msdn.com/blogfiles/rahulso/WindowsLiveWriter/IconsfordifferentSocialBookmarkingSites_B387/yahoo9.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  </description><link>http://creedcultcode.blogspot.com/2008/04/tracking-technical-debt-in-resharper.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/dalesmithtx/SA6-keQgSRI/AAAAAAAAABg/KYmLQa9KMZU/s72-c/TechnicalDebtLog_thumb%5B5%5D.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-9010073166733252273</guid><pubDate>Wed, 23 Apr 2008 03:39:00 +0000</pubDate><atom:updated>2008-04-22T20:45:26.091-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Continuous Integration</category><category domain="http://www.blogger.com/atom/ns#">TDD</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Continuous Integration and You</title><description>&lt;p&gt;OK, so it&#39;s not really about you.&amp;#160; It&#39;s about me.&amp;#160; I had to have something to pique your interest though, didn&#39;t I?&amp;#160; I wrote this up for my team at work a while back, and I thought I would share it with the universe.&amp;#160; So here it is, universe.&amp;#160; Hope you dig it.&lt;/p&gt;  &lt;h3&gt;&lt;a name=&quot;_Toc175993181&quot;&gt;Working Together&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;Creating software is fundamentally a creative act of communication. There are plenty of things to communicate about on any non-trivial software project:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Customers and end users must communicate with business analysts and designers about their requirements for the system.&lt;/li&gt;    &lt;li&gt;Business analysts and designers must work with test engineers, and must use these requirements to describe the bar the system must clear to be acceptable to customers.&lt;/li&gt;    &lt;li&gt;The development team must understand this specification and communicate with designers, and with one another, so that they can clear that bar quickly enough to satisfy customers and deliver true value to them. &lt;/li&gt;    &lt;li&gt;And tons and tons of other stuff&amp;#8230; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Poor communication can contribute real friction to a software project. And, as &lt;a href=&quot;http://www.allmusic.com/cg/amg.dll?p=amg&amp;amp;sql=33:k9fwxxesld6e&quot; target=&quot;_blank&quot;&gt;any major dude will tell you&lt;/a&gt;, &lt;a href=&quot;http://scienceworld.wolfram.com/physics/Friction.html&quot; target=&quot;_blank&quot;&gt;friction can be a real drag&lt;/a&gt;.&amp;#160; A primary goal of any software development team should be to reduce friction wherever it occurs in the development process.&lt;/p&gt;  &lt;p&gt;In a traditional waterfall approach to managing software projects, stitching together each developer&amp;#8217;s work into a single integrated project typically occurs towards the end of a development cycle. This step can be a long and unpredictable process, full of friction, and it can rapidly turn into a nightmare. If you think about it, this is really another communication issue: how do we communicate with one another about the work we have each done as individuals, and put it together so that it all works together seamlessly?&lt;/p&gt;  &lt;h3&gt;&lt;a name=&quot;_Toc175993182&quot;&gt;Benefits of Continuous Integration&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;It is important to remember that creating software is a complex process, and there are &lt;a href=&quot;http://info.computer.org/portal/site/computer/menuitem.eb7d70008ce52e4b0ef1bd108bcd45f3/index.jsp?&amp;amp;pName=computer_level1&amp;amp;path=computer/homepage/misc/Brooks&amp;amp;file=index.xml&amp;amp;xsl=article.xsl&amp;amp;&quot; target=&quot;_blank&quot;&gt;no silver bullets&lt;/a&gt; to ward off a certain amount of complexity. But we should simplify things where we can. Adopting the practice of &lt;a href=&quot;http://www.martinfowler.com/articles/continuousIntegration.html&quot; target=&quot;_blank&quot;&gt;Continuous Integration&lt;/a&gt; (CI) is one step towards simplifying our software development projects. What can CI buy us when we use it in a disciplined way?&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;CI can eliminate the need for a long, arduous, risky integration task at the end of a development cycle. &lt;/li&gt;    &lt;li&gt;If we combine CI with good automated unit testing and code coverage metrics, we can make our projects practically self-testing. A good suite of unit tests executing a high percentage of the code base on every integrated build can keep the quality of the code from deteriorating as the development cycle progresses. &lt;/li&gt;    &lt;li&gt;By working in short bursts and committing new code to the master build server often, defects that are introduced into the master build become easier to find and eliminate: you&amp;#8217;ve only changed a small piece of code since the last time the system functioned properly, so you don&amp;#8217;t have very far to look to find the defect you just introduced. &lt;/li&gt;    &lt;li&gt;Anyone on the team can get the latest functioning code, build it, and test it locally with minimum effort. &lt;/li&gt;    &lt;li&gt;At any time in the development cycle, everyone on the team knows precisely what works, what doesn&amp;#8217;t, and where they are on progressing towards functional code for the iteration. &lt;/li&gt;    &lt;li&gt;CI can facilitate enforcement of coding standards. &lt;/li&gt;    &lt;li&gt;In short, the biggest umbrella benefits CI can buy us are better communication on the development team and reduced risk. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;a name=&quot;_Toc175993183&quot;&gt;Practices of Continuous Integration&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;So what exactly is involved when working in a CI environment? What tools are needed? What do developers have to do differently? I know: reading a bunch of wordy blather&lt;a href=&quot;#_ftn1_1548&quot; name=&quot;_ftnref1_1548&quot;&gt;[1]&lt;/a&gt; from yet another starry-eyed XP acolyte about how &amp;#8220;this practice will change your life&amp;#8221; is extremely tedious. So I drew you a picture. Lemme &amp;#8216;splain:&lt;/p&gt;  &lt;h4&gt;&lt;em&gt;CI Tools&lt;/em&gt;&lt;/h4&gt;  &lt;p&gt;This diagram is intended only to be an example of how a CI environment can be configured. There are many different ways to configure a CI server, and many tools you could use. In my diagram, I chose the following tools, some of which we already use at [my company]:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;CruiseControl.Net &amp;#8211; the CI server software &lt;/li&gt;    &lt;li&gt;CCTray &amp;#8211; A status notification tool for CruiseControl.Net &lt;/li&gt;    &lt;li&gt;SubVersion &amp;#8211; our source control system &lt;/li&gt;    &lt;li&gt;Visual Studio &amp;#8211; duh! &lt;/li&gt;    &lt;li&gt;NUnit &amp;#8211; an open source .Net library for creating running unit tests &lt;/li&gt;    &lt;li&gt;NCover &amp;#8211; an &lt;strike&gt;open source&lt;/strike&gt; .Net library for measuring the percentage of code the unit tests actually cover when testing. &lt;/li&gt;    &lt;li&gt;FxCop &amp;#8211; an open source .Net library for enforcing coding standards &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Most of these tools are open source, which means they are free* - that&#39;s a big asterisk there; the licenses for some of these products are changing. You could choose others which are true third party commercial applications, supported by third party commercial software vendors. But there is a wealth of knowledge documented in the .Net community at large for a CI environment configured like this:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://lh5.ggpht.com/dalesmithtx/SA6vcuQgSOI/AAAAAAAAABI/jV72rqzNJbA/CI%5B9%5D.jpg&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;461&quot; alt=&quot;CI&quot; src=&quot;http://lh6.ggpht.com/dalesmithtx/SA6vc-QgSPI/AAAAAAAAABQ/1kbULB7wQgY/CI_thumb%5B7%5D.jpg&quot; width=&quot;736&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;These are the steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Individual developers on the team check new code into subversion. &lt;/li&gt;    &lt;li&gt;CruiseControl.Net checks the source code repository on regular intervals for newly checked-in code. &lt;/li&gt;    &lt;li&gt;When CruiseControl.Net detects new source code in the repository, it runs targets in the NAnt build script. &lt;/li&gt;    &lt;li&gt;NAnt uses the latest source code from the repository on the build machine. &lt;/li&gt;    &lt;li&gt;NAnt compiles the project using Visual Studio. If the project won&amp;#8217;t compile, the NAnt script exits with a failure message, and CruiseControl.Net delivers a failure message to developers via CCTray. &lt;/li&gt;    &lt;li&gt;NAnt runs all the unit test fixtures using the NUnit framework. If any individual test in any test fixure fails, the NAnt script exits with a failure message, and CruiseControl.Net delivers a failure message to developers via CCTray. &lt;/li&gt;    &lt;li&gt;NAnt uses NCover to measure the percentage of code executed by the NUnit test fixtures. You can set a coverage threshold as a failable build step: if the coverage percentage does not meet the stated coverage standard, say 85%, the NAnt script exits with a failure message, and CruiseControl.Net delivers a failure message to developers via CCTray. &lt;/li&gt;    &lt;li&gt;NAnt uses FxCop to check the code for compliance with coding standards. If it finds any non-compliant code, the NAnt script exits with a failure message, and CruiseControl.Net delivers a failure message to developers via CCTray. &lt;/li&gt;    &lt;li&gt;Once the NAnt script finishes all its tasks, it exits with a success or failure message. CruiseControl.Net delivers the message to developers via CCTray. At the same time, CruiseControl.Net creates web pages on the build it just completed containing information from each step in the build process. &lt;/li&gt;    &lt;li&gt;Members of the development team can check these web pages to see details on the build results. &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;&lt;a name=&quot;_Toc175993185&quot;&gt;&lt;em&gt;&lt;font color=&quot;#000000&quot;&gt;Developer Tasks&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;There are a lot of things that happen automatically in the scenario I described above. Running an environment like that is like having a whole extra person whose job is to put everybody&amp;#8217;s code together, regression test every build, check everybody&amp;#8217;s code for compliance to coding standards, and report the status of all that back to everyone on the team; but you don&amp;#8217;t have to increase your Mountain Dew budget for this extra person.&lt;/p&gt;  &lt;p&gt;However, like just about everything else in life, you will only get out of CI what you put into it. You have to approach CI with a certain discipline, and that means developers have to do things a little bit differently. But the cost to developers is small, and the benefit to the quality and progress of the project is great. &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Automate the Build&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Somebody has to champion the task of creating the CruiseControl.Net configuration and the NAnt scripts. These are not trivial tasks. But once the first set of config files and build scripts have been created, they can be extended for new build tasks and used as templates for other projects. Ideally, the build server should be looking for newly checked-in code in a very short feedback loop, say a range from every 60 seconds to every 10 minutes. Structure the automated build process such that it performs tasks which are important to the development team, and reports on the results of those tasks.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Write Unit Tests&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Test your code. First write tests for your code, then write some more tests, and finally write some tests. And while you&amp;#8217;re at it, write some tests. I cannot stress enough how valuable unit testing will be when combined with a CI environment. Test fixtures and test coverage metrics will be the safety net you rely on to tell you the health of the code as you move through the development cycle. Testing and testability should be first class citizens among all the considerations involved in the design process. Every developer on the team should provide test fixtures for their code, and the results of these tests should be viewed as a measure of the health of the code. Decide on a code coverage standard early (85% isn&amp;#8217;t bad), and enforce it throughout the development cycle.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Commit Early and Commit Often&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;A developer&amp;#8217;s attitude towards committing code to source control should be much like Al Capone&amp;#8217;s attitude towards voting: do it early and often. The quicker you can get code onto the build server, the quicker you know your code will integrate with everyone else&amp;#8217;s code.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Do the Check In Dance&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Didn&amp;#8217;t know this was going to be a dance lesson, did you? Jeremy Miller, the &lt;a href=&quot;http://www.ballroomdancing.com&quot; target=&quot;_blank&quot;&gt;Arthur Murray&lt;/a&gt; of programming, has documented what he calls &amp;#8220;&lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/archive/2005/07/25/129797.aspx&quot; target=&quot;_blank&quot;&gt;The Check In Dance&lt;/a&gt;&amp;#8221;&lt;a href=&quot;#_ftnref2_5153&quot;&gt;[2]&lt;/a&gt;. And it goes a little something like this:&lt;/p&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;Let the rest of the team know a change is coming if it&#39;s a significant update. &lt;/li&gt;      &lt;li&gt;Get the latest code from source control.&amp;#160; &lt;/li&gt;      &lt;li&gt;Do a merge on any conflicts. &lt;/li&gt;      &lt;li&gt;Run the build locally [using the same build script as the build server],&lt;a href=&quot;#_ftn3_5153&quot; name=&quot;_ftnref3_5153&quot;&gt;[3]&lt;/a&gt; and fix any problems found. &lt;/li&gt;      &lt;li&gt;Commit the changes to source control. &lt;/li&gt;      &lt;li&gt;Stop coding until the build passes. &lt;/li&gt;      &lt;li&gt;If the build breaks, drop everything else and fix the build.&lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;&lt;b&gt;Stupid Developer Tricks&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Speaking of Jeremy Miller, he has also documented some good general tips for developers to follow in a CI environment. It is worth quoting him at length:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;&amp;#8220;Check in as often as you can.&amp;#160; Try to reach stopping points as often as you can.&amp;#160; This goes back to the basic agile philosophy of making small changes and immediately verifying the small change.&amp;#160; When you&#39;re doing Test Driven Development you strive to keep &amp;#8216;Red Bar&amp;#8217; periods as short as possible.&amp;#160; The same kind of thinking applies to code check-ins.&amp;#160; Make small changes and see the impact on the rest of the code immediately.&amp;#160; Merging code will be less painful the more frequently a team integrates their code. &lt;/li&gt;      &lt;li&gt;Avoid stale code.&amp;#160; If you have to keep code out for any length of time, make sure you are getting everyone else&#39;s changes.&amp;#160; Try really hard not to keep code out overnight.&amp;#160; If you&#39;re using shared developer workstations, put some sort of sign on the workstation that there is outstanding code on the box.&amp;#160; I&#39;ve seen several XP zealots swear that they&#39;ll throw away any code left overnight.&amp;#160; Personally, I think that&#39;s just a silly case of &amp;#8216;I&#39;m more agile than thou,&amp;#8217; but it&#39;s still a bad idea to leave code out overnight if you can help it. &lt;/li&gt;      &lt;li&gt;Don&#39;t ever check into or out of a busted build.&amp;#160; Checking in might make it harder to fix the build because it will cloud the underlying reason for the build, and you can&#39;t really know if your changes are valid. &lt;/li&gt;      &lt;li&gt;Communicate and negotiate check-ins to the rest of the team.&amp;#160; Frequently the complexity of a merge can be dependent upon who goes first.&amp;#160; Some teams will use some kind of toy as a &amp;#8216;check in token&amp;#8217; to ensure that there is never more than one set of updates in any CI build.&amp;#160; Pay attention to what the rest of the team is doing too. &lt;/li&gt;      &lt;li&gt;If you&#39;re working on fixing the build, let the rest of the team know. &lt;/li&gt;      &lt;li&gt;DON&#39;T LEAVE THE BUILD BROKEN OVERNIGHT.&amp;#160; That&#39;s also an occasional excuse to your wife on why you&#39;re home late from work.&amp;#160; Use with caution though. &lt;/li&gt;      &lt;li&gt;Not every member of the team needs to be a full-fledged &amp;#8216;Build Master,&amp;#8217; but every developer needs to know how to execute a build locally and troubleshoot a broken build.&amp;#160; If you&#39;re suckered into being the technical lead, make sure &lt;strong&gt;every&lt;/strong&gt; team member is up to speed on the build.&lt;/li&gt;      &lt;li&gt;The best practice for effective CI is to perform the integration on a developer workstation before that code escapes into the build server wild. It&#39;s okay to break the build once in awhile. One of my former colleagues used to say that the CI build &lt;b&gt;should&lt;/b&gt; break occasionally just to know it&#39;s actually working. What&#39;s not okay is to leave the build in a broken state. That slows down the rest of the team by preventing them from checking in or out. Even worse, somebody might accidentally update their workstation with the broken build and get into an unknown state. If you follow these dance steps, you can minimize build breaks and run more smoothly. Besides, it&#39;s embarrassing to have the &amp;#8216;Shame Card&amp;#8217; on your desk.&amp;#8221;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;h3&gt;&lt;a name=&quot;_Toc175993186&quot;&gt;Conclusion&lt;/a&gt;&lt;/h3&gt;  &lt;p&gt;As I said above, there are no silver bullets for much of the complexity we face on software development projects. Continuous Integration is certainly not a silver bullet; but when used effectively, it can indeed improve communication and reduce risk significantly. As Martha says, &amp;#8220;&lt;a href=&quot;http://www.marthastewart.com&quot; target=&quot;_blank&quot;&gt;Continuous Integration: it&amp;#8217;s a Good Thing.&lt;/a&gt;&amp;#8221;    &lt;hr align=&quot;left&quot; width=&quot;33%&quot; size=&quot;1&quot; /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;#_ftnref1_1548&quot; name=&quot;_ftn1_1548&quot;&gt;[1]&lt;/a&gt; My wife often accuses me of being tedious and pedantic, particularly because I tend to use words like &amp;#8220;tedious&amp;#8221; and &amp;#8220;pedantic&amp;#8221;.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;#_ftnref2_5153&quot; name=&quot;_ftn2_5153&quot;&gt;[2]&lt;/a&gt; Jeremy Miller, &lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/archive/2005/07/25/129797.aspx&quot;&gt;http://codebetter.com/blogs/jeremy.miller/archive/2005/07/25/129797.aspx&lt;/a&gt;, 2005&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;#_ftnref3_5153&quot; name=&quot;_ftn3_5153&quot;&gt;[3]&lt;/a&gt; I added the [bracketed text].&lt;/p&gt;  </description><link>http://creedcultcode.blogspot.com/2008/04/continuous-integration-and-you.html</link><author>noreply@blogger.com (dalesmithtx)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/dalesmithtx/SA6vc-QgSPI/AAAAAAAAABQ/1kbULB7wQgY/s72-c/CI_thumb%5B7%5D.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-1031776068046560254</guid><pubDate>Wed, 16 Apr 2008 20:56:00 +0000</pubDate><atom:updated>2008-10-14T18:11:33.255-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Personal</category><title>True Tales of the South - Vol 1</title><description>Returning to Austin recently from a friend&#39;s wedding in Athens, GA, Wife and I had a layover in Houston.  While Wife was napping, I spotted a guy at our gate furtively picking his nose.  I nudged Wife and pointed out the picker to her, but he spotted me spotting him.  The jig was up.  I whispered to Wife that if he got on the plane first, she was going to have to walk in front of me to be a human shield.  Sure enough he was in first class.  Wife made it past him as we walked by.  But as soon as I got to him, he stood up rather suddenly.  I startle easily, so I &quot;busted a grumpy&quot;, as a friend likes to say.  It was silent, swift, and deadly, like a Navy Seal, and I&#39;m sure his freshly-cleared nostrils caught it in full bloom.  Turns out he wasn&#39;t lunging for me though, he was just reaching for something in his carry-on bag.  The end.</description><link>http://creedcultcode.blogspot.com/2008/04/true-tales-of-south-vol-1.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2458356963385756040</guid><pubDate>Wed, 16 Apr 2008 19:17:00 +0000</pubDate><atom:updated>2008-10-14T18:20:26.214-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Actual Items</category><category domain="http://www.blogger.com/atom/ns#">ASP.NET</category><category domain="http://www.blogger.com/atom/ns#">c#</category><title>Actual Items - April 16, 2008 Edition</title><description>Here&#39;s an actual code snippet from a user details page I saw recently:

...
&lt;span style=&quot;font-family:courier new;color:#009900;&quot;&gt;//Get Feedback&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;&quot;&gt;GetFeedback();
&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;color:#009900;&quot;&gt;//Get Paid Invoices&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;&quot;&gt;GetPaidInvoices();
&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;color:#009900;&quot;&gt;//Get Actions:&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;&quot;&gt;GetActions();
&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;color:#009900;&quot;&gt;//Get Address&lt;/span&gt;&lt;br/&gt;
&lt;span style=&quot;font-family:courier new;&quot;&gt;GetAddress();&lt;/span&gt;&lt;br/&gt;

GetOtherData();
...

This goes on for about 15 method calls. Way to go on adding those useful, useful comments in there! And then the call to the method named GetOtherData() isn&#39;t commented at all. Cracks me up.</description><link>http://creedcultcode.blogspot.com/2008/04/actual-items-april-16-2008-edition.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-8431199116279461877</guid><pubDate>Sun, 13 Apr 2008 03:25:00 +0000</pubDate><atom:updated>2008-04-18T14:05:20.684-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TDD</category><category domain="http://www.blogger.com/atom/ns#">Tools</category><title>Tools of the Trade</title><description>I&#39;m a programmer who is interested in much more than just putting in my eight hours a day and drawing my paycheck twice a month. I want to excel at creating software. Learning to do so will be a life-long pursuit sitting at the feet of masters who are kind enough to pass on their expertise.

Standing alongside excellent works by Martin Fowler, Michael Feathers, Brian Marick and others, one of my favorite books on my shelf is &quot;Hand Tools: Their Ways and Workings&quot; by Aldren A. Watson. Mr. Watson is a Vermont woodworker and illustrator who has spent many thousands of hours with the tools of his own trade. He says this about his tools:
&lt;blockquote&gt;&quot;In one sense, tools are simply things of steel and wood, attractive to the
eye, perhaps even beautiful in their efficient lines, functional design, and
appealing contrasts of texture and color. In another, it might be imagines
that they only wait to be taken up and used, when they will then automatically
perform with the precision that their appearance implies. This is an
illusion. Tools can indeed be made to perform extraordinary tasks,
sometimes with such impressive dispatch that they seem to have life of their
own. However, it is more realistic to see that a tool has no more and no
less than a high potentiality for capacity performance. At the same time
each one has its own peculiar ways and workings, individual quirks of
personality, if you like. These traits must be discovered, at times only
through dogged trial and error, and the knowledge of them applied with
persistent discipline and an attitude of acceptance, for the tool will not
change its ways. When a tool is picked up and used in recognition of these
limitations, then its full capability can be exploited to your purposes, and the
two of you will work agreeably in tandem. Thus there is a sharp
distinction between working with you tools and merely working them on
wood.

“To my way of thinking the most practical means of acquiring this
intimate understanding of the ways and workings of a tool is to take apart, see
how it is built and how its mechanism controls its performance. Sharpen
the cutter iron, clean and oil the tool, and put it back together again.
Then look into its adjustments, trying out each one of them on waste pieces of
wood. Experiment, too, with the different handholds, and the stance of
your feet to determine what effect they have on the ease and efficiency of using
the tool.

“All of these factors operate in a cyclical fashion. As the
potentialities and limitations of a tool are explored and understood, the
quality of work tends to improve; and along with it grows the confidence that
even more professional procedures are possible. As the tool begins to show
signs of functioning more nearly as it was designed to perform, you may perceive
that he implications of the phrase ‘in good hands this tool is capable of the
finest work’ is not after all beyond your reach.”
&lt;/blockquote&gt;</description><link>http://creedcultcode.blogspot.com/2008/04/tools-of-trade.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8148570280253114288.post-2777183523420669443</guid><pubDate>Fri, 21 Mar 2008 15:33:00 +0000</pubDate><atom:updated>2008-03-21T08:37:16.726-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">TDD</category><title>Test Driven Development in the Time of Dragons</title><description>&lt;p&gt;Well, the office is abuzz with excitement over TDD. I could not be more pleased! I am genuinely happy that we are actively moving toward embracing developer testing across all of our applications. I started this job seven months ago with the goal of introducing continuous integration and developer testing to the group, and through the efforts of myself and others, that day has definitely arrived.

My next goal is to get our development and business stakeholders to embrace Agile project management. I think the path towards that goal is through developer testing. We are starting out on a new project now spanning multiple applications, and we have unit testing built into our development plans. That’s something to be truly excited about. But beware: There be dragons here!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Waterfall Dragon&lt;/strong&gt;
Achieving widespread adoption of TDD in our office is still an uphill effort though. Our main obstacle is our current project management process: waterfall. In the minds of our business stakeholders (and many of our technical stakeholders), the way you create software is a four-step process:

1) Make all your decisions, both business and technical, up front. Include a decision on when the software will be delivered.
2) Have the development team go away for a few months and build something.
3) Get back together at a pre-determined date to compare what was built to a specification which is now out of step with what the business really needs.
4) Whip the development team for getting it wrong, no matter how much overtime they worked, and then release the product anyway.

The waterfall process doesn’t really lend itself to an iterative, collaborative approach focused on coding business rules in testable code. And our business stakeholders (and many of our technical stakeholders) do not yet grasp the idea that a working suite of tests is a very valuable deliverable. Ideally, we would work directly with the business stakeholders, building the application up by delivering multiple small releases, each focusing on a very small set of features. Instead, we’re trying to cram some XP practices, TDD and continuous integration in particular, into a process that just wasn’t built to accommodate them.

I don’t want to sound cynical though: I’m thankful we’ve at least been given the green light to use a test-driven approach in this project. I think over time, as our test suite grows to cover large swaths of our code base, we will be able to prove to our management that it will be much easier to accommodate changes, or at least that we can determine the impact of those changes much earlier than without the test suite. With a healthy code base, we’ll be in a much better position to embrace Agile development.

&lt;strong&gt;The Legacy Code Dragon&lt;/strong&gt;
I think our second biggest obstacle is legacy code. Our code base stretches back through time, several years in some places, to a time when .Net development was still very new, and almost no .Net developers had even heard of automated developer testing. Code which seemed perfectly reasonable when it was first written has grown a bit gangrenous with age. So we’re starting out saddled with untestable legacy code. In this new project, we will create code we will share among a few applications, and we’ll make changes to those front-end applications too. We will test as much of our new code as possible, and we will learn how to deal with untestable legacy code along the way.

Now the TDD fans among us have varying amounts of experience with test-first development, but no one is a TDD black-belt yet. Some of us have had exposure to TDD at previous gigs, and we’ve all read books, tried samples, attended code camps, and learned some very helpful techniques. But most of the code camp-style TDD presentations that I’ve seen assume the developer will be writing a new app from the ground up, with a completely supportive Agile process to nurture it’s growth and success. We need some advice on how to work TDD into an organization and a code base which have been around a while.

Toward that end, I just ordered Working with Legacy Code by Michael Feathers. In the meantime, we’re starting by keeping Jeremy Miller’s First Rule of TDD in mind: “isolate the ugly stuff.” (By they way, if you haven’t read &lt;a href=&quot;http://codebetter.com/blogs/jeremy.miller/default.aspx&quot;&gt;Jeremy’s blog&lt;/a&gt;, what are you doing here? Stop reading this drivel, and go read his stuff now.)&lt;/p&gt;&lt;p&gt;Next time, I’m going to look at designing and coding a user story in a legacy app.&lt;/p&gt;</description><link>http://creedcultcode.blogspot.com/2008/03/test-driven-development-in-time-of.html</link><author>noreply@blogger.com (dalesmithtx)</author><thr:total>0</thr:total></item></channel></rss>