For all the kerfuffle about maintainability recently, it’s worth noting that actually the principal participants agree much more about best practices than they disagree. The SOLID principles underpin pretty much every major open source .NET project I’ve examined. (There’s a selector bias here, but I’m not going to worry about it.) They are, in my opinion, much more important than the design patterns I’ve been talking about. Sadly, they’re not half as well known as the Gang of Four book. They should be, because they can be summarized as follows: you need to change the way you develop.
Now, people are always saying this, and they’re usually wrong. AOP, Workflow, there’s any number of new development ideas that have fallen by the wayside. In practice, this one won’t, mostly because actually the ideas are quite old. They’re just not widely understood.
When I was at University, I had to deliver a project in Turbo Pascal. I think the Maths Department must have been allergic to curly braces. Like a good little geek, I opened the user guide and started reading. Now, most technical documentation is completely unreadable, but this was different. It was, in fact, one of the single best bits of technical documentation I’ve ever read. It introduced a whole new concept to Turbo Pascal: object-oriented development. C++ had been around for a while, but the concepts were entirely new to me; programming for me was pretty much defined by Kernighan and Ritchie, as it was to most of the people I knew.
This new OOP concept was a revelation: it was, finally, a logical way of organizing your code built right into the language. All you had to do was identify your objects, which behaved like actors in a play. The actors would play their parts, and the program would come about as a combination of the actors.
Unfortunately, this was dead wrong.
Objects aren’t actors, a single business concept doesn’t necessarily correspond to one object. This will lead you directly to the creation of god objects. It turns out that the development of code isn’t principally about modelling. It’s about flexibility, dependencies and coupling, and only then about modelling. Ironically, this approach leads to better models in the long term, simply since the model will track changes in requirements faster.
What is “good” code?
I think I’ve probably seen more fruitless arguments about this than any other subject. Everyone thinks their code is good, and sometimes they’re right. Good code definitely isn’t the same thing as useful code, which is an error a lot of developers make. Good code isn’t about aesthetics or huge architectures either. Here’s the only definition of good code worth having: good code is code you can easily change. There are many formerly popular technologies (CORBA particularly springs to mind) that failed that one test. The SOLID principles are guidelines designed to make your code easy to change.
So, I’ve decided to write a York Notes guide to SOLID. My principal sources are Uncle Bob’s own website, and the excellent Hanselminutes podcasts on the subject. One of the things you’ll probably notice as you go through is that your code tends to get longer:
- There’s more interfaces
- There’s more small classes
- There’s more constructor parameters
- There’s more instance variables
I really, really advise getting ReSharper, it turns doing this from what feels like an extremely bureaucratic endeavour to a case of pressing “Alt-Enter, Enter” a lot. One day I hope I’ll be able to see this stuff baked into the language.