Всегда ли короткие имена переменных - зло?
Автор: S0ER
Советы о том каких случаях короткие имена переменных оправданы.
Всегда ли короткие имена переменных - зло?
Никто не будет спорить с тем, что имена переменных в коде должны быть понятными и выразительными. Но с тем, что выразительное имя - это всегда полное, понятно описание из которого можно понять для чего существует та или иная переменная - это тема для спора.
Я люблю короткие имена переменных, люблю аббревиатуры, часто их использую и мне не нравится писать длинные имена по типу "encodedDataBasePasswordStr", даже с автокомплитом.
Поэтому давайте сформулирую свои правила в отношении коротких имен переменных.
Когда короткие имена приемлемы
- В небольших методах с очевидным контекстом
- В математических вычислениях, где традиционно используются короткие обозначения
- Для итераторов в небольших циклах
- В лямбда-функциях, где контекст ясен
Пример оправданного короткого имени.
function calculateDistance(x1: number, y1: number, x2: number, y2: number): number {
const dx = x2 - x1;
const dy = y2 - y1;
return Math.sqrt(dx * dx + dy * dy);
}
В этом случае:
x1, y1, x2, y2 - стандартные математические обозначения координат
dx, dy - общепринятые сокращения для "delta x" и "delta y"
А типы параметров (number) делают назначение переменных ещё понятнее
Когда короткие имена недопустимы
Однако есть ситуации, когда короткие имена действительно становятся проблемой:
- В больших методах, где контекст теряется
- Для переменных с широкой областью видимости
- Когда назначение переменной неочевидно
- Для булевых флагов, где важно понимать критерий
Пример плохого использования:
function processUserData(u: User, d: DataProcessor, c: Config) {
// ... 50 строк кода ...
if (u.s) { // Что такое 's'? Статус? Субscription? Счёт?
d.p(u); // Что делает 'p'? process? print? persist?
}
}
При этом вместо u
вполне можно было использовать сокращения usr, а вместо c
использовать cfg
, это устоявшиеся сокращения, поэтому использовать их можно.
Когда есть возможность аннатировать переменную ее типом, с учетом небольшого размера функции, нормальным становится и вариант с u
:
interface User {
id: string;
name: string;
age: number;
}
// Хорошо - тип ясен из контекста
function greet(u: User) {
console.log(`Hello, ${u.name}!`);
}
Для итераторов в небольших циклах короткие имена допустимы:
const numbers = [1, 2, 3];
// i - общепринятое имя для индекса
for (let i = 0; i < numbers.length; i++) {
console.log(numbers[i]);
}
В функциональном программировании для простых операций:
const users = [{name: 'Alice'}, {name: 'Bob'}];
// n - понятно в контексте map
const names = users.map(u => u.name);
Надеюсь, приведенные пример убедили вас, что в зависимости от ситуации короткие имена переменных не только допустимы, но и помогают писать выразительный код.