A class or module should have one and only one reason to change.
Software entities (classes, modules, functions etc.) should be open for extension but closed for modification.
Functions that use references of base classes must be able to use objects of the derived class without knowing it.
Clients should not be forced to depend on methods they do not use.
=> High-level modules should not depend on low-level modules. Both should depend on abstractions.
=> Abstractions should not depend on details, details should depend on abstractions.