SlideShare a Scribd company logo
1 of 25
S.O.L.I.D.
Princípios de Design para Programação
Orientada a Objetos
O Código Apodrece
 Inevitável
 Exemplo de correção de bug
 Acoplamento
 Mudança em uma linha de código gera mudanças em
outras tantas
 Nós temos que nos munir de armas contra o
apodrecimento do código
 SOLID é uma das armas
S.O.L.I.D.
Desenvolvimento de Sistemas não é um jogo Jenga
Princípios
 Single Responsibility Principle
 Princípio de Responsabilidade Única
 Open Closed Principle
 Princípio Aberto Fechado
 Liskov Substitution Principle
 Princípio da Substituição de Liskov
 Interface Segregation Principle
 Princípio da Segregação de Interface
 Dependency Inversion Principle
 Princípio da Inversão de Dependência
Vantagens
 Fácil de manter, adaptar e ajustar às
constantes mudanças exigidas pelos clientes
 Fácil de entender e testar
 Menor esforço para manutenções
 Melhor reaproveitamento de código
Princípio de Responsabilidade
Única
Todo objeto deve ter uma única responsabilidade, e todos os seus serviços devem estar
rigorosamente alinhados com aquela responsabilidade.
Princípio de Responsabilidade
Única
 Sintomas quando o princípio não é seguido:
 Quantas vezes abrimos um código e
simplesmente não temos a mínima ideia do que
ele está fazendo?
 Quantas variáveis espalhadas, aparentemente
sem sentido?
 Quantos cálculos mentais temos que fazer para
descobrir se vai entrar naquele IF?
 E quando a barra de rolagem parece não ter fim?
Princípio de Responsabilidade
Única
 Uma classe ou método deve ter uma e apenas
uma razão para mudar
 Quebrando o princípio:
 TransmissaoRepositorio
 Seguindo o princípio:
 TransmissaoRepositorio
 ConversorTransmissao
 ControladorDiscoRigido
 ControladorEmail
Princípio Aberto Fechado
Cirurgia de peito aberto não é necessário ao colocar um casaco.
Princípio Aberto Fechado
 Sintomas quando o princípio não é seguido:
 Adicionar novas regras requer mudança sempre
no mesmo pedaço de código
 Cada mudança pode introduzir bugs e requer
novos testes
 Mudar um pedaço de código cria mudança em
cascata em várias classes.
 If-ElseIf-Else encadeados
 Switch-Case
Princípio Aberto Fechado
 Aberto para extensão
 Novo comportamento pode ser adicionado no
futuro
 Fechado para modificação
 Não há necessidade de modificar o código
 Como adicionar novo comportamento sem
mudar o código?
 Depender de abstrações: Interfaces ou Classes
Abstratas
Princípio Aberto Fechado
 Quebrando o princípio:
 Carrinho
 Seguindo o princípio:
 Carrinho
 CalculadorPreco
 IRegraPreco
 RegraPrecoEspecial
 RegraPrecoPorGrama
 RegraPrecoCada
Substituição de Liskov
Caso se pareça um pato e grasne como um pato mas precise de baterias, você
provavelmente possui a abstração errada.
Substituição de Liskov
 Os subtipos devem ser substituíveis pelos
seus tipos base.
 Sintoma quando o princípio não é seguido:
 Usar o operador “is” ou “typeof” em condições if-
else ou switch
Substituição de Liskov
 Quebrando o princípio:
 Retangulo
 Quadrado
 Seguindo o princípio:
 Forma
 Retangulo
 Quadrado
 Quadrado só é um retângulo no mundo real.
Essa abstração “é-um” nesse caso não é
válida.
Segregação de Interface
Você quer que eu plugue isso onde?
Segregação de Interface
 Clientes não devem ser forçados a
dependerem de métodos que eles não usam
 Sintomas quando o princípio não é seguido:
 Interfaces com vários métodos, “gordas”
 Quebra o princípio de Responsabilidade Única
 Implementar uma interface “gorda” e nos
métodos que não quer implementar lançar uma
exceção
 Por exemplo: método não suportado
 Ou throw new NotImplementedException()
Segregação de Interface
 Quebrando o princípio
 Contato
 ControladorEmail
 Discador
 Seguindo o princípio:
 IDiscavel
 IEmail
 Contato
 ControladorEmail
 Discador
Inversão de Dependência
Você soldaria uma lâmpada diretamente no fio de eletricidade na parede?
Inversão de Dependência
 Um módulo de alto nível não deve depender de
outros de baixo nível
 Baixo nível: acesso a banco, arquivos, WebServices
 Alto nível: regras e entidades de negócio, interação
com usuário
 Módulos de alto nível devem utilizar um
mecanismo para obter os dados de baixo nível,
mas não depender dos detalhes desse
mecanismo
 UI depender do módulo de persistência, por
exemplo banco de dados
 Se a persistência mudar para arquivo Xml, toda a UI
terá que ser reescrita
Inversão de Dependência
 Sintomas:
 Dentro de um módulo/classe/método instanciar
uma classe explicitamente usando o operador
“new”
 Possuir referência do projeto de acesso a dados
no projeto de UI
 O ideal é sempre depender de abstrações:
Interfaces ou classes abstratas
Inversão de Dependência
TransmissaoReposit
orio
ControladorEmail
ConversorTransmis
sao
Inversão de Dependência
TransmissaoReposit
orio
IControladorEmail
IConversorTransmis
sao
ConversorTransmis
sao
ControladorEmail
Inversão de Dependência
 Aplicando o princípio nos exemplos:
 SingleResponsibility
 OpenClosed
Referências
 Software Practices, Pluralsight
 Principles of Object Oriented Design
 Design Patterns
 Clean Code A Handbook of Agile Software
Craftsmanship, Robert C. Martin
 Agile Principles, Patterns, and Practices in
C#, Robert C. Martin

More Related Content

Viewers also liked

O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?Maurício Aniche
 
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013Maurício Aniche
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de CódigoJoberto Diniz
 
Measurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented DesignMeasurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented Designzebew
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...Joberto Diniz
 

Viewers also liked (7)

O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?O que estamos temos feito com mineração de repositório de código no IME?
O que estamos temos feito com mineração de repositório de código no IME?
 
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
MetricMiner: Supporting Researchers in Mining Software Repositories - SCAM 2013
 
Qualidade de Código
Qualidade de CódigoQualidade de Código
Qualidade de Código
 
Código Limpo Dual
Código Limpo DualCódigo Limpo Dual
Código Limpo Dual
 
Measurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented DesignMeasurement Metrics for Object Oriented Design
Measurement Metrics for Object Oriented Design
 
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
A Importância do Código Limpo na Perspectiva dos Desenvolvedores e Empresas d...
 
Code Smells
Code SmellsCode Smells
Code Smells
 

Similar to Princípios SOLID

Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Vinicius Pulgatti
 
boas praticas
boas praticasboas praticas
boas praticaslcbj
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoBonoBee
 
principios_SOLID_resumo.pdf
principios_SOLID_resumo.pdfprincipios_SOLID_resumo.pdf
principios_SOLID_resumo.pdfssuser9941f1
 
Princípios de Programação Orientada a Objetos Solid, dry e kiss
Princípios de Programação Orientada a Objetos Solid, dry  e kiss Princípios de Programação Orientada a Objetos Solid, dry  e kiss
Princípios de Programação Orientada a Objetos Solid, dry e kiss DanielChristofolli
 
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...Klederson Bueno
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 
Orientação a Objetos - Princípios SOLID
Orientação a Objetos - Princípios SOLIDOrientação a Objetos - Princípios SOLID
Orientação a Objetos - Princípios SOLIDVinicius Quaiato
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...Rodrigo Oliveira, Msc, PMP
 
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....Fabiano Góes
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrThiago Boufleuhr
 
