"There are two hard problems in computer science: Cache invaliation, naming things, and off by one errors."
– Source: Martin Fowler
Naming things is hard. Why do we expend so much effort to get them right? Because naming programming concepts well gives us a big insight into how they fit into the system we’re designing. Continually renaming things records our insights as we go: the right names for our objects, methods and variables will yield fresh insight and in turn shape the design of the system.
J.B. Rainsberger talks about names of classes, methods and variables going through four stages:
Nonsense: For example, we might extract a method from a larger one and quickly rename it
foo()to get the refactor done and the tests passing.
Accurate: We rename the nonsense method to what it actually does, such as
Precise: Once we realise what the method really does, we might refine the accurate name and give it more precision, such as
Meaningful: At this point, we’ve revealed the complexity of the method, and can look to split it up into two methods:
forEachEmployee()and perhaps a
pay()method on a seperate interface.
Some simple rules of thumb to follow when naming things:
Don’t be afraid of nonesense names. We shouldn’t shy away from the early stages of naming. If we’re not sure what something is yet, give it a nonsense name. The name
foo()is fine, as long as it’s only going to last fifteen minutes. Best not to commit it though :)
If you don’t like the code you’re writing, use really long names. If in doubt as to what or where something fits, use a really (really) long name: the longer and more precise the better. I will call a variable something like
computed_unsorted_project_task_matrixespecially if I don’t like it and want to refactor it at some point. This is much better than
r). I reveal the complexity of the object through the name, which helps reveal complexity in the code.
Characters are cheap, confusion is costly. Let’s not make things harder for the programmers who come after us. Remember, this is just as likely to be ourselves in a few months. Let’s avoid using a name like
projectis only four characters more typing. Anything that reduces reading friction in our code is a good thing.
How often do you rename your methods, objects, and classes? How does naming help you understand your code?