Symptom

A class or interface with multiple cohesive sub-concepts inside it — Person carrying officeAreaCode + officeNumber + telephoneNumber() method, where Phone is hiding.

Goal

A cohesive sub-concept inside a class or interface becomes its own type with its own name, fields, and methods.

Before the refactoring

class Person {
name;
officeAreaCode;
officeNumber;
telephoneNumber() { return `(${this.officeAreaCode}) ${this.officeNumber}`; }
}

After the refactoring

class Phone {
areaCode;
number;
toString() { return `(${this.areaCode}) ${this.number}`; }
}
class Person { name; phone; }
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

The parent type's surface grows past what one type should own; tests touch unrelated concerns together; changes to one concept risk side effects on another.

Tradeoff

Premature extraction adds ceremony — extract when 3+ fields and at least one operation cluster around a single concept that the parent type doesn't own.

Relief

Each type has one purpose; tests target the small unit; the parent type shrinks.

Trap

Extracting when the candidate concept is just 1-2 fields without behavior — adds a file with no encapsulation gain.