The work a system does and the interface to that work should be separated from one another. This is a concept that evolves from the Single Responsibility Principle and from Test Driven Development. Whether this work be hosted in a console program, a GUI program, exposed as a service for outside systems to utilize, or any other possible configuration, follow SRP and keep the work separate from the hosting interface that exposes the work to a client (a client in this case can be a person or another software system).
Rjae, Rob, Kasia Baron, and I went to the Deep Agile 2008 conference run by New England Agile Bazaar. The event was held over the course of two days at MIT's Tang Hall and was truly outstanding. The structure of it, as noted at Agile Bazaar's website, was a one-on-one discussion, debate-style, between Robert Martin and James Coplien and it focused on the realities of Agile software development.
On any given project, we typically have a ThirdParty directory where we house all our third-party assemblies that we reference. Inside of that directory we create directories representing each assembly or set of assemblies. For instance, we usually have a ThirdParty directory that contains a directory for each NUnit version we've used on the project at any given time. If we were to start a project today, we'd have a ThirdParty directory that contains an NUnit-2.4.2-net-2.0 directory (since that is the latest NUnit version).
I'm currently working on a project that contains C# as well as VB.NET. 95% of my time is spent with C#, fortunately, since that is my strength, but since I do have to foray into VB and since I'm in love with Resharper, I downloaded the official release of Resharper 3.0 today and tried it out. Along with the VB.NET support it now has, I was interested in seeing any other cool features they've added to it.
This the first of five sessions will introduce many principles and practices of test driven development. The primary outcome for this session is to reveal how to ensure full test coverage and understand the incredible value that provides any project.
Update: The C# solution from this session as well as a Java version have been attached below.