21

Alternative Classes with Different Interfaces


Symptom

Two classes do similar things but with mismatched method names and signatures — sortBy() vs orderUsing(), valueOf() vs evaluate().

Goal

Equivalent operations have equivalent signatures; a shared superclass or interface emerges naturally.

Smellier version
class CSVExporter  { writeAll(rows) {} }
class JSONExporter { dump(data)     {} }
Fresher version
class CSVExporter  implements Exporter { write(rows) {} }
class JSONExporter implements Exporter { write(rows) {} }
Savings

Polymorphic use becomes possible; new alternatives plug in without bespoke adapters.

Note

Substitution becomes copy-paste; consumers can't treat the two interchangeably; abstraction over them is impossible.