JavaScript: Магические числа
Рассмотрим пример программы, которая выполняет конвертацию валют:
const eurosCount = 1000;
const dollarsCount = eurosCount * 1.25; // => 1250
const rublesCount = dollarsCount * 60; // => 75000
console.log(rublesCount);Технически код работает. Но с точки зрения профессиональной разработки такой код считается плохой практикой.
В чём проблема?
В выражениях использованы непонятные числа: 1.25 и 60. Что это за значения? Курс валют? Откуда они взялись? Через месяц или год вы, скорее всего, не вспомните, что именно означают эти числа. А если код откроет другой разработчик, он просто не поймёт, откуда всё берётся. Такие числа называются магическими.
Магические числа (magic numbers) представляют собой числовые значения, смысл которых не ясен из кода. Обычно они используются в математических выражениях напрямую, без переменных с понятными названиями. Чтобы понять их назначение, приходится вникать в контекст или читать дополнительную документацию. Магические числа затрудняют чтение, понимание и поддержку кода.
Как избежать магии
Самый простой способ состоит в том, чтобы вынести такие значения в переменные с понятными именами. Тогда смысл станет очевиден:
const dollarsPerEuro = 1.25;
const rublesPerDollar = 60;
const eurosCount = 1000;
const dollarsCount = eurosCount * dollarsPerEuro; // => 1250
const rublesCount = dollarsCount * rublesPerDollar; // => 75000
console.log(rublesCount);Сами числа никуда не делись, но теперь они записаны в переменные, названия которых однозначно говорят, что это.
Вывод
Магические числа делают код непонятным и трудным для поддержки. Чтобы избежать этой проблемы, нужно заменять такие числа переменными с осмысленными именами. Это делает код более читаемым, особенно в долгосрочной перспективе. Понятный код всегда важнее компактности, даже если программа станет чуть длиннее.
Задание
На складе стоят поддоны с ящиками. Вынесите «магические» числа 6 и 17 в именованные переменные и выведите результат.
console.log('Boxes in stock:');
console.log(6 * 17);Ожидаемый вывод:
Boxes in stock:
102Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
// @ts-check
import { expect, test, vi } from 'vitest';
test('hello world', async () => {
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => {});
await import('./index.js');
const firstArg = consoleLogSpy.mock.calls.join('\n');
expect(firstArg).toBe('Boxes in stock:\n102');
});Решение учителя откроется через:
20:00
