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

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

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

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

Проблема

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

Рішення

Перетворіть його на об'єкт-значення.
До
Change Reference to Value - Before
Після
Change Reference to Value - After

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

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

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

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

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

Переваги

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

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

Недоліки

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

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

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

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

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

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

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

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

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

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.