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

> Проблема: У вас есть массив, в котором хранятся разнотипные данные. Решение: Замените массив объектом, который будет иметь отдельные поля для каждого элемента.

## Problem

У вас есть массив, в котором хранятся разнотипные данные.

## Solution

Замените массив объектом, который будет иметь отдельные поля для каждого элемента.

## Why Refactor

Массивы — отличный инструмент для хранения однотипных данных и коллекций. Но ждите беды, если вы используете массив в качестве банковских ячеек, например, храните в ячейке №1 — имя пользователя, а в ячейке №14 — его адрес. Такой подход не только может привести к фатальным последствиям, когда кто-то положит что-то не в ту ячейку, но также требует затраты огромного количества времени на запоминание того, где какие данные хранятся.

## Benefits

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

## How to Refactor

1. Создайте новый класс, который будет содержать данные из массива. Поместите в него сам массив как публичное поле.
2. Создайте поле для хранения объекта этого класса в исходном классе. Не забудьте создать также сам объект в том месте, где вы инициировали массив данных.
3. В новом классе один за другим создавайте методы доступа для всех элементов массива. Давайте им понятные названия, которые отражают суть того, что они хранят. В тоже время изменяйте каждый случай использования ячейки массива в основном коде соответствующими методами доступа к этой ячейке.
4. Когда методы доступа будут созданы для всех ячеек, сделайте массив приватным.
5. Для каждого элемента массива создайте приватное поле в классе, после чего измените методы доступа так, чтобы они использовали это поле вместо массива.
6. Когда все данные будут перемещены, удалите массив.
## Relations

**Similar techniques**

- [Замена простого поля объектом](/ru/replace-data-value-with-object.md)

**Eliminates smells**

- [Одержимость элементарными типами](/ru/smells/primitive-obsession.md)

## Code Examples

### java

```java
// Before
String[] row = new String[2];
row[0] = "Liverpool";
row[1] = "15";

// After
Performance row = new Performance();
row.setName("Liverpool");
row.setWins("15");
```

### csharp

```csharp
// Before
string[] row = new string[2];
row[0] = "Liverpool";
row[1] = "15";

// After
Performance row = new Performance();
row.SetName("Liverpool");
row.SetWins("15");
```

### php

```php
// Before
$row = [];
$row[0] = "Liverpool";
$row[1] = 15;

// After
$row = new Performance;
$row->setName("Liverpool");
$row->setWins(15);
```

### python

```python
// Before
row = [None * 2]
row[0] = "Liverpool"
row[1] = "15"

// After
row = Performance()
row.setName("Liverpool")
row.setWins("15")
```

### typescript

```typescript
// Before
let row = new Array(2);
row[0] = "Liverpool";
row[1] = "15";

// After
let row = new Performance();
row.setName("Liverpool");
row.setWins("15");
```

