Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

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

Также известен как: 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. Когда все данные будут перемещены, удалите массив.