Daniel Hoelbling-Inzko talks about programming
It’s amazing how much smarter you can become by simply looking at other people’s code. So, today I spent almost half the morning looking at different test frameworks from the TDD/BDD world looking for cool tricks I haven’t thought of (I examined MSpec, NBehave, NSpec and xUnit). One of those interesting little tricks (trivial at best, but valuable) is the following I found in xUnit’s Guard.cs:
Guard class, used for guard clauses and argument validation
Imagine the following method:
public bool Authenticate(string username, string password) { return username == "daniel" && password == "tigraine"; }
Let’s say my specification for this method says: “input username and password can’t be null and should return a ArgumentNullException”. Reasonable, since we never trust input. So, usually I’d create guard clauses at the top of my method to protect me from said bad input:
public bool Authenticate(string username, string password) { if (username == null) throw new ArgumentNullException(username); if (password == null) throw new ArgumentNullException(password);return username == "daniel" && password == "tigraine"; }
I always thought about this as rather readable and nice to work with, until I saw what xUnit did in Guard.cs, allowing me to shorten the above to a simple:
public bool Authenticate(string username, string password) { Guard.ArgumentNotNull("username", username); Guard.ArgumentNotNull("password", password);return username == "daniel" && password == "tigraine"; }
I still believe this can be improved upon, maybe making it only one argument instead of two, but for now this is way better than what I used to write before.