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 versionclass 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.