Use More Magic Literals
By Adrian Sutton
In programming courses one of the first thing you’re taught is to avoid “magic literals” – numbers or strings that are hardcoded in the middle of an algorithm. The recommended solution is to extract them into a constant. Sometimes this is great advice, for example:
if (amount > 1000) { checkAdditionalAuthorization(); }
would be much more readable if we extracted a ADDITIONAL_AUTHORIZATION_THRESHOLD variable – primarily so the magic 1000 gets a name.
That’s not a hard and fast rule though. For example:
value.replace(PATTERN_TO_REPLACE, token)
is dramatically less readable and maintainable than:
value.replace("%VALUE%", token)
Extracting a constant in this case just reduced the locality of the code, requiring someone reading the code to unnecessarily jump around the code to understand it.
My rule of thumb is that you should extract a constant only when:
- it’s reasonably easy to think of a good name from the constant – one that adds meaning to the code OR
- the value is required in multiple places and is likely to change
Arbitrary tokens like %VALUE% above are generally unlikely to change – it’s an implementation choice – so I’d lean towards preserving the locality and not extracting a constant even when they’re used in multiple places. The 1000 threshold for additional authorisation on the other hand is clearly a business rule and therefore likely to change so I’d go to great lengths to avoid duplicating it (and would consider making it a configuration option).
Obviously these are just rules of thumb so there will be plenty of cases where, because of the specific context, they should be broken.