- A class should only have one reason to change
- Seperation of concerns -> different classes handling different, independet tasks/problems
- Clases should open for extensions but closed for modification
- You should be able to substitute a base type for a subtype