Symptom

Callers use long dotted access paths to walk through one object to reach another's data — `order.customer.address.street` exposes every intermediate boundary.

Goal

Callers ask the closest object for what they want; the object delegates internally without exposing its collaborators.

Before the refactoring

const street = order.customer.address.street;

After the refactoring

// inside Order: customerStreet() { return this.customer.address.street; }
const street = order.customerStreet();
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

Every link in the chain is a coupling point; renaming any intermediate field breaks every caller; consumers depend on the full graph shape.

Tradeoff

Adds a passthrough method on the parent for every delegated operation — only worth it for operations that are repeated across consumers.

Relief

Encapsulation tightens; intermediate objects can change shape without breaking callers.

Trap

Wrapping every dotted access in a passthrough — including chains used only once where the wrapper adds cost without removing real coupling.