Приёмная комиссия 2024

Магические числа в коде: как выявить и устранить ошибки

Магические числа в коде: как выявить и устранить ошибки
Содержание

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

Подберите программу обучения и начните учиться бесплатно

Оставьте заявку и мы откроем бесплатный доступ к вводной части обучения

Что такое магические числа

В программировании под магическими числами понимают числовые литералы (константы), которые используются в коде без пояснений и комментариев. Они не всегда понятны и могут усложнять чтение и сопровождение кода.

В программировании магические числа могут негативно сказываться на гибкости и расширяемости программного обеспечения. Если значения жестко закодированы в коде, их изменение может потребовать значительных усилий, особенно когда они используются в разных частях программы. Это усложняет масштабирование и добавление новых функций, так как любое изменение числовых значений требует тщательного тестирования, чтобы избежать сбоев в работе программы. В крупных проектах это может привести к увеличению затрат времени и ресурсов на поддержку и обновление кода, а так же это усложняет масштабирование и добавление новых функций.

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

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

Примеры магических чисел в программировании:

  • Константы без пояснений:

def calculate_area (radius):
return 3.14159 * radius * radius

В этом примере 3.14159 является магическим числом. Лучше заменить его на именованную константу, чтобы улучшить читабельность и поддерживаемость кода:

PI = 3.14159
def calculate_area (radius):
return PI * radius * radius

  • Использование чисел в логике кода:

if status_code == 200:
print («Success»)

Здесь 200 также является магическим числом. Для улучшения читаемости и облегчения поддержки кода, рекомендуется использовать именованные константы:

HTTP_OK = 200
if status_code == HTTP_OK:
print («Success»)

Как они влияют на код

Магические числа могут негативно влиять на код по нескольким причинам:

  1. Снижение читаемости кода: Когда в коде используются магические числа, которые не объяснены и не имеют контекста, разработчикам может быть сложно понять, что они означают и почему используются в конкретном месте. Это затрудняет работу с кодом, особенно в процессе его обзора или модификации.
  2. Усложнение поддержки и сопровождения кода: Если значение магического числа нужно изменить, разработчику придётся искать и изменять его во всех местах использования, что может быть особенно проблематично в большом кодовом базе, где это число может использоваться в нескольких файлах. Это увеличивает риск ошибок и усложняет тестирование, так как изменения в одной части программы могут непредсказуемо повлиять на другие её части.
  3. Ограничение гибкости и расширяемости кода: Когда числовые значения «зашиты» в код, изменение бизнес-логики или добавление новых функций становится сложнее. Например, если число 10 используется для определения количества попыток входа, а это значение позже нужно изменить на 15, вам придется искать и заменять его в каждом месте кода. При изменении требований необходимо пересматривать и обновлять весь код, что требует дополнительных затрат времени и усилий.
  4. Проблемы при совместной работе: Разные разработчики могут использовать одинаковые числа для разных целей, что приводит к путанице и увеличивает вероятность ошибок. Это снижает эффективность командной работы и замедляет процесс разработки.
  5. Усложнение тестирования: Тесты должны учитывать все возможные значения магических чисел и их влияние на программу. Изменение этих чисел требует переписывания тестов, что затрудняет обеспечение качества кода.

Как их выявить в коде

Существует несколько способов выявления магических чисел в коде:

  1. Кодовый анализ: Применяйте инструменты статического анализа кода, которые позволят выявить «магические числа». Эти инструменты анализируют код, не выполняя его, и могут указывать на числовые литералы, которые не задокументированы или не используют именованные константы.
  2. Кодовые ревью: Во время проверки кода обращайте внимание на все числовые значения, которые используются в логике программы. Если какое-то значение не объяснено в комментариях и не является частью именованной константы, то это может быть так называемое «магическое число».

    Обсудите такие случаи с командой разработчиков и предложите заменить «магические числа» на осмысленные именованные константы или переменные. Это повысит читаемость и облегчит поддержку кода, поскольку каждому числовому значению будет дано понятное имя, отражающее его назначение.

  3. Поиск по коду: Используйте функции поиска в вашей интегрированной среде разработки (IDE) или текстовом редакторе, чтобы найти числовые значения в коде. Вы можете искать конкретные числа или шаблоны чисел, например, с помощью регулярных выражений, которые могут указывать на потенциальные «магические числа».
  4. Профилирование и рефакторинг:При профилировании и рефакторинге кода уделите особое внимание участкам, где используются числовые значения. При обнаружении магических чисел определите, могут ли они быть заменены на именованные константы или переменные, чтобы улучшить структуру и ясность кода.
  5. Использование линтеров: Настройте линтеры, например, ESLint для JavaScript или Pylint для Python, чтобы они обнаруживали и помечали магические числа. Линтеры можно настроить на определённые правила, которые помогут выявлять такие числа в коде.

