SOLID 1.1. Single Responsibility Principle 1.2. Open-closed Principle 1.3. Liskov Substitution Principle 1.4. Interface Segregation Principle 1.5. Dependency Inversion Clean Code Object Calisthenics Programação funcional