Вершина того, за что ухватились другие ответы, состоит не в том, что «магические ценности» плохие, а в том, что они должны быть:
- определяется узнаваемо как константа;
- определяется только один раз во всей области их использования (если это возможно с точки зрения архитектуры);
- определены вместе, если они образуют набор констант, которые так или иначе связаны между собой;
- определяется на соответствующем уровне общности в приложении, в котором они используются; а также
- определяется таким образом, чтобы ограничить их использование в неподходящих контекстах (например, поддается проверке типов).
Что обычно отличает приемлемые «константы» от «магических ценностей», так это некоторое нарушение одного или нескольких из этих правил.
При правильном использовании константы просто позволяют нам выражать определенные аксиомы нашего кода.
Что подводит меня к окончательному выводу, что чрезмерное использование констант (и, следовательно, чрезмерное количество допущений или ограничений, выраженных в терминах значений), даже если оно иным образом соответствует вышеуказанным критериям (но особенно, если оно отклоняется от них), Это может означать, что разрабатываемое решение не является достаточно общим или хорошо структурированным (и поэтому мы больше не говорим о плюсах и минусах констант, а о плюсах и минусах хорошо структурированного кода).
Языки высокого уровня имеют конструкции для шаблонов на языках низкого уровня, которые должны использовать константы. Те же шаблоны можно использовать и в языке более высокого уровня, но этого не следует делать.
Но это может быть экспертное суждение, основанное на впечатлении всех обстоятельств и того, как должно выглядеть решение, и то, как именно это суждение будет оправдано, будет сильно зависеть от контекста. В самом деле, это может быть неоправданным с точки зрения какого-либо общего принципа, кроме как утверждать: «Я достаточно взрослый, чтобы уже видеть такую работу, с которой я знаком, лучше»!
РЕДАКТИРОВАТЬ: приняв одно редактирование, отклонив другое и теперь выполнив свое собственное редактирование, могу ли я теперь считать, что стиль форматирования и пунктуации в моем списке правил должен быть установлен раз и навсегда, ха-ха!