A class should have one, and only one responsibility and reason to change.
A class should be open for extension but closed for modification
Subtypes(derived classes) should be replaceable by their base(parent class) types
Many specific interfaces are better than a general interface
We must depend on abstractions and not concrete classes