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

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

Цей рефакторинг використовує понняття, визначені в заміні значення посиланням

  • Об'єкти-посилання — це коли одному об'єкту реального світу відповідає тільки один об'єкт програми. Об'єктами-посиланнями зазвичай стають об'єкти користувачів, замовлень, товарів та ін.
  • Об'єкти-значення — одному об'єкту реального світу відповідає безліч об'єктів в програмі. Такими об'єктами можуть бути дати, телефонні номери, адреси, колір та ін.

Проблема

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

Рішення

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

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

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

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

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

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

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

Переваги

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

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

Недоліки

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

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

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

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

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

Замучились читати?

Збігайте за подушкою, в нас тут контенту на 7 годин читання.

Або спробуйте наш новий інтерактивний курсу. Він набагато цікавіший за банальний тест.

Дізнатися більше...