The Golden Rule of Variable Naming
Tags: naming, bestpractices
Published: 2020-04-02 15:46:06

A while back I wrote a post that I am still particularly proud of: [The Ten Commandments For Naming Your Code](https://exceptionnotfound.net/ten-commandments-for-naming-your-code/). In it I published ten "commandments" for variable naming that I believed would help all of us get rid of bad names.

![](https://images.unsplash.com/photo-1574307619753-291d2842e09e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=2000&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ)<figcaption>They were also much less doom-and-gloom than these.  Photo by [Sean Foster](https://unsplash.com/@fosterious?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit) / [Unsplash](https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit)</figcaption>

The commandments were:
1. Be specific
2. Don't use unnecessary words
3. Don't use abbreviations
4. Use the code's primary human language (e.g. don't use Spanish when everyone on  your team speaks English).
5. Don't make up words
6. Don't include the variable type in the name
7. Use non-obvious words only if the meaning is obvious to your team.
8. Prefer active voice (e.g. prefer "Transform" over "GetTransformation")
9. Use consistent syntax
10. Break these rules if necessary

I still think these commandments are good guidelines, but in the four-plus years since I published that post, I've gotten a bit more nuanced in how I name my variables. I've come up with a process, a process that I can use to accurately name almost anything.

Problem was, until recently it was very difficult to describe that process to others, though. I just knew, and I didn't necessarily know how I knew. For example, I can look at this declaration and just "know" that it can be made better:

```csharp
byte[] ctnt = docClass.Content(dID);
```

After a bit of trial and error, most likely I'll replace those names with the following:

```csharp
byte[] content = documentRepository.GetContent(docID);
```

But if anyone were to ask me "why did you rename those variables to those specific names" the best explanation I could come up with was "because these are the only ones that sounded right" which is terribly unsatisfying.

But now, I can answer these questions not with the ten commandments above, but merely one rule: the Golden Rule of Variable Names.

![](https://images.unsplash.com/photo-1516462919870-8bcf749b0135?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=2000&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ)<figcaption>This particular gold will get EVERYWHERE. Just like bad names.  Photo by [Sharon McCutcheon](https://unsplash.com/@sharonmccutcheon?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit) / [Unsplash](https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit)</figcaption>

##The Golden Rule

So what is this golden rule? It is merely this:

> Variable names should be as descriptive as necessary while still being as concise as possible.

That's all there is to it.

"But Matthew" I hear you dear readers saying, "there's still a lot of room for interpretation in that rule, isn't there?" You are correct. Naming things is an art and a skill, one that we gain only through practice and failure. This rule, while very helpful, does not account for all situations, for such a "one and only" rule would be impossible to make.

Nevertheless, it's still an enormously useful adage. Take that earlier example:

```csharp
byte[] ctnt = docClass.Content(dID);
```

From the First Golden Rule alone, we can make the following conclusions:

1. The name "ctnt" is concise, yes, but not descriptive. This is not a word, merely a collection of letters, and is easily misinterpreted. We should replace it with a name that accurately describes what it represents.
2. The name "docClass" is pretty generic. What is this class: a service, a repository, a mapper, something else? We can't tell. We should replace this name with something that tells the reader what this class is generally supposed to do.
3. The method name "Content" is both readable and concise, but not descriptive enough. What does this method do to the content? Does it retrieve it, or update it, or delete it? We can't tell. We should replace this name with a more active name, something that spells out exactly what this method does.
4. The variable "dID" is concise but not understandable. Most likely it's the ID of a particular document, what if there are business objects such as "diary" or "dialogue"? We can't know what this is supposed to represent without digging further into the code. We should replace this name with a more descriptive one.

So, by applying the Golden Rule of Variable Naming, we can arrive at a better example:

```csharp
byte[] content = documentRepository.GetContent(docID);
```

This is much better than we started with. It is now clear that this line of code is retrieving the stored content of a specific document from some data store.

##Summary

The Golden Rule of Variable Naming helps us name our variables in such a way that other people can read our code and more easily understand the intent we were trying to convey. It's not a be-all, end-all rule, but helps us inch closer to the ultimate goal of writing readable code: understandability.

![](https://images.unsplash.com/photo-1531539134685-27d854339120?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=2000&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ)<figcaption>She's not quite there yet.  Photo by [Mimi Thian](https://unsplash.com/@mimithian?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit) / [Unsplash](https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit)</figcaption>

If you have other naming guidelines you'd like to share, naming horror stories you want to tell, or if you just think I'm totally wrong, please share in the comments!

Happy Naming!