S.O.L.I.D.
Software fácil de manter, extender e reutilizar
O que é isso?
Um acrônimo com 5 regras para evitar que o código apodreça?
● SRP - Single Responsability Principle
● OCP - Open Closed Principle
● LSP - Likov Substitution Principle
● ISP - Interface Segregation Principle
● DIP - Dependency Inversion Principle
Código apodrecendo?
Você já esteve em um projeto que parecia ficar mais difícil a cada dia?
● Rigidez:
Difícil de mudar o design
● Fragilidade:
Mudar alguma coisa quebra outras em outra parte do sistema
● Imobilidade:
Difícil de reutilizar componentes em outro software
● Viscosidade:
Fazer uma gambiarra é mais fácil do que fazer direito
Princípio da responsabilidade única
Toda classe só deve
ter uma responsabilidade,
ou seja, apenas um
motivo para mudar
Princípio da responsabilidade única
Alguns benefícios:
● Reusabilidade: Se a classe segue o SRP, será mais fácil reutilizar
● Clareza: O código fica mais simples já que ele não faz nada estranho
● Nomenclatura: Sua classe só faz uma coisa, dar nomes fica mais fácil
● Legibilidade: A classe só faz uma coisa, é clara e tem um bom nome
Princípio da responsabilidade única
Não faça isso!
Princípio da responsabilidade única
Assim é bem melhor:
Princípio do aberto/fechado
Uma classe deve ser
aberta para extensão,
porém fechada
para edição
“Você não precisa fazer uma cirurgia
para vestir um casaco”
Princípio do aberto/fechado
E se o cliente quiser desenhar triângulos?
Princípio do aberto/fechado
Assim eu não preciso mexer na classe Canvas nunca mais!
Não entendi, cadê o triângulo?
Princípio da substituição de Liskov
Se q(x) é uma propriedade demonstrável dos
objetos x de tipo T. Então q(y) deve ser
verdadeiro para objetos y de tipo S onde S é um
subtipo de T.
Princípio da substituição de Liskov
Classes base devem
poder ser substituídas
por suas classes
derivadas
Princípio da substituição de Liskov
Se quebrar posso trocar
por qualquer uma que
encaixe?
Princípio da substituição de Liskov
Princípio da substituição de Liskov
Princípio da substituição de Liskov
Princípio da segregação de interfaces
clientes não devem
ser forçados a
depender de
métodos que não
usam.
Princípio da segregação de interfaces
Princípio da segregação de interfaces
Princípio da segregação de interfaces
Princípio da segregação de interfaces
Ahh, é moleza resolver isso ai...
Princípio da segregação de interfaces
Princípio da segregação de interface
Princípio da segregação de interface
Falando Sério
Princípio da segregação de interfaces
E se eu tiver um cliente que dependa de
duas dessas interfaces?
Princípio da segregação de interfaces
Princípio da inversão de dependência
A. Módulos de alto nível não deveriam
depender de módulos de baixo nível.
Ambos deveriam depender de
abstrações.
B. Abstrações não deveriam depender
de detalhes. Detalhes devem
depender de abstrações.
Princípio da inversão de dependência
Obrigado =)

Solid