Any problem in computer science can be solved with one additional layer of indirection. But that usually will create another problem. - David Wheeler
Any sufficiently advanced technology is indistinguishable from magic. - Arthur C. Clarke.
These are two classic truisms. Recently while staring at some code trying to figure out what the heck was going on, I realized the obvious.
One additional layer of indirection is indistinguishable from magic. - Scott Hanselman, this morning in a rare moment of clarity while hopped up on Diet Coke.
In recent talk at Mix on ASP.NET MVC (there's video there also) I mentioned that a certain line of code was magic:
public void Update(int id)
viewData.Product = db.Products.Single(p => p.ProductID == id);
//MAGIC STARTS HERE
catch (InvalidOperationException err)
viewData.ErrorMessage = err.Message;
Why did it feel like magic? A few reasons.
- It does a LOT. It takes all the values from a Form POST and lines them up with the public Properties in an object instance. This is done in the context of a Form POST to a Controller Action in ASP.NET MVC.
- It isn't named well. Update is a verb, so that's cool, but the "From" makes me feel inverted.
- The parameters are (possibly) in the wrong order. Given the name, I'd have expected UpdateFrom(Form, Product), but even then it doesn't feel write.
All of this adds up to an impedance mismatch, IMHO. It's too confusing and I'm just a caveman (video). As such, I declare it as black magic.
This magic was brought up to the team (I think I remember hitting someone, there may have been some swearing. ;) ) and Rob changed it in a number of good ways.
- It's discoverable. He hung it off of the Request where you can actually stumble upon in.
- It's named directly. Rather than the inverted UpdateFrom, it is now DeserializeTo which reads better left to right as in Request.DeserializeTo(product).
- It's simpler. Because it's hanging off the object that was previously a parameter, it has one less parameter and again, reads nicely left to right.
//FEELS LESS MAGICAL
Jeff Moser's (see I told you I'd mention him twice) fine post talks about how cognitive "chunks" that represent solutions to problems can be more easily stored in our brains if they flow. Scott Bellware has called this concept "solubility." Code that uses frameworks with some balanced between focus on aesthetic and usability is more easily grokked.
I don't know if this is the final method, it's probably not, but I really enjoy discussions like this that aim to make things less like magic and more obvious and discoverable.