My PGP public key

May 31st, 2010 Scott Lilly Comments off

—–BEGIN PGP PUBLIC KEY BLOCK—–
Version: PGP Desktop 10.0.2 (Build 13)

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
8NODBoMqrQFao6b+0bsPYrTG5LHPuMpE6B8Kqg==
=tt0w
—–END PGP PUBLIC KEY BLOCK—–

Categories: Uncategorized Tags:

I’m writing a caveman web game at ShinyRockHunter.com

September 26th, 2009 Scott Lilly Comments off

I haven’t been posting here because I’ve been working on a side project for a while.  It’s a free web game where you get to be a caveman.  The game is at www.shinyrockhunter.com.  You can also read about the development progress at http://blog.shinyrockhunter.com.

One cool thing that I recently installed there is a feedback system from www.uservoice.com.  It’s a simple piece of JavaScript to add to your pages, which lets users submit suggestions, vote on them (so you can prioritize them, and even have a forum to discuss them.

Categories: Uncategorized Tags:

Framework Foundations (what’s going into each assembly)

May 17th, 2009 Scott Lilly Comments off

One of the important aspects of the framework is that it should be highly re-usable.  In order to make it re-usable, I’m building it with many small, independent (for the most part) projects.  Those small projects will eventually be used to make the more complex projects.

Think of this like cooking.  Let’s say that our framework provides potatoes to chefs.  Without the framework, each chef  needs to get their potatotoes, peel them, slice them up into the shape needed for the recipe, and cook them.  If we build something that provides us with peeled potatoes, that saves time for 95% of our recipes.  However, if we build something only provides peeled and diced potatoes, that’s not going to help the chef who needs sliced potatoes.  If our “cooking framework” only provided us with peeled, diced, roasted potatoes, it would be a great time-saver for 5% of the recipes, but useless for the remaining 95% of them.  So, I’m starting out the framework to do the simplest, most common tasks.

In the applications at work, one of the most common tasks is to get a list of jobs from the database.  I expect that most programs have their own code to access the database and get this list of jobs.  With all those different versions, we end up with several problems.

  • - The code for each versions may not be optimized (the query being used, handling of disposable objects, caching, etc.)
  • - If we ever need to change the database (or it’s structure), we need modify each program.
  • - If we want to improve performance with caching, we end up with one cache per program (not as efficient as a common cache).
  • - Each programmer had to spend time writing, testing, and debugging their version of the function.

So, this will be the first thing I’ll add to the framework.

I created two projects: ABCD.BusinessObjects and ABCD.Persistence (”ABCD” will be the fake acronym I use for our real division).

The ABCD.BusinessObjects project will be used in almost every project.  This contains classes like the Job object.  I’m building these classes using the Data Mapper design pattern.  I don’t want to use the Active Record design pattern, where the record contains methods to create, read, update, and delete that object from the database.  All the database access code is going into the ABCD.Persistence project.  My feeling is that the Active Record pattern produces objects that don’t pass the “Single Responsibility” aspect of the SOLID principles.  These classes are currently fairly simple, containing mostly get/sets for the properies.

All the business objects inherit from a BaseBusinessObject class.  The only thing in that class is a getter for a virtual boolean property named “IsValid”.  It currently returns “true” in the base class.  By overriding this method in the derived classes, we can have all the validation rules stored along with the class.  Even though the base class doesn’t do anything yet, I put it in place to provide me with a point of flexibility in the code.  If we need to add in something that applies to all classes later on, we already have a place to put it.  If we don’t, even though this class violates the YAGNI principle, it isn’t a burden on us for performance or developer understanding.

The only thing in this project (other than more business objects) is a class to hold enums used by the business objects.  It’s a public static class named ABCDEnums.  I’m a fan of using enums for the datatypes of properties.  I’ve run into too many situations where a boolean property suddenly needs to store a third value.  I believe that FxCop (Microsoft’s code quality tool) even mentions that you should have an “Unknown” or other default value available with each enum.  The reason I’ve added this enums class is because it makes the enums very visible through Intellisense.  If I can’t remember the exact enum name, all I have to do is type “ABCDEnums.” and they will all appear.  That’s also the reason why I’m naming all the namespaces with ABCD.whatever.  When I’m adding in my “using” statements at the top of the class, I quickly get to the point where Intellisense starts showing the available namespaces.  That’s much easier than trying to remember the exact spelling and upper-casing of some long namespace like “BusinessObjectsForEAISystem”.  Although, a tool like ReSharper would be even better (IIRC how it worked during the 30-day trial of it).

My next post will be on the ABCD.Persistence project.  I’ve been going back and forth on a couple of ways of building it, and I expect I’ll have that finalized soon.

Categories: Enterprise Architecture Tags: