SlideShare una empresa de Scribd logo
1 de 50
Descargar para leer sin conexión
S.O.L.I..D Principles
                                 Por Ismael Soares
                                  @ismaelsoaresz




                               Agile Brazil 2012

domingo, 9 de setembro de 12
SOLID são princípios básicos (boas práticas) da
     Programação Orientada a Objeto




domingo, 9 de setembro de 12
Não é exclusividade
     de nenhuma linguagem
     de programação




domingo, 9 de setembro de 12
Por que devo saber
                            SOLID?



domingo, 9 de setembro de 12
Você precisa fazer a coisa certa do jeito certo!

domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
S ingle responsibility Principle
                           O pen/Closed
                           L iskov Substitution Principle
                           I nterface Segregation
                           D ependency Inversion Principle

domingo, 9 de setembro de 12
1




               Single responsability Principle


domingo, 9 de setembro de 12
Principle

           Uma Classe deve possuir apenas um motivo
           para ser alterada, ou seja, possuir apenas uma
           responsabilidade.




domingo, 9 de setembro de 12
O que faz esta classe?




domingo, 9 de setembro de 12
Gera Frete e Ajusta o Contador e Obtem Nota e...




domingo, 9 de setembro de 12
Devemos separar as funcionalidades em
        classes distintas.


                  public class GeradorDeNotaFiscalDeFrete {}

                  public class AjustadorDeContadorDeNumeracaoDeNotaFiscal {}

                  public class ConsultaDeNotaFiscalService {}

                  ...




domingo, 9 de setembro de 12
Porque quando você fizer uma alteração, vai
             procurar a classe responsável.




domingo, 9 de setembro de 12
2




                               Open/Closed


domingo, 9 de setembro de 12
Principle


                   Uma classe deve estar aberta para extensão,
                          mas fechada para alteração




domingo, 9 de setembro de 12
Crédo... que
                               diabos é isso?




domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
Tem alguma coisa errada
                               com este código?




domingo, 9 de setembro de 12
Como incluir uma nova Forma
                               sem alterar o método que a desenha?




domingo, 9 de setembro de 12
Lascô...




domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
3




                Liskov Substitution Principle


domingo, 9 de setembro de 12
Principle

               "Se você pode invocar um método q() de uma
               classe T (base), deve poder também invocar o
               método q() de uma classe T'(derivada)
               que é derivada com herança de T (base)."




domingo, 9 de setembro de 12
Agora Lascô
                                 de vez!




domingo, 9 de setembro de 12
Deve ser possível substituir uma classe base por
        uma classe derivada em qualquer ponto do código




domingo, 9 de setembro de 12
Uffa!
                               Agora entendi...




domingo, 9 de setembro de 12
Exemplo




domingo, 9 de setembro de 12
Correto!




domingo, 9 de setembro de 12
4




                               Interface Segregation


domingo, 9 de setembro de 12
Principle

                   É melhor ter muitas interfaces específicas
                      do que ter uma interface genérica.




domingo, 9 de setembro de 12
Vamos ao exemplo...




domingo, 9 de setembro de 12
Seu gerente




domingo, 9 de setembro de 12
E lasquera a fábrica tá bondando!




domingo, 9 de setembro de 12
Correto!




domingo, 9 de setembro de 12
Correto!




domingo, 9 de setembro de 12
5




             Dependency Inversion Principle


domingo, 9 de setembro de 12
Principle

              Módulos de alto nível não devem depender de módulos
                 de baixo nível, devem depender de abstrações.




domingo, 9 de setembro de 12
Tá... i dai?




domingo, 9 de setembro de 12
Abstrações não devem depender de detalhes, detalhes
                           devem depender de abstrações.




domingo, 9 de setembro de 12
Exemplo




domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
Quebrando o princípio




domingo, 9 de setembro de 12
Correto




domingo, 9 de setembro de 12
domingo, 9 de setembro de 12
Obrigado


domingo, 9 de setembro de 12
References
        http://www.slideshare.net/fullscreen/andrefaria/solid-princpio-da-responsabilidade-nica/1

        http://viniciusquaiato.com/blog/srp-single-responsibility-principle/

        http://en.wikipedia.org/wiki/Single_responsibility_principle

        http://www.macoratti.net/11/05/oop_opc1.htm

        http://www.javacodegeeks.com/2011/11/solid-liskov-substitution-principle.html

        http://www.oodesign.com/interface-segregation-principle.html




domingo, 9 de setembro de 12

Más contenido relacionado

Destacado

Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações Web
Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações WebProposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações Web
Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações WebMaurício Aniche
 
Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Maurício Aniche
 
DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?Maurício Aniche
 
Conheça a nova arquitetura do compilador do C# (DNAD 2015)
Conheça a nova arquitetura do compilador do C# (DNAD 2015)Conheça a nova arquitetura do compilador do C# (DNAD 2015)
Conheça a nova arquitetura do compilador do C# (DNAD 2015)Giovanni Bassi
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com dockerGiovanni Bassi
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureGiovanni Bassi
 
ASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETEduardo Pires
 
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVAProgramação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVACristiano Almeida
 
Aplicações Conectadas com ASP.NET WebHooks
Aplicações Conectadas com ASP.NET WebHooksAplicações Conectadas com ASP.NET WebHooks
Aplicações Conectadas com ASP.NET WebHooksEduardo Pires
 
SOLID - Teoria e Prática
SOLID - Teoria e PráticaSOLID - Teoria e Prática
SOLID - Teoria e PráticaEduardo Pires
 
Conceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosConceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosLeonardo Melo Santos
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...Maurício Aniche
 
A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016Maurício Aniche
 
Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016Maurício Aniche
 
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017Maurício Aniche
 

Destacado (17)

Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações Web
Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações WebProposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações Web
Proposta: Métricas e Heurísticas para Detecção de Problemas em Aplicações Web
 
Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?Como eu aprendi que testar software é importante?
Como eu aprendi que testar software é importante?
 
DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?DNAD 2015 - Métricas de código, pra que te quero?
DNAD 2015 - Métricas de código, pra que te quero?
 
Conheça a nova arquitetura do compilador do C# (DNAD 2015)
Conheça a nova arquitetura do compilador do C# (DNAD 2015)Conheça a nova arquitetura do compilador do C# (DNAD 2015)
Conheça a nova arquitetura do compilador do C# (DNAD 2015)
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com docker
 
ASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e AzureASP.NET Core com Linux, Docker e Azure
ASP.NET Core com Linux, Docker e Azure
 
ASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NET
 
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVAProgramação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
 
Aplicações Conectadas com ASP.NET WebHooks
Aplicações Conectadas com ASP.NET WebHooksAplicações Conectadas com ASP.NET WebHooks
Aplicações Conectadas com ASP.NET WebHooks
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
SOLID - Teoria e Prática
SOLID - Teoria e PráticaSOLID - Teoria e Prática
SOLID - Teoria e Prática
 
Conceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetosConceitos básicos de programação orientada a objetos
Conceitos básicos de programação orientada a objetos
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
SATT: Tailoring Code Metric Thresholds for Different Software Architectures (...
 
A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016A Validated Set of Smells for MVC Architectures - ICSME 2016
A Validated Set of Smells for MVC Architectures - ICSME 2016
 
Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016Code quality in MVC systems - BENEVOL 2016
Code quality in MVC systems - BENEVOL 2016
 
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
A Collaborative Approach to Teach Software Architecture - SIGCSE 2017
 

Más de Ismael

TDC 2020 - Trilha de Management 3.0 e Gestão Ágil
TDC 2020 - Trilha de Management 3.0 e Gestão ÁgilTDC 2020 - Trilha de Management 3.0 e Gestão Ágil
TDC 2020 - Trilha de Management 3.0 e Gestão ÁgilIsmael
 
Introducao ao Pensamento Sistemico
Introducao ao Pensamento SistemicoIntroducao ao Pensamento Sistemico
Introducao ao Pensamento SistemicoIsmael
 
Testes de unidade alem do basico
Testes de unidade alem do basicoTestes de unidade alem do basico
Testes de unidade alem do basicoIsmael
 
Bluesoft Culture
Bluesoft CultureBluesoft Culture
Bluesoft CultureIsmael
 
Como dar e receber feedbacks
Como dar e receber feedbacksComo dar e receber feedbacks
Como dar e receber feedbacksIsmael
 
Eficiencia de fluxo
Eficiencia de fluxoEficiencia de fluxo
Eficiencia de fluxoIsmael
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017Ismael
 
Como ter Entregas Frequentes
Como ter Entregas FrequentesComo ter Entregas Frequentes
Como ter Entregas FrequentesIsmael
 
JUnit 5 vs JUnit 4
JUnit 5 vs JUnit 4JUnit 5 vs JUnit 4
JUnit 5 vs JUnit 4Ismael
 
Conceitos por trás do Ágil
Conceitos por trás do ÁgilConceitos por trás do Ágil
Conceitos por trás do ÁgilIsmael
 
Boas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesBoas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesIsmael
 
8 passos para mudança de John Kotter
8 passos para mudança de John Kotter8 passos para mudança de John Kotter
8 passos para mudança de John KotterIsmael
 
Curva da Mudança Kubler-Ross
Curva da Mudança Kubler-RossCurva da Mudança Kubler-Ross
Curva da Mudança Kubler-RossIsmael
 
DevCamp 2016
DevCamp 2016DevCamp 2016
DevCamp 2016Ismael
 
7 Caracteristicas de um bom Lider Agil
7 Caracteristicas de um bom Lider Agil7 Caracteristicas de um bom Lider Agil
7 Caracteristicas de um bom Lider AgilIsmael
 
Law of demeter
Law of demeterLaw of demeter
Law of demeterIsmael
 
Junit Lambda
Junit LambdaJunit Lambda
Junit LambdaIsmael
 
Feedback dos Testes
Feedback dos TestesFeedback dos Testes
Feedback dos TestesIsmael
 
Refactoring Databases - Estrategias
Refactoring Databases - EstrategiasRefactoring Databases - Estrategias
Refactoring Databases - EstrategiasIsmael
 
Refactoring Databases - parte 1
Refactoring Databases - parte 1Refactoring Databases - parte 1
Refactoring Databases - parte 1Ismael
 

Más de Ismael (20)

TDC 2020 - Trilha de Management 3.0 e Gestão Ágil
TDC 2020 - Trilha de Management 3.0 e Gestão ÁgilTDC 2020 - Trilha de Management 3.0 e Gestão Ágil
TDC 2020 - Trilha de Management 3.0 e Gestão Ágil
 
Introducao ao Pensamento Sistemico
Introducao ao Pensamento SistemicoIntroducao ao Pensamento Sistemico
Introducao ao Pensamento Sistemico
 
Testes de unidade alem do basico
Testes de unidade alem do basicoTestes de unidade alem do basico
Testes de unidade alem do basico
 
Bluesoft Culture
Bluesoft CultureBluesoft Culture
Bluesoft Culture
 
Como dar e receber feedbacks
Como dar e receber feedbacksComo dar e receber feedbacks
Como dar e receber feedbacks
 
Eficiencia de fluxo
Eficiencia de fluxoEficiencia de fluxo
Eficiencia de fluxo
 
Como você testa seu software TDC 2017
Como você testa seu software  TDC 2017Como você testa seu software  TDC 2017
Como você testa seu software TDC 2017
 
Como ter Entregas Frequentes
Como ter Entregas FrequentesComo ter Entregas Frequentes
Como ter Entregas Frequentes
 
JUnit 5 vs JUnit 4
JUnit 5 vs JUnit 4JUnit 5 vs JUnit 4
JUnit 5 vs JUnit 4
 
Conceitos por trás do Ágil
Conceitos por trás do ÁgilConceitos por trás do Ágil
Conceitos por trás do Ágil
 
Boas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros MacetesBoas Praticas de Testes, Bad Smell e Outros Macetes
Boas Praticas de Testes, Bad Smell e Outros Macetes
 
8 passos para mudança de John Kotter
8 passos para mudança de John Kotter8 passos para mudança de John Kotter
8 passos para mudança de John Kotter
 
Curva da Mudança Kubler-Ross
Curva da Mudança Kubler-RossCurva da Mudança Kubler-Ross
Curva da Mudança Kubler-Ross
 
DevCamp 2016
DevCamp 2016DevCamp 2016
DevCamp 2016
 
7 Caracteristicas de um bom Lider Agil
7 Caracteristicas de um bom Lider Agil7 Caracteristicas de um bom Lider Agil
7 Caracteristicas de um bom Lider Agil
 
Law of demeter
Law of demeterLaw of demeter
Law of demeter
 
Junit Lambda
Junit LambdaJunit Lambda
Junit Lambda
 
Feedback dos Testes
Feedback dos TestesFeedback dos Testes
Feedback dos Testes
 
Refactoring Databases - Estrategias
Refactoring Databases - EstrategiasRefactoring Databases - Estrategias
Refactoring Databases - Estrategias
 
Refactoring Databases - parte 1
Refactoring Databases - parte 1Refactoring Databases - parte 1
Refactoring Databases - parte 1
 

SOLID Principles Explained

  • 1. S.O.L.I..D Principles Por Ismael Soares @ismaelsoaresz Agile Brazil 2012 domingo, 9 de setembro de 12
  • 2. SOLID são princípios básicos (boas práticas) da Programação Orientada a Objeto domingo, 9 de setembro de 12
  • 3. Não é exclusividade de nenhuma linguagem de programação domingo, 9 de setembro de 12
  • 4. Por que devo saber SOLID? domingo, 9 de setembro de 12
  • 5. Você precisa fazer a coisa certa do jeito certo! domingo, 9 de setembro de 12
  • 6. domingo, 9 de setembro de 12
  • 7. S ingle responsibility Principle O pen/Closed L iskov Substitution Principle I nterface Segregation D ependency Inversion Principle domingo, 9 de setembro de 12
  • 8. 1 Single responsability Principle domingo, 9 de setembro de 12
  • 9. Principle Uma Classe deve possuir apenas um motivo para ser alterada, ou seja, possuir apenas uma responsabilidade. domingo, 9 de setembro de 12
  • 10. O que faz esta classe? domingo, 9 de setembro de 12
  • 11. Gera Frete e Ajusta o Contador e Obtem Nota e... domingo, 9 de setembro de 12
  • 12. Devemos separar as funcionalidades em classes distintas. public class GeradorDeNotaFiscalDeFrete {} public class AjustadorDeContadorDeNumeracaoDeNotaFiscal {} public class ConsultaDeNotaFiscalService {} ... domingo, 9 de setembro de 12
  • 13. Porque quando você fizer uma alteração, vai procurar a classe responsável. domingo, 9 de setembro de 12
  • 14. 2 Open/Closed domingo, 9 de setembro de 12
  • 15. Principle Uma classe deve estar aberta para extensão, mas fechada para alteração domingo, 9 de setembro de 12
  • 16. Crédo... que diabos é isso? domingo, 9 de setembro de 12
  • 17. domingo, 9 de setembro de 12
  • 18. domingo, 9 de setembro de 12
  • 19. Tem alguma coisa errada com este código? domingo, 9 de setembro de 12
  • 20. Como incluir uma nova Forma sem alterar o método que a desenha? domingo, 9 de setembro de 12
  • 21. Lascô... domingo, 9 de setembro de 12
  • 22. domingo, 9 de setembro de 12
  • 23. domingo, 9 de setembro de 12
  • 24. domingo, 9 de setembro de 12
  • 25. domingo, 9 de setembro de 12
  • 26. 3 Liskov Substitution Principle domingo, 9 de setembro de 12
  • 27. Principle "Se você pode invocar um método q() de uma classe T (base), deve poder também invocar o método q() de uma classe T'(derivada) que é derivada com herança de T (base)." domingo, 9 de setembro de 12
  • 28. Agora Lascô de vez! domingo, 9 de setembro de 12
  • 29. Deve ser possível substituir uma classe base por uma classe derivada em qualquer ponto do código domingo, 9 de setembro de 12
  • 30. Uffa! Agora entendi... domingo, 9 de setembro de 12
  • 31. Exemplo domingo, 9 de setembro de 12
  • 32. Correto! domingo, 9 de setembro de 12
  • 33. 4 Interface Segregation domingo, 9 de setembro de 12
  • 34. Principle É melhor ter muitas interfaces específicas do que ter uma interface genérica. domingo, 9 de setembro de 12
  • 35. Vamos ao exemplo... domingo, 9 de setembro de 12
  • 36. Seu gerente domingo, 9 de setembro de 12
  • 37. E lasquera a fábrica tá bondando! domingo, 9 de setembro de 12
  • 38. Correto! domingo, 9 de setembro de 12
  • 39. Correto! domingo, 9 de setembro de 12
  • 40. 5 Dependency Inversion Principle domingo, 9 de setembro de 12
  • 41. Principle Módulos de alto nível não devem depender de módulos de baixo nível, devem depender de abstrações. domingo, 9 de setembro de 12
  • 42. Tá... i dai? domingo, 9 de setembro de 12
  • 43. Abstrações não devem depender de detalhes, detalhes devem depender de abstrações. domingo, 9 de setembro de 12
  • 44. Exemplo domingo, 9 de setembro de 12
  • 45. domingo, 9 de setembro de 12
  • 46. Quebrando o princípio domingo, 9 de setembro de 12
  • 47. Correto domingo, 9 de setembro de 12
  • 48. domingo, 9 de setembro de 12
  • 49. Obrigado domingo, 9 de setembro de 12
  • 50. References http://www.slideshare.net/fullscreen/andrefaria/solid-princpio-da-responsabilidade-nica/1 http://viniciusquaiato.com/blog/srp-single-responsibility-principle/ http://en.wikipedia.org/wiki/Single_responsibility_principle http://www.macoratti.net/11/05/oop_opc1.htm http://www.javacodegeeks.com/2011/11/solid-liskov-substitution-principle.html http://www.oodesign.com/interface-segregation-principle.html domingo, 9 de setembro de 12