Two or more classes in the codebase do similar work but use different method names, parameter shapes, or return types for the same operation. The divergence is accidental — they were written at different times by different people. Callers can't treat them uniformly; tests for each one duplicate setup; cross-class refactoring requires synchronized edits.
All variants share one method-name vocabulary for the same operations. Callers operate against either interchangeably; tests can share helpers; future variants land with the same vocabulary.
Before the refactoring
// Two repositories do the same work with accidentally divergent names.class UserRepository {findOne(id) { /* ... */ }insert(user) { /* ... */ }updateById(id, fields) { /* ... */ }remove(id) { /* ... */ }}class OrderRepository {getById(id) { /* ... */ }create(order) { /* ... */ }update(id, fields) { /* ... */ }delete(id) { /* ... */ }}function loadEntity(repo, id) {if (repo instanceof UserRepository) return repo.findOne(id);return repo.getById(id);}
After the refactoring
// One method name per operation; both repositories conform.class UserRepository {findById(id) { /* ... */ }create(user) { /* ... */ }update(id, fields) { /* ... */ }delete(id) { /* ... */ }}class OrderRepository {findById(id) { /* ... */ }create(order) { /* ... */ }update(id, fields) { /* ... */ }delete(id) { /* ... */ }}function loadEntity(repo, id) {return repo.findById(id);}
Accidental interface divergence is a tax on every consumer that handles both. The divergence often grew from copy-paste with renames; each rename created another inconsistency to navigate. Reviewers and agents must remember which class uses which name.
Renaming methods is a wide ripple — every call site moves. For classes with public APIs or vendor consumers, the breaking-change cost may exceed the consistency gain. Sometimes a single adapter call site is cheaper than a rename across N consumers.
One vocabulary, one call shape, one set of tests' helpers. Future variants land with the established names; new consumers don't have to learn which-name-here-and-which-name-there.
Forcing two genuinely-different operations onto the same name to satisfy the pattern produces silent behavioural drift — the names match but the semantics differ. Unify Interfaces is for accidental divergence; if the operations actually behave differently, they should keep different names.