Вот, например, ещё один наглядный пример магических чисел:

def calculate_discount (price, discount_type):
if discount_type == 1:
return price * 0.9 # 10% discount
elif discount_type == 2:
return price * 0.8 # 20% discount
elif discount_type == 3:
return price * 0.5 # 50% discount
else:
return price

Выявленные магические числа (1, 2, 3, 0.9, 0.8, 0.5) можно заменить на именованные константы:

DISCOUNT_TYPE_10_PERCENT = 1
DISCOUNT_TYPE_20_PERCENT = 2
DISCOUNT_TYPE_50_PERCENT = 3

DISCOUNT_10_PERCENT = 0.9
DISCOUNT_20_PERCENT = 0.8
DISCOUNT_50_PERCENT = 0.5

def calculate_discount (price, discount_type):
if discount_type == DISCOUNT_TYPE_10_PERCENT:
return price * DISCOUNT_10_PERCENT
elif discount_type == DISCOUNT_TYPE_20_PERCENT:
return price * DISCOUNT_20_PERCENT
elif discount_type == DISCOUNT_TYPE_50_PERCENT:
return price * DISCOUNT_50_PERCENT
else:
return price

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

Как избежать их использования

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

  1. Использование именованных констант

    Заменяйте числовые литералы именованными константами. Это делает код более читаемым и понятным.

    # Плохо
    if discount_type == 1:
    discount = 0.1

    # Хорошо
    DISCOUNT_TYPE_STANDARD = 1
    DISCOUNT_STANDARD = 0.1

    if discount_type == DISCOUNT_TYPE_STANDARD:
    discount = DISCOUNT_STANDARD

  2. Комментирование кода

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

    # Плохо
    timeout = 300

    # Хорошо
    timeout = 300 # Таймаут соединения в секундах

  3. Использование перечислений (enum)

    В языках, поддерживающих перечисления (enum), используйте их для представления набора связанных констант.

    from enum import Enum

    class DiscountType (Enum):
    STANDARD = 1
    PREMIUM = 2
    VIP = 3

    discount_type = DiscountType. STANDARD
    if discount_type == DiscountType. STANDARD:
    discount = 0.1

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

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

    JSON:

    {
    «standard_discount»: 0.1,
    «premium_discount»: 0.2,
    «vip_discount»: 0.3
    }

    PYTHON:

    import json

    with open ('config.json') as config_file:
    config = json. load (config_file)

    discount = config["standard_discount"]

  5. Использование глобальных констант

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

Пример (constants.py):

STANDARD_DISCOUNT = 0.1
PREMIUM_DISCOUNT = 0.2
VIP_DISCOUNT = 0.3

Пример (main.py):
from constants import STANDARD_DISCOUNT, PREMIUM_DISCOUNT, VIP_DISCOUNT
discount = STANDARD_DISCOUNT

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

Как устранить магические числа

Шаг 1: Обнаружение магических чисел

Первым делом нужно найти все магические числа в вашем коде. Для этого можно использовать ручной обзор кода, статический анализ с помощью инструментов или линтеров. Статический анализ и линтеры особенно полезны, так как они автоматически обнаруживают числовые литералы, не обоснованные именованными константами или комментариями.

Шаг 2: Понимание контекста

Определите значение и назначение каждого магического числа. Вам нужно разобраться, почему оно используется, какое значение оно имеет и где ещё может встречаться в коде программы.

Шаг 3: Замена магических чисел на именованные константы

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

Шаг 4: Вынесение значений в конфигурационные файлы

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

Пример устранения магических чисел:

Исходный код с магическими числами:

def calculate_discount (price, discount_type):
if discount_type == 1:
return price * 0.9 # 10% discount
elif discount_type == 2:
return price * 0.8 # 20% discount
elif discount_type == 3:
return price * 0.5 # 50% discount
else:
return price

Шаг 1 и 2: Обнаружение и понимание контекста:

Мы видим магические числа 1, 2, 3 для типов скидок и 0.9, 0.8, 0.5 для значений скидок.

Шаг 3: Замена магических чисел на именованные константы:

Создадим константы для каждого значения:

DISCOUNT_TYPE_STANDARD = 1
DISCOUNT_TYPE_PREMIUM = 2
DISCOUNT_TYPE_VIP = 3

DISCOUNT_STANDARD = 0.9
DISCOUNT_PREMIUM = 0.8
DISCOUNT_VIP = 0.5

