—–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—–
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.
There used to be a television commercial for some candy that had chocolate and peanut butter. In it, there would be one person walking around with an open jar of peanut butter and another walking around with a chocolate bar. They would bump into each other and the chocolate would end up in the peanut butter. The peanut butter owner would exclaim, “You got your chocolate in my peanut butter!” While the chocolate bar owner would shout, “You got your peanut butter on my chocolate!” They’d both try this new concoction, declare it an amazing snack, and all of us viewing would go out to buy the candy.
What does all this have to do with programming? While thinking about how to develop a good framework for the suite of apps I work with, I’ve been looking at what I’ve seen that works and what doesn’t work. One thing that I see a lot of is procedural code written in object-oriented languages. We’ve all seen (and probably created) classes with a method that is hundreds, if not thousands, of lines long. You got you procedure in my object! But I think the opposite problem can also occur. When working towards an “ideal” application, you can try forcing procedural processes into objects, handling them with massive event raising or forcing them into place with an implementation of the Chain of Responsibility pattern. You got your object in my procedure!
One of my thoughts when creating this framework is to have objects (Customers, Jobs, etc.) represented by objects, and have processes handled in procedural methods. I’ll still be following the SOLID principles, especially Single Responsibility and Dependency Inversion. However, I won’t be forcing things to use styles that don’t seem to be appropriate. My next post will go into some detail of how (and why) I’ve set up the projects for the framework.
BTW, as I started writing this, a friend of mine sent me an e-mail with a link to a funny history of computer languages, complete with a reference to the chocolate/peanut butter commercial. Check out this Brief, Incomplete, and Mostly Wrong History of Programming Languages for a laugh.