---
title: "Расщепление переменной"
type: "refactoring-technique"
slug: "split-temporary-variable"
url: "http://localhost:3000/ru/split-temporary-variable.md"
category: "Составление методов"
description: "Проблема: У вас есть локальная переменная, которая используется для хранения разных промежуточных значений внутри метода (за исключением переменных циклов). Решение: Используйте разные переменные для разных значений. Каждая переменная должна отвечать только за одну определённую вещь."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Расщепление переменной

> Проблема: У вас есть локальная переменная, которая используется для хранения разных промежуточных значений внутри метода (за исключением переменных циклов). Решение: Используйте разные переменные для разных значений. Каждая переменная должна отвечать только за одну определённую вещь.

## Problem

У вас есть локальная переменная, которая используется для хранения разных промежуточных значений внутри метода (за исключением переменных циклов).

## Solution

Используйте разные переменные для разных значений. Каждая переменная должна отвечать только за одну определённую вещь.

## Why Refactor

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

## Benefits

* Каждый элемент программы должен отвечать только за одну вещь. Это сильно упрощает поддержку кода в будущем, так как вы можете спокойно заменить этот элемент, не опасаясь побочных эффектов.
* Улучшается читабельность кода. Если переменная создавалась очень давно, да еще и в спешке, она могла получить элементарное название, которое не объясняет сути хранимого значения, например, `k`, `a2`, `value` и т. д. У вас есть шанс исправить ситуацию, назначив новым переменным хорошие названия, отражающие суть хранимых значений. Например, `customerTaxValue`, `cityUnemploymentRate`, `clientSalutationString` и т. д.
* Этот рефакторинг помогает в дальнейшем [выделить повторяющиеся участки кода в отдельные методы](/ru/extract-method).

## How to Refactor

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

**Helps you do**

- [Извлечение метода](/ru/extract-method.md)

**Similar techniques**

- [Извлечение переменной](/ru/extract-variable.md)
- [Удаление присваиваний параметрам](/ru/remove-assignments-to-parameters.md)

**Opposite refactorings**

- [Встраивание переменной](/ru/inline-temp.md)

## Code Examples

### java

```java
// Before
double temp = 2 * (height + width);
System.out.println(temp);
temp = height * width;
System.out.println(temp);

// After
final double perimeter = 2 * (height + width);
System.out.println(perimeter);
final double area = height * width;
System.out.println(area);
```

### csharp

```csharp
// Before
double temp = 2 * (height + width);
Console.WriteLine(temp);
temp = height * width;
Console.WriteLine(temp);

// After
readonly double perimeter = 2 * (height + width);
Console.WriteLine(perimeter);
readonly double area = height * width;
Console.WriteLine(area);
```

### php

```php
// Before
$temp = 2 * ($this->height + $this->width);
echo $temp;
$temp = $this->height * $this->width;
echo $temp;

// After
$perimeter = 2 * ($this->height + $this->width);
echo $perimeter;
$area = $this->height * $this->width;
echo $area;
```

### python

```python
// Before
temp = 2 * (height + width)
print(temp)
temp = height * width
print(temp)

// After
perimeter = 2 * (height + width)
print(perimeter)
area = height * width
print(area)
```

### typescript

```typescript
// Before
let temp = 2 * (height + width);
console.log(temp);
temp = height * width;
console.log(temp);

// After
const perimeter = 2 * (height + width);
console.log(perimeter);
const area = height * width;
console.log(area);
```