def calculate_discount (price, discount_type):
if discount_type == DISCOUNT_TYPE_STANDARD:
return price * DISCOUNT_STANDARD
elif discount_type == DISCOUNT_TYPE_PREMIUM:
return price * DISCOUNT_PREMIUM
elif discount_type == DISCOUNT_TYPE_VIP:
return price * DISCOUNT_VIP
else:
return price

Шаг 4: Вынесение значений в конфигурационные файлы:

Создадим конфигурационный файл config. json:

{
«discount_types»: {
«standard»: 1,
«premium»: 2,
«vip»: 3
},
«discount_values»: {
«standard»: 0.9,
«premium»: 0.8,
«vip»: 0.5
}
}

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

import json

# Загрузка конфигурации
with open ('config.json') as config_file:
config = json. load (config_file)

DISCOUNT_TYPE_STANDARD = config["discount_types"]["standard"]
DISCOUNT_TYPE_PREMIUM = config["discount_types"]["premium"]
DISCOUNT_TYPE_VIP = config["discount_types"]["vip"]

DISCOUNT_STANDARD = config["discount_values"]["standard"]
DISCOUNT_PREMIUM = config["discount_values"]["premium"]
DISCOUNT_VIP = config["discount_values"]["vip"]

def calculate_discount (price, discount_type):
if discount_type == DISCOUNT_TYPE_STANDARD:
return price * DISCOUNT_STANDARD
elif discount_type == DISCOUNT_TYPE_PREMIUM:
return price * DISCOUNT_PREMIUM
elif discount_type == DISCOUNT_TYPE_VIP:
return price * DISCOUNT_VIP
else:
return price

Типичные ошибки и как их исправить

Ошибка: Повторяющиеся магические числа

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

if user_age < 18:
print («User is a minor»)
if user_age >= 18:
print («User is an adult»)

Исправление: Создайте константу для числа 18 и используйте её в коде:

MINOR_AGE_THRESHOLD = 18

if user_age < MINOR_AGE_THRESHOLD:
print («User is a minor»)
if user_age >= MINOR_AGE_THRESHOLD:
print («User is an adult»)

Ошибка: Неочевидное значение магического числа

Магические числа могут не нести явного смысла, делая код трудным для понимания.

area = length * 3.14159 * radius * radius

Исправление: Создайте константу для числа π и используйте её в коде:

PI = 3.14159

area = length * PI * radius * radius

Ошибка: Сложность изменения

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

discounted_price = price * 0.9

Исправление: Создайте константу для значения скидки и используйте её в коде:

DISCOUNT_RATE = 0.9

discounted_price = price * DISCOUNT_RATE

Ошибка: Трудности тестирования

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

def calculate_price (quantity):
if quantity > 100:
return quantity * 0.9
else:
return quantity

Исправление: Создайте константу для порога количества и используйте её в коде:

BULK_QUANTITY_THRESHOLD = 100
BULK_DISCOUNT_RATE = 0.9

def calculate_price (quantity):
if quantity > BULK_QUANTITY_THRESHOLD:
return quantity * BULK_DISCOUNT_RATE
else:
return quantity

Ошибка: Неоднозначные магические числа

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

if error_code == 404:
print («Not Found»)
elif error_code == 500:
print («Server Error»)

Исправление: Создайте константы для кодов ошибок и используйте их в коде:

ERROR_NOT_FOUND = 404
ERROR_SERVER = 500

if error_code == ERROR_NOT_FOUND:
print («Not Found»)
elif error_code == ERROR_SERVER:
print («Server Error»)

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

Главное, что нужно знать

Что такое магические числа?

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

Проблемы, связанные с магическими числами

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

Как выявить магические числа?

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

Как заменить магические числа?

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

Практики для предотвращения использования магических чисел

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

Подберите программу обучения и начните учиться бесплатно

Оставьте заявку и мы откроем бесплатный доступ к вводной части обучения

alt

Всё для учебы доступно онлайн

Расписание, зачётку и домашние задания смотрите в приложении
Подберите программу обучения

ответьте на пять вопросов и узнайте, где будете учиться

Образование для карьеры
К каким профессиям вы более склонны?
ТехническимГуманитарнымТворческимМедицинским
Какой у вас уровень образования?
Без образованияШкола 9-11 классКолледжБакалавриатМагистратураАспирантура
Какой формат обучения вам подходит?
ОчноЗаочноОнлайнПо выходным дням
Интересует ли вас кредит на образование по ставке 3% в год?
ДаНет

Мы подобрали для вас программу обучения

Заполните форму, чтобы узнать больше о программе и наших предложениях

Подобрать программу и поступить

Политика конфиденциальности