Cocoaheads Brasil SP - 26/04/16 - SOLID
Cocoaheads Brasil SP - 26/04/16 - SOLIDCocoaheads Brasil SP - 26/04/16 - SOLID
Cocoaheads Brasil SP - 26/04/16 - SOLIDBruno Mazzo
 
Fundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosFundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosEvandro Agnes
 
TDD Projeto e Estrategias
TDD Projeto e EstrategiasTDD Projeto e Estrategias
TDD Projeto e EstrategiasEduardo Mendes
 
SOLID - Teoria e Prática
SOLID - Teoria e PráticaSOLID - Teoria e Prática
SOLID - Teoria e PráticaEduardo Pires
 

Similar to Princípios SOLID (20)

Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
boas praticas
boas praticasboas praticas
boas praticas
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
 
principios_SOLID_resumo.pdf
principios_SOLID_resumo.pdfprincipios_SOLID_resumo.pdf
principios_SOLID_resumo.pdf
 
Princípios de Programação Orientada a Objetos Solid, dry e kiss
Princípios de Programação Orientada a Objetos Solid, dry  e kiss Princípios de Programação Orientada a Objetos Solid, dry  e kiss
Princípios de Programação Orientada a Objetos Solid, dry e kiss
 
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...
Pragmatismo e Padroes - Um limiar tenue entre o sucesso e o fracasso do seu p...
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Apres s4
Apres s4 Apres s4
Apres s4
 
Orientação a Objetos - Princípios SOLID
Orientação a Objetos - Princípios SOLIDOrientação a Objetos - Princípios SOLID
Orientação a Objetos - Princípios SOLID
 
A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...A importância dos testes unitários: do código legado ao pipeline de testes em...
A importância dos testes unitários: do código legado ao pipeline de testes em...
 
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....
TDC2022 - Como desacoplar Componentes aplicando DI e IoC com Kotlin e Spring....
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Arquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhrArquitetura mix thiagoboufleuhr
Arquitetura mix thiagoboufleuhr
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Cocoaheads Brasil SP - 26/04/16 - SOLID
Cocoaheads Brasil SP - 26/04/16 - SOLIDCocoaheads Brasil SP - 26/04/16 - SOLID
Cocoaheads Brasil SP - 26/04/16 - SOLID
 
Fundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetosFundamentos e princípios do projeto orientado a objetos
Fundamentos e princípios do projeto orientado a objetos
 
TDD Projeto e Estrategias
TDD Projeto e EstrategiasTDD Projeto e Estrategias
TDD Projeto e Estrategias
 
SOLID - Teoria e Prática
SOLID - Teoria e PráticaSOLID - Teoria e Prática
SOLID - Teoria e Prática
 

