Change Value to Reference

Removes smells
Symptom

Duplicate copies of a logically-single entity scattered across the codebase — every order carries its own Customer copy that should be the shared customer.

Goal

Duplicate copies of a logically-single entity collapse into one shared object that everyone references.

Before the refactoring

// every order carries its own Customer copy
orders.forEach(o => o.customer = { name: 'Acme' });

After the refactoring

const acme = customerRepository.find('Acme');
orders.forEach(o => o.customer = acme);
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

Updates to the entity must touch every copy; storage bloats; identity becomes ambiguous (which copy is the canonical one?).

Tradeoff

Sharing introduces the question 'who owns this?' — make sure the lifetime and visibility of the shared reference are well-defined.

Relief

Updates to the entity are visible everywhere; storage shrinks; identity becomes meaningful again.

Trap

Sharing references without clear ownership — introduces lifetime and visibility ambiguities (who owns this? when does it get freed?) that the original value-copies hid.