Elementor Header #8

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

1. Введение

В программировании «магические числа» — это числовые значения, которые используются непосредственно в коде без явного объяснения, почему выбрано именно это значение. Такие числа часто являются «магическими» из-за своей непонятности и могут затруднить понимание и поддержку кода. В этом уроке мы рассмотрим, что такое магические числа, их проблемы и лучшие практики для их замены.

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

2.1 Непонятность

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

Пример:

				
					<?php
    $price = 100 * 1.2; // 1.2 — магическое число, представляющее налог
?>

				
			

В этом примере 1.2 не ясно указывает на то, что это ставка налога.

2.2 Трудности при изменении

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

Пример:

				
					<?php
    $finalPrice = $basePrice * 1.2; // Налог
    $discountedPrice = $basePrice * 1.2; // Налог
?>

				
			

В этом примере изменение ставки налога потребует обновления в двух местах.

3. Лучшие практики

3.1 Использование констант

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

Пример:

				
					<?php
    define('TAX_RATE', 1.2); // Константа для налога

    $finalPrice = $basePrice * TAX_RATE;
    $discountedPrice = $basePrice * TAX_RATE;
?>

				
			

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

3.2 Использование перечислений (enums)

Если вы используете PHP 8.1 или новее, рассмотрите использование перечислений для группировки связанных констант.

Пример:

				
					<?php
    enum TaxRate: float {
        case STANDARD = 1.2;
        case REDUCED = 1.1;
    }

    $finalPrice = $basePrice * TaxRate::STANDARD->value;
?>

				
			

В этом примере перечисления дают чёткие имена для различных налоговых ставок.

3.3 Использование конфигурационных файлов

Для значений, которые могут изменяться в зависимости от окружения или условий, используйте конфигурационные файлы.

Пример:

config.php:

				
					<?php
    return [
        'tax_rate' => 1.2,
    ];
?>

				
			

main.php:

				
					<?php
    $config = require 'config.php';

    $finalPrice = $basePrice * $config['tax_rate'];
?>

				
			

Теперь изменение ставки налога требует изменения только в конфигурационном файле.

4. Распространённые ошибки

4.1 Ошибка: Использование магических чисел без объяснения

Пример ошибки:

				
					<?php
    $finalPrice = $basePrice * 0.15; // 0.15 — не объяснено
?>

				
			

Решение:

Используйте константы для более ясного определения значений.

				
					<?php
    define('DISCOUNT_RATE', 0.15); // Константа для скидки

    $finalPrice = $basePrice * DISCOUNT_RATE;
?>

				
			

4.2 Ошибка: Несогласованность значений

Пример ошибки:

				
					<?php
    $totalAmount = $baseAmount * 1.15; // Налог
    $discountedAmount = $baseAmount * 0.85; // Скидка
?>

				
			

Решение:

Используйте константы для всех числовых значений, чтобы обеспечить согласованность.

				
					<?php
    define('TAX_RATE', 1.15);
    define('DISCOUNT_RATE', 0.85);

    $totalAmount = $baseAmount * TAX_RATE;
    $discountedAmount = $baseAmount * DISCOUNT_RATE;
?>

				
			

Заключение

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

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

Для закрепления материала выполните следующее задание:

  1. Создайте константу для хранения значения НДС в 20%.
  2. Используйте эту константу для вычисления итоговой цены товара с учётом НДС.
  3. Выведите результат на экран.

Пример выполнения задания:

				
					<?php
    define('VAT_RATE', 1.20); // Константа для НДС

    $basePrice = 100; // Исходная цена
    $finalPrice = $basePrice * VAT_RATE; // Итоговая цена с НДС

    echo "Final Price: $finalPrice"; // Вывод: Final Price: 120
?>

				
			

Удачи в выполнении задания и дальнейшем изучении PHP!

logo