S.O.L.I.D
1: Single Responsibility Principle Separar coisas que mudam por motivos diferentes; Mover responsabilidades;
2: Open/Closed Principle Devemos estar abertos para extensão, mas, devemos seguir fechados para modificação;
3: Liskov Substitution Principle Se S (Junior, Experienced, Senior) é uma subclasse de T (Developer), eu devo poder substituir a instancia de T pela a instancia de S, sem que eu quebre o programa.
4: Interface Segregation Principle Eu devo tomar cuidado com interfaces muito abrangentes. Eu não devo obrigar classes a implementar métodos que elas não precisam.
5: Dependency Inversion Principle Módulos de alto nível não deve depender de módulos de baixo nível. Ambos devem depender de abstrações.