SOLID
S: Single Responsibility Principle
The classes have only a purpose
O: Open closed principle
Open to the extension close to the modification
L: Liskov-Substitution Principle
Given a parent class with some functionality, you can extend the parent with a child in the way that
the child keep on with the same functionality and adding more. So in this way you can exchange
the parent or child and the code keep on working well.
I: Interface Segregation Principle
Prevent classes from relying on things that they don't need. So the interfaces has to be split in another more small with only the needed responsibility, only the unique functionality into interfaces.
D: Dependency Inversion Principle
The classes should depend on abstractions. Use interfaces instead concrete implementations as collaborators.
YAGNI
"You aren't going to need it" (YAGNI) is a principle which arose from extreme programming (XP) that states a programmer should not add functionality until deemed necessary
DRY
Don't repeat yourself don't repeat code