Ваша конфиденциальность очень важна для нас. Мы хотим, чтобы Ваша работа в Интернет по возможности была максимально приятной и полезной, и Вы совершенно спокойно использовали широчайший спектр информации, инструментов и возможностей, которые предлагает Интернет. Персональные данные, собранные при регистрации (или в любое другое время) преимущественно используется для подготовки Продуктов или Услуг в соответствии с Вашими потребностями. Ваша информация не будет передана или продана третьим сторонам. Однако мы можем частично раскрывать личную информацию в особых случаях, описанных в данной Политике конфиденциальности.

Рамки Политики конфиденциальности

Настоящая Политика конфиденциальности (далее — «Политика») применяется к информации, полученной через данный сайт, иные сайты, виджеты и другие используемые интерактивные средства, на которых есть ссылка на данную Политику (далее — «Сайт») от пользователей Сайта (далее — «Пользователи»).

Нижеследующие правила описывают, как Университет «Синергия» обращается с любой информацией, относящейся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных) (далее — «Персональные данные»), для целей оказания услуг с использованием Сайта.

Пользователи включают в себя всех физических лиц, которые подключаются к Сайту и используют Сайт.

Пользователи прямо соглашаются на обработку своих Персональных данных, как это описано в настоящей Политике. Обработка означает любое действие (операцию) или совокупность действий (операций), совершаемых с использованием средств автоматизации или без использования таких средств с Персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (распространение, предоставление, доступ), блокирование, удаление, уничтожение Персональных данных.

Настоящая Политика конфиденциальности вступает в силу с момента ее размещения на Сайте, если иное не предусмотрено новой редакцией Политики конфиденциальности.

Контролирующие и обрабатывающие лица

Пользователи соглашаются с тем, что:

  • Пользуясь Сайтом, и принимая условия использования, опубликованные на Сайте, пользователь заявляет о своем однозначном согласии с обработкой его Персональных данных способами, описанными в настоящей Политике.
  • Обработка Персональных данных Пользователей осуществляется Оператором персональных данных — Университет «Синергия» (ИНН: 7729152149, ОГРН: 1037700232558).

С какой целью собираются эти данные

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

Сбор Персональных данных

При регистрации на Сайте Пользователи подтверждают свое согласие с условиями настоящей Политики и свое согласие на обработку своих Персональных данных в соответствии с условиями настоящей Политики, кроме того они соглашаются на обработку своих Персональных данных на серверах Университета «Синергия», расположенных на территории Российской Федерации.

Обработка Персональных данных осуществляется не дольше, чем этого требуют цели обработки Персональных данных, изложенные в настоящей Политике (за исключением случаев, предусмотренных законодательством Российской Федерации). Университет «Синергия» может обрабатывать следующие Персональные данные:

  • «Как к Вам обращаться» в форме обратной связи, в случае если посетитель указывает свои полные ФИО или только часть;
  • Электронный адрес;
  • Номер телефона;
  • Также на сайте происходит сбор и обработка обезличенных данных о посетителях (в т. ч. файлов «cookie») с помощью сервисов интернет-статистики (Яндекс Метрика и других).
  • Вышеперечисленные данные далее по тексту Политики объединены общим понятием Персональные данные.

Как эти данные используются

На сайте используются куки (Cookies) и данные о посетителях сервисов (Яндекс Метрика и других). При помощи этих данных собирается информация о действиях посетителей на сайте с целью улучшения его содержания, улучшения функциональных возможностей сайта и, как следствие, создания качественного контента и сервисов для посетителей. Вы можете в любой момент изменить настройки своего браузера так, чтобы браузер блокировал все файлы cookie или оповещал об отправке этих файлов. Учтите при этом, что некоторые функции и сервисы не смогут работать должным образом.

Как эти данные защищаются

Для защиты Вашей личной информации мы используем разнообразные административные, управленческие и технические меры безопасности. Наша Компания придерживается различных международных стандартов контроля, направленных на операции с личной информацией, которые включают определенные меры контроля по защите информации, собранной в Интернет. Наших сотрудников обучают понимать и выполнять эти меры контроля, они ознакомлены с нашим Уведомлением о конфиденциальности, нормами и инструкциями. Тем не менее, несмотря на то, что мы стремимся обезопасить Вашу личную информацию, Вы тоже должны принимать меры, чтобы защитить ее. Мы настоятельно рекомендуем Вам принимать все возможные меры предосторожности во время пребывания в Интернете. Организованные нами услуги и веб-сайты предусматривают меры по защите от утечки, несанкционированного использования и изменения информации, которую мы контролируем. Несмотря на то, что мы делаем все возможное, чтобы обеспечить целостность и безопасность своей сети и систем, мы не можем гарантировать, что наши меры безопасности предотвратят незаконный доступ к этой информации хакеров сторонних организаций.

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

Политика в отношении обработки персональных данных.pdf

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

Jivo

DMCA.com Protection Status