Easy to Miss Code Smells
Editorial Note: I originally wrote this post for the NDepend blog. Please head over to the site and check out the original. There’s a lot of great content over there, and, if you’re not familiar with NDepend, download a trial and try it out.
The concept of a code smell is, perhaps, one of the most evocative in our profession. The name itself has a levity factor to it, conjuring a mental image of one’s coworkers writing code so bad that it actually emits a foul odor. But the metaphor has a certain utility as well in the “where there’s smoke, there may be fire” sense.
In case you’re not familiar, a code smell is an observable feature of the code (the smoke) that often belies a deeper existing problem (the fire). When you say that a code smell exists, what you’re communicating is “you may be justified here, but I’m skeptical – in my experience this is probably a design flaw.”
Of course, accusing code of having a smell is only slightly less incendiary to the author than accusing code of being flat out bad. Them’s fightin’ words, as they say. But, for all the arguments and all of the righteous indignation that code smell accusations have generated over the years, their usefulness is undeniable.
No doubt you’ve heard of some of the most common and easiest to visualize code smells. The God Class, Primitive Obsession, and Inappropriate Intimacy all come to mind. These indicate, respectively a class in your code base doing way too much, a tendency to use primitive types when you should take advantage of classes, and a module or class that breaks encapsulation by knowing too many details about another. The combination of their visual memorability and their wisdom has prodded us over the years to break things down, to create cohesive objects, and to preserve encapsulation.
I would argue, however, that there are many more code smells out there than the big, iconic ones that get a lot of attention. I’d like today to discuss a few that I don’t think are as commonly known. I’ll make the case for why, once you’ve mastered avoiding the well-known ones, you should watch for these as well.