Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена значения ссылкой (Change Value to Reference).md
2026-02-23 19:52:05 +03:00

42 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20250204085803.png]]
### **Проблема**
Есть много одинаковых экземпляров одного класса, которые можно заменить одним объектом.
```typescript
let customer = new Customer(customerData);
```
### **Решение**
Превратите одинаковые объекты в один объект-ссылку.
```typescript
let customer = customerRepository.get(customerData.id);
```
### **Причины рефакторинга**
Во многих системах объекты можно разделить на две категории — объекты-значения и объекты-ссылки.
- **Объекты-ссылки** — это когда одному объекту реального мира соответствует только один объект программы. Объектами-ссылками обычно становятся объекты пользователей, заказов, товаров и пр.
- **Объекты-значения** — одному объекту реального мира соответствует множество объектов в программе. Такими объектами могут быть даты, телефонные номера, адреса, цвет и другие.
Выбор между ссылкой и значением не всегда очевиден. Иногда вначале есть простое значение с небольшим объёмом неизменяемых данных. Затем возникает необходимость добавить изменяемые данные и обеспечить передачу этих изменений при всех обращениях к объекту. Тогда появляется необходимость превратить его в объект-ссылку.
### **Достоинства**
Один объект хранит в себе всю последнюю информацию об определенной сущности. Если в этот объект вносятся изменения в одной части программы, они тут же становятся доступными из других частей программы, использующих этот объект.
### **Недостатки**
- Объекты-ссылки гораздо сложнее в реализации.
### **Порядок рефакторинга**
1. Используйте [[Замена конструктора фабричной функцией (Replace Constructor with Factory Function)]] над классом, который должен порождать объекты-ссылки.
2. Определите, какой объект будет ответственным за предоставление доступа к объектам-ссылкам. Вместо создания нового объекта, когда он нужен, вам теперь нужно получать его из какого-то объекта-хранилища или статического поля-словаря.
3. Определите, будут ли объекты-ссылки создаваться заранее или динамически по мере надобности. Если объекты создаются предварительно, необходимо обеспечить их загрузку перед использованием.
4. Измените фабричный метод так, чтобы он возвращал объект-ссылку. Если объекты создаются заранее, необходимо решить, как обрабатывать ошибки при запросе несуществующего объекта. Также вам может понадобиться применить к фабрике [[Переименование поля (Rename Field)]] для информации о том, что метод возвращает только существующие объекты.
### **Обратный рефакторинг**
- [[Замена ссылки значением (Change Reference to Value)]]
### **Ссылки**
- https://refactoring.guru/ru/change-value-to-reference
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]