SOLID
Single responsibility
Do one thing, and do it well
Open/closed
Classes should be open for extension but closed for modification
Liskov’s Substitution
Children should not violate the contracts of parents.
If you change a class with one of its children, the program should still work correctly.
Inheritance should pass the ‘Is-A’ test.
Interface Segregation
Many specific interfaces are better than one general interface
Dependency Inversion
Provide dependencies from outside because it makes testing easier, and modularity