---
title: "Замена магического числа символьной константой"
type: "refactoring-technique"
slug: "replace-magic-number-with-symbolic-constant"
url: "http://localhost:3000/ru/replace-magic-number-with-symbolic-constant.md"
category: "Организация данных"
description: "Проблема: В коде используется число, которое несёт какой-то определённый смысл. Решение: Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Замена магического числа символьной константой

> Проблема: В коде используется число, которое несёт какой-то определённый смысл. Решение: Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа.

## Problem

В коде используется число, которое несёт какой-то определённый смысл.

## Solution

Замените это число константой с человеко-читаемым названием, объясняющим смысл этого числа.

## Why Refactor

Магические числа — это числовые значения, встречающиеся в коде, но при этом неочевидно, что они означают. Данный антипаттерн затрудняет понимание программы и усложняет её рефакторинг.

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

## Benefits

* Символьная константа может служить живой документацией смысла значения, которое в ней хранится.
* Значение константы намного проще заменить, чем искать нужное число по всему коду, при этом рискуя заменить такое же число, которое в данном конкретном случае использовалось для других целей.
* Убирает дублирование использования числа или строки по всему коду. Это особенно актуально, если значение является сложным и длинным (например, `-14159`, `0xCAFEBABE`).

## How to Refactor

1. Объявите константу и присвойте ей значение магического числа.
2. Найдите все упоминания магического числа.
3. Для всех найденных чисел проверьте, согласуется ли это магическое число с предназначением константы. Если да, замените его вашей константой. Эта проверка важна, так как одно и тоже число может означать совершенно разные вещи (в этом случае, они должны быть заменены разными константами).
## Code Examples

### java

```java
// Before
double potentialEnergy(double mass, double height) {
  return mass * height * 9.81;
}

// After
static final double GRAVITATIONAL_CONSTANT = 9.81;

double potentialEnergy(double mass, double height) {
  return mass * height * GRAVITATIONAL_CONSTANT;
}
```

### csharp

```csharp
// Before
double PotentialEnergy(double mass, double height) 
{
  return mass * height * 9.81;
}

// After
const double GRAVITATIONAL_CONSTANT = 9.81;

double PotentialEnergy(double mass, double height) 
{
  return mass * height * GRAVITATIONAL_CONSTANT;
}
```

### php

```php
// Before
function potentialEnergy($mass, $height) {
  return $mass * $height * 9.81;
}

// After
define("GRAVITATIONAL_CONSTANT", 9.81);

function potentialEnergy($mass, $height) {
  return $mass * $height * GRAVITATIONAL_CONSTANT;
}
```

### python

```python
// Before
def potentialEnergy(mass, height):
    return mass * height * 9.81

// After
GRAVITATIONAL_CONSTANT = 9.81

def potentialEnergy(mass, height):
    return mass * height * GRAVITATIONAL_CONSTANT
```

### typescript

```typescript
// Before
potentialEnergy(mass: number, height: number): number {
  return mass * height * 9.81;
}

// After
static const GRAVITATIONAL_CONSTANT = 9.81;

potentialEnergy(mass: number, height: number): number {
  return mass * height * GRAVITATIONAL_CONSTANT;
}
```

