Make Interfaces Hard to Misuse
2018-07-25
Don't push the responsibility of maintaining invariants on the caller.
Bad
class Vector { explicit Vector(int num_slots); int RemainingSlots() const; void AddSlots(int num_slots); void Insert(int value); };
In the code above, the caller needs to check RemainingSlots, and if 0, AddSlots in order for
Insert to work properly.
Instead, Insert could automatically manage slots.
Good
class Vector { explicit Vector(int num_slots); void Insert(int value); };
Other signs an interface is hard to use:
Initialize/Deitializefunctions.- Allowing partially created objects.
- Parameters that can have invalid values.
Sometimes it's not practical to have a foolproof interface. In those cases rely on static analysis or documentation.