Autumn SALE

Замена поля-массива объектом

Также известен как: Replace Array with Object

Этот рефакторинг является особым случаем замены простого поля объектом.

Проблема

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

Решение

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

До
String[] row = new String[2];
row[0] = "Liverpool";
row[1] = "15";
После
Performance row = new Performance();
row.setName("Liverpool");
row.setWins("15");
До
string[] row = new string[2];
row[0] = "Liverpool";
row[1] = "15";
После
Performance row = new Performance();
row.SetName("Liverpool");
row.SetWins("15");
До
$row = [];
$row[0] = "Liverpool";
$row[1] = 15;
После
$row = new Performance;
$row->setName("Liverpool");
$row->setWins(15);
До
row = [None * 2]
row[0] = "Liverpool"
row[1] = "15"
После
row = Performance()
row.setName("Liverpool")
row.setWins("15")
До
let row = new Array(2);
row[0] = "Liverpool";
row[1] = "15";
После
let row = new Performance();
row.setName("Liverpool");
row.setWins("15");

Причины рефакторинга

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

Достоинства

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

  • Поля класса гораздо проще документировать, чем ячейки массива.

Порядок рефакторинга

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

  2. Создайте поле для хранения объекта этого класса в исходном классе. Не забудьте создать также сам объект в том месте, где вы инициировали массив данных.

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

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

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

  6. Когда все данные будут перемещены, удалите массив.