- Single responsibility principle: a class should have only a single responsibility
- Open/closed principle: software entities should be open for extension, but closed for modification
- Liskov substitution principle: objects in a program should be replaceable with instances of their subtypes without altering the correctness of that program
- Interface segregation principle: many client-specific interfaces are better than one general-purpose interface
- Dependency inversion principle: high level modules should not depend on low level modules, both should depend on abstractions
https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)