A class should have only one reason to be changed.
A class should be open to extension but closed to modification.
You should be able to replace a class with a subclass without the calling code knowing about the change.
Many specific interfaces are better than a single, all-encompassing interface.
Code should depend upon abstractions, not concrete implementations.