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

Замена значения ссылкой

Также известен как: Change Value to Reference

Проблема

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

Решение

Превратите одинаковые объекты в один объект-ссылку.

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

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

Во многих системах объекты можно разделить на две категории — объекты-значения и объекты-ссылки.

  • Объекты-ссылки — это когда одному объекту реального мира соответствует только один объект программы. Объектами-ссылками обычно становятся объекты пользователей, заказов, товаров и пр.

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

Выбор между ссылкой и значением не всегда очевиден. Иногда вначале есть простое значение с небольшим объёмом неизменяемых данных. Затем возникает необходимость добавить изменяемые данные и обеспечить передачу этих изменений при всех обращениях к объекту. Тогда появляется необходимость превратить его в объект-ссылку.

Достоинства

  • Один объект хранит в себе всю последнюю информацию об определенной сущности. Если в этот объект вносятся изменения в одной части программы, они тут же становятся доступными из других частей программы, использующих этот объект.

Недостатки

  • Объекты-ссылки гораздо сложнее в реализации.

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

  1. Используйте замену конструктора фабричным методом над классом, который должен порождать объекты-ссылки.

  2. Определите, какой объект будет ответственным за предоставление доступа к объектам-ссылкам. Вместо создания нового объекта, когда он нужен, вам теперь нужно получать его из какого-то объекта-хранилища или статического поля-словаря.

  3. Определите, будут ли объекты-ссылки создаваться заранее или динамически по мере надобности. Если объекты создаются предварительно, необходимо обеспечить их загрузку перед использованием.

  4. Измените фабричный метод так, чтобы он возвращал объект-ссылку. Если объекты создаются заранее, необходимо решить, как обрабатывать ошибки при запросе несуществующего объекта. Также вам может понадобиться применить к фабрике переименование метода для информации о том, что метод возвращает только существующие объекты.