Elementor Header #8

22. Магические числа

1. Введение

Магическое число — это числовое значение, которое используется в коде напрямую, без объяснения его смысла. Эти числа могут запутывать код и усложнять его понимание и поддержку, особенно если они встречаются многократно и их значение неочевидно.

2. Проблемы с магическими числами

Магические числа затрудняют чтение и сопровождение кода. Вот несколько основных проблем:

  1. Неясность значения: Если кто-то читает код, не зная, что означает конкретное число, это усложняет понимание логики программы.

  2. Трудность изменения: Если магическое число нужно изменить в будущем, необходимо найти и заменить его во всём коде. Это может быть сложно и рискованно.

  3. Повышенная вероятность ошибок: Если одно и то же число встречается в нескольких местах и вы хотите изменить его значение, легко пропустить какое-то использование, что приведет к ошибкам.

3. Примеры магических чисел

Рассмотрим простой пример с магическим числом:

				
					#include <iostream>

int main() {
    int salary = 50000;
    double tax = salary * 0.13; // 0.13 — магическое число
    std::cout << "Tax: " << tax << std::endl;
    return 0;
}

				
			

В этом коде значение 0.13 используется напрямую, без объяснения его смысла. Если кто-то другой будет читать этот код, им будет непонятно, что это за число и почему оно используется.

4. Как избежать магических чисел

Лучший способ избавиться от магических чисел — использовать именованные константы. Это делает код более читабельным и упрощает его поддержку.

1. Использование const

Пример выше можно улучшить, заменив магическое число именованной константой:

				
					#include <iostream>

int main() {
    const double TAX_RATE = 0.13; // Именованная константа
    int salary = 50000;
    double tax = salary * TAX_RATE;
    std::cout << "Tax: " << tax << std::endl;
    return 0;
}

				
			

Теперь код ясно указывает, что TAX_RATE — это налоговая ставка. Это делает код понятнее и даёт возможность легко изменить значение ставки, если это потребуется.

2. Использование enum для группировки значений

Если у вас есть набор связанных значений, их можно объединить в перечисление (enum). Это помогает избежать магических чисел в случаях, когда используется несколько связанных констант.

Пример:

				
					#include <iostream>

enum DifficultyLevel {
    EASY = 1,
    MEDIUM = 2,
    HARD = 3
};

int main() {
    int level = EASY;
    
    if (level == EASY) {
        std::cout << "You selected Easy difficulty." << std::endl;
    } else if (level == MEDIUM) {
        std::cout << "You selected Medium difficulty." << std::endl;
    } else if (level == HARD) {
        std::cout << "You selected Hard difficulty." << std::endl;
    }

    return 0;
}

				
			

В этом примере вместо использования магических чисел 1, 2, 3 для обозначения уровней сложности используются именованные константы, что делает код более понятным.

5. Преимущества отказа от магических чисел

  • Повышение читаемости кода: Именованные константы делают код более понятным, так как их имена описывают смысл значений.

  • Упрощение сопровождения: Когда значение требуется изменить, это легко сделать в одном месте (определении константы), и это изменение сразу применится ко всем частям программы, где используется эта константа.

  • Снижение вероятности ошибок: Использование констант помогает избежать ошибок, связанных с повторением одинаковых чисел в коде.

Заключение

Магические числа являются распространённой проблемой в программировании, которая может привести к ухудшению качества кода и затруднить его сопровождение. Избегайте использования магических чисел, заменяя их именованными константами, что делает код более понятным и лёгким для изменений.

6. Тестовое задание

Напишите программу на C++, которая:

  • Рассчитывает стоимость товара с учётом НДС.
  • Использует именованную константу для обозначения ставки НДС (например, 20%).
  • Выводит на экран первоначальную стоимость товара, сумму НДС и общую стоимость.

Примерный код:

				
					#include <iostream>

int main() {
    const double VAT_RATE = 0.20; // НДС в размере 20%
    double originalPrice = 100.0; // Первоначальная стоимость товара
    double vatAmount = originalPrice * VAT_RATE; // Сумма НДС
    double totalPrice = originalPrice + vatAmount; // Итоговая стоимость

    std::cout << "Original Price: " << originalPrice << " units" << std::endl;
    std::cout << "VAT Amount: " << vatAmount << " units" << std::endl;
    std::cout << "Total Price: " << totalPrice << " units" << std::endl;

    return 0;
}

				
			

Запустите программу и убедитесь, что она правильно рассчитывает и выводит суммы.

logo