Wednesday, August 11, 2010
"Would I use classloader magic and bytecode manipulation to set dependencies in production code? No. Would I use reflection to modify private fields in production code? No. Would I refactor to introduce an interface between objects? Yes. Would I refactor an object to get a dependency through its constructor instead of from a global variable? Yes." Nat Pryce
Tuesday, August 10, 2010
There's a subsystem (a console app that receives tasks and sends reports via WCF). About a month ago I, influenced by GOOS book, wrote a couple of end-to-end tests for the app just before making another refactoring (yes, the app is rather messy) and adding a new feature to it. I liked how it worked.
Yesterday I did a quite big refactoring of the subsystem doing TDD. Things went really smoothly and a bunch of small, focused, loosely coupled classes were the result. At the end, when I was sure that everything is ready to launch the app, I run the end-to-end tests and (uppps) one of them was red! Good! It turned out that I added a class implementing a role interface that'd been already implemented by another one and pass the former as a dependency. The class has default fake implementation (it threw a NotEmplementedException) and cause the app to shut down in a rather rare case (which luckily was covered by the test).
What I realized from this story: we must write end-to-end tests if we want to be sure that all those nice classes really work together. Without them we're doing such a thing that Russians call "a horse in vacuum", i.e. a thing that doesn't has any practical use.
Sunday, August 8, 2010
Saturday, August 7, 2010
"Growing Object-Oriented Software Guided by Tests" by Steve Freeman and Nat Pryce is the most useful, serious and well-written book I've read in last couple of years. It's all about TDD (test-driven development) and OOD. The book shows how unit tests evolve good OO design and how end-to-end tests let the programmer be sure that the hole system actually works. The book is not for juniors - to get the ideas work for you, you must have many years of experience as a software developer, not an architect, a project manager, a coder or whatever.
Every programmer writing in any OO programmer language must read the book twice. I've done.
Among others, I like the authors' conception of "test data builders" which extremely simplifies creating value type objects in tests. There's an open source library for create the builders easier - "Mare It Easy" (its .NET port is available here). I've just tried the latter one and I realized I'll fall in love with it soon :)