🗿 Констатируем
Довольно часто можно увидеть недопонимание как должны выглядеть константы. Конечно для констант используется UPPER_CASE. Однако не все понимают что такое константа.
Я встречал константами и функции, и массивы, и объекты. "Стоп-стоп-стоп, а что не так с массивами и объектами?" могут задаться вопросами. И правда, в целом они могут быть константными, тут и начинается разночтение.
Для начала следует понять откуда растут ноги - константы пришли к нам в мир программирования из математики. Это неизменяемое значение, которое вообще никогда не меняется. Конечно мы не математики, и данный параметр может поменяться, но не во время исполнения программы - это очень важно. Константа всегда должна оставаться с одинаковым значением и начала и до конца ее жизни.
И вот что я понял: константами определяются атомарные сущности, которые никогда не меняются и используются как одно целое и не могут производить вычисления. Рассмотрим пример:
const CONST_1 = () => {}; // incorrect ❌
const CONST_2 = 10; // correct ✅
const ARR_CONST = [1, 2, 3, 4, 5]; // correct ✅
// incorrect: ❌
if (ARR_CONST.includes(2)) {
}
// correct: ✅
if (includes(ARR_CONST, 2)) {
}
const CONFIG = { x: 1, y: 2 }; // correct ✅
calculate(CONFIG.x, event); // incorrect ❌
calculate(CONFIG, event); // correct ✅
// incorrect: ❌
const CFG = {
FOO: {},
BAR: 12,
};
// correct: ✅
const cfg = {
FOO: {},
BAR: 12,
};
Из примеров видно, что константы могут быть использованы только целиком. Они могут быть вложенны друг в друга, потому что это контекст, как es6 модуль export * as config from './config'
- такие вещи не именуются через UPPER_CASE никогда. В других языках это может быть использоваться с большой буквы.
🫨 На меня накричали!
Некоторые используют в опредении только "эта переменная не меняется в ходе программы, потому она константна". Функция или процедура - это минипрограмма, тогда по этому определению такой код является валидным:
const NUMERS = [1, 2, 3, 4, 5] as const;
const MY_SUPER_CALCULATION = (ADDITIONAL: number) => {
const RESULT = NUMBERS.reduce((ACC, N) => ACC + N, 0) + NUMBERS;
if (RESULT <= 0) {
return undefined;
}
return RESULT;
};
NUMBERS
- никогда не меняется. Значение переменной MY_SUPER_CALCULATION
тоже - не забываем, это переменная у которой в значении лежит функция. Аргумент ADDITIONAL
тоже никогда не меняется в ходе программы вычисления(функции). Дальнейшую логику я думаю вы уловили. В данном примере вообще никогда ничего не меняется, потому все подходит под это простое определение. Это крайний случай, но по частям данные проблемы начинают возникать на разных проектах.