Також відомий як: Change Reference to Value

Рефакторинг Заміна посилання значенням

Проблема

У вас є об'єкт-посилання, який занадто маленький і незмінний, щоб виправдати складнощі по управлінню його життєвим циклом.

Рішення

Перетворіть його на об'єкт-значення.

До
Change Reference to Value - Before
Після
Change Reference to Value - After

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

Спонукати до переходу від посилання до значення можуть незручності, які виникають при роботі з об'єктом-посиланням.

Об'єктами-посиланнями необхідно якимось чином управляти:

  • кожного разу доводиться просити в об'єкта-сховища потрібний об'єкт;

  • посилання в пам'яті теж можуть виявитися незручними в роботі;

  • працювати з об'єктами-посиланнями, на відміну від об'єктів-значень, особливо складно в розподілених і паралельних системах.

Крім того, об'єкти-значення будуть особливо корисні, якщо вам більше потрібна незмінність об'єктів, ніж можливість зміни їх стану під час життя об'єкта.

Переваги

  • Важлива властивість об'єктів-значень полягає в тому, що вони мають бути незмінними. При кожному запиті, що повертає значення одного з них, повинен виходити однаковий результат. Якщо це так, то не виникає проблем за наявності багатьох об'єктів, що представляють одну і ту ж річ.

  • Об'єкти-значення набагато простіші в реалізації.

Недоліки

  • Якщо значення може змінюватись, вам необхідно забезпечити, щоби при зміні будь-якого з об'єктів оновлювалися значення в усіх інших, які представляють ту ж саму річ. Це настільки обтяжливо, що простіше для цього створити об'єкт-посилання.

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

  1. Забезпечте незмінність об'єкта. Об'єкт не повинен мати сеттерів або інших методів, що міняють його стан і дані (у цьому може допомогти видалення сеттера). Єдиним місцем, де полям об'єкта-значення привласнюються якісь дані, має бути конструктор.

  2. Створіть метод порівняння для того, щоби мати можливість порівняти два об'єкти-значення.

  3. Перевірте, чи можливо видалити фабричний метод і зробити конструктор об'єкта публічним.