Keep in mind:
S - SRP - Single Responsibility Principle
one responsibility
O - OCP - Open-closed Principle
expandable without modification
L - LSP - Liskov Substitution Principle
while extending, keep or extend the interface
I - ISP - Interface segregation Principle
dedicated are better than generic
D - DIP - Dependency inversion Principle
high-level things can’t depend on those at low-level
Loose coupling
unrelated elements should have as few dependencies as possible
High cohesion
related elements should be close to each other
Depencendy Injection
accept instances of others rather than creating them within
Inversion Of Control
do not create dependencies, accept them (DI); delegation of events instead of sequences
DRY - Don’t Repeat Yourself
divide and conquer - refactor
KISS - Keep It Simple Stupid
don’t overengineer - use basics
YAGNI - You Aren’t Gonna Need It
requirements are always changing