Principle
Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.
Principle
Many client-specific interfaces are better than one general-purpose interface
Principle
Objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program.
Principle
Software entities ... should be open for extension, but closed for modification.