Всегда ли короткие имена переменных - зло?

Автор: 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);

Надеюсь, приведенные пример убедили вас, что в зависимости от ситуации короткие имена переменных не только допустимы, но и помогают писать выразительный код.