Friday 1st June 2018 in programming

Constants can change!

A common misconception I’ve noticed amongst fellow programmers is the idea that constants can never be modified. Whilst it is true that a constant’s value may never change during runtime, it may certainly be appropriate for a programmer to modify it in the source code.

Consider the following JavaScript for calculating a product’s price before value-added tax (VAT) is applied, given its price after it has been applied:

const VAT_PERCENT = 17.5;
let calcBasePrice = sellingPrice => sellingPrice / (1 + VAT_PERCENT / 100);

Now suppose a recession occurs and the Chancellor of the Exchequer decides to reduce VAT from 17.5% to 15%. Well in that case, we can simply change the first line of code to:

const VAT_PERCENT = 15;

Since we’ve changed the value of VAT_PERCENT, why not just make it a variable? Well, let’s see what happens if we do. Oh, and let’s create a new function whilst we’re at it to calculate the VAT:

var VAT_PERCENT = 15;
let calcBasePrice = sellingPrice => sellingPrice / (1 + VAT_PERCENT / 100);

var VAT_PERCENT = 15;
let calcVAT = sellingPrice => sellingPrice * (1 - 1 / (1 + VAT_PERCENT / 100));

Well, whoever wrote the above code is clearly not the best programmer. They’ve accidentally re-declared the VAT_PERCENT variable, and the calcVAT function is a bit overly complex. Still, the code works. That’s the important part, right?

Now suppose the Chancellor of the Exchequer decides to increase VAT from 15% to 20%. The programmer updates the code:

var VAT_PERCENT = 20;
let calcBasePrice = sellingPrice => sellingPrice / (1 + VAT_PERCENT / 100);

var VAT_PERCENT = 15;
let calcVAT = sellingPrice => sellingPrice * (1 - 1 / (1 + VAT_PERCENT / 100));

Oh no! The programmer has updated the first declaration of VAT_PERCENT, but hasn’t noticed that VAT_PERCENT was declared a second time.

This is why constants are so useful. Once you’ve declared and assigned them, they cannot be re-declared or re-assigned.

So why not use these named constants all the time? Why not do:

const NINETY_NINE = 99;
const ONE = 1;
for (var i = NINETY_NINE; i >= ONE; --i) {
  console.log(i + " bottles of beer on the wall,");
  console.log(i + " bottles of beer.");
  console.log("Take one down, pass it around,");
  console.log(i-1 + " bottles of beer on the wall.");
}

That certainly works, but there is no point in declaring a named constant for the number three. Unlike VAT which is subject to change, the number ninety-nine will always have the value 99, and the number one will always have the value 1. Therefore it is perfectly legitimate to use a literal constant for this purpose.

In summary:

  • Use variables for things that change during runtime.
  • Use named constants for things that are subject to change external to the program (or for convenience/legibility, e.g. π).
  • Use literal constants for things that will absolutely never change (unless giving it a name is more convenient/legible).