Princípios SOLID

  • 1. S.O.L.I.D. Princípios de Design para Programação Orientada a Objetos
  • 2. O Código Apodrece  Inevitável  Exemplo de correção de bug  Acoplamento  Mudança em uma linha de código gera mudanças em outras tantas  Nós temos que nos munir de armas contra o apodrecimento do código  SOLID é uma das armas
  • 4. Princípios  Single Responsibility Principle  Princípio de Responsabilidade Única  Open Closed Principle  Princípio Aberto Fechado  Liskov Substitution Principle  Princípio da Substituição de Liskov  Interface Segregation Principle  Princípio da Segregação de Interface  Dependency Inversion Principle  Princípio da Inversão de Dependência
  • 5. Vantagens  Fácil de manter, adaptar e ajustar às constantes mudanças exigidas pelos clientes  Fácil de entender e testar  Menor esforço para manutenções  Melhor reaproveitamento de código
  • 6. Princípio de Responsabilidade Única Todo objeto deve ter uma única responsabilidade, e todos os seus serviços devem estar rigorosamente alinhados com aquela responsabilidade.
  • 7. Princípio de Responsabilidade Única  Sintomas quando o princípio não é seguido:  Quantas vezes abrimos um código e simplesmente não temos a mínima ideia do que ele está fazendo?  Quantas variáveis espalhadas, aparentemente sem sentido?  Quantos cálculos mentais temos que fazer para descobrir se vai entrar naquele IF?  E quando a barra de rolagem parece não ter fim?
  • 8. Princípio de Responsabilidade Única  Uma classe ou método deve ter uma e apenas uma razão para mudar  Quebrando o princípio:  TransmissaoRepositorio  Seguindo o princípio:  TransmissaoRepositorio  ConversorTransmissao  ControladorDiscoRigido  ControladorEmail
  • 9. Princípio Aberto Fechado Cirurgia de peito aberto não é necessário ao colocar um casaco.
  • 10. Princípio Aberto Fechado  Sintomas quando o princípio não é seguido:  Adicionar novas regras requer mudança sempre no mesmo pedaço de código  Cada mudança pode introduzir bugs e requer novos testes  Mudar um pedaço de código cria mudança em cascata em várias classes.  If-ElseIf-Else encadeados  Switch-Case
  • 11. Princípio Aberto Fechado  Aberto para extensão  Novo comportamento pode ser adicionado no futuro  Fechado para modificação  Não há necessidade de modificar o código  Como adicionar novo comportamento sem mudar o código?  Depender de abstrações: Interfaces ou Classes Abstratas
  • 12. Princípio Aberto Fechado  Quebrando o princípio:  Carrinho  Seguindo o princípio:  Carrinho  CalculadorPreco  IRegraPreco  RegraPrecoEspecial  RegraPrecoPorGrama  RegraPrecoCada
  • 13. Substituição de Liskov Caso se pareça um pato e grasne como um pato mas precise de baterias, você provavelmente possui a abstração errada.
  • 14. Substituição de Liskov  Os subtipos devem ser substituíveis pelos seus tipos base.  Sintoma quando o princípio não é seguido:  Usar o operador “is” ou “typeof” em condições if- else ou switch
  • 15. Substituição de Liskov  Quebrando o princípio:  Retangulo  Quadrado  Seguindo o princípio:  Forma  Retangulo  Quadrado  Quadrado só é um retângulo no mundo real. Essa abstração “é-um” nesse caso não é válida.
  • 16. Segregação de Interface Você quer que eu plugue isso onde?
  • 17. Segregação de Interface  Clientes não devem ser forçados a dependerem de métodos que eles não usam  Sintomas quando o princípio não é seguido:  Interfaces com vários métodos, “gordas”  Quebra o princípio de Responsabilidade Única  Implementar uma interface “gorda” e nos métodos que não quer implementar lançar uma exceção  Por exemplo: método não suportado  Ou throw new NotImplementedException()
  • 18. Segregação de Interface  Quebrando o princípio  Contato  ControladorEmail  Discador  Seguindo o princípio:  IDiscavel  IEmail  Contato  ControladorEmail  Discador
  • 19. Inversão de Dependência Você soldaria uma lâmpada diretamente no fio de eletricidade na parede?
  • 20. Inversão de Dependência  Um módulo de alto nível não deve depender de outros de baixo nível  Baixo nível: acesso a banco, arquivos, WebServices  Alto nível: regras e entidades de negócio, interação com usuário  Módulos de alto nível devem utilizar um mecanismo para obter os dados de baixo nível, mas não depender dos detalhes desse mecanismo  UI depender do módulo de persistência, por exemplo banco de dados  Se a persistência mudar para arquivo Xml, toda a UI terá que ser reescrita
  • 21. Inversão de Dependência  Sintomas:  Dentro de um módulo/classe/método instanciar uma classe explicitamente usando o operador “new”  Possuir referência do projeto de acesso a dados no projeto de UI  O ideal é sempre depender de abstrações: Interfaces ou classes abstratas
  • 24. Inversão de Dependência  Aplicando o princípio nos exemplos:  SingleResponsibility  OpenClosed
  • 25. Referências  Software Practices, Pluralsight  Principles of Object Oriented Design  Design Patterns  Clean Code A Handbook of Agile Software Craftsmanship, Robert C. Martin  Agile Principles, Patterns, and Practices in C#, Robert C. Martin