SlideShare uma empresa Scribd logo
1 de 64
Jorge Oleques
            •   Pós-Graduando Eng. Software
            •   Graduado Analise e Desnv. Sistemas
            •   Desenvolvedor PHP
            •   Desenvolvedor Java
•   Email: joleques@gmail.com
•   Twitter : @jorgeoleques
•   Blog : joleques.blogspot.com
•   GiHub : github.com/joleques
•   Slideshare : www.slideshare.net/jorgeoleques
Como assim além das classes?
Atributos   Objetos   Classes

Herança




 Encapsulamento



    Polimorfismo
Base
Universo OO
BDD


   Design Patterns           DDD


TDD             Refactory          Clean Code


                 GRASP


                Princípios

Base                           Testes Unidade
Tudo Isso além das classes?
Simmmm............
BDD


       GoF                DDD


TDD          Refactory          Clean Code


              GRASP


             Princípios

Base                        Testes Unidade
BDD


       GoF                DDD


TDD          Refactory          Clean Code


              GRASP


             Princípios

Base                        Testes Unidade
Existem vários
•   Princípio da responsabilidade única
•   Princípio Abrir-Fechar
•   Princípio Liskov da substituição
•   Princípio de Segregação de Interface
•   Princípio Inversão de Dependência



SOLID
@unclebobmartin
          www.cleancoders.com
Tio Bob
Deve existir um e
                  somente UM MOTIVO
                  para que uma CLASSE
                   ou MÉTODO exista.




Princípio da responsabilidade única
<?php

    class Produto {

        private $descricao;
        private $valor;

        public function calcularValorDesconto(){}
        public function salvar(){}
        public function verificarSeTemNoEstoque(){}
    }

    ?>



Princípio da responsabilidade única
O que faz
essa classe?
<?php

    class Produto {

        private $descricao;
        private $valor;

        public function calcularValorDesconto(){}
        public function salvar(){}
        public function verificarSeTemNoEstoque(){}
    }

    ?>



Princípio da responsabilidade única
<?php
                                    Será que tem mais de
    class Produto {                uma responsabilidade?


        private $descricao;                                 Realiza
        private $valor;                                     Calculo


        public function calcularValorDesconto(){}            Salva
        public function salvar(){}                          na base
        public function verificarSeTemNoEstoque(){}
    }
                                                           Verifica
                                                           na base
    ?>



Princípio da responsabilidade única
<?php

    class CalculadoraDesconto{

        public function calcularValorDesconto($produto){}
    }

    ?>




Princípio da responsabilidade única
<?php

    class ProdutoDAO{

        public function salvar($produto){}
        public function verificarSeTemNoEstoque($produto){}

    }

    ?>




Princípio da responsabilidade única
Tudo Isso de classe?
Simmmm. Mas isso é um problema?
<?php

    class CalculadoraDesconto{

      public function calcularValorDesconto($produto){
         if($produto->regiao == 'SUL'){
            //codigo para executar calculo para a região sul
         }else{
            //codigo p/executar calculo demais regiões
         }
      }}

    ?>



Princípio da responsabilidade única
O que esta
fazendo esse
  método?
<?php

    class CalculadoraDesconto{

      public function calcularValorDesconto($produto){
         if($produto->regiao == 'SUL'){
            //codigo para executar calculo para a região sul
         }else{
            //codigo p/executar calculo demais regiões
         }
      }}

    ?>



Princípio da responsabilidade única
Mais de Uma
    <?php
                                     responsabilidade

    class CalculadoraDesconto{

      public function calcularValorDesconto($produto){
         if($produto->regiao == 'SUL'){
            //codigo para executar calculo para a região sul
         }else{
            //codigo p/executar calculo demais regiões
         }
      }}                     Isso não é
                         reaproveitamento
    ?>



Princípio da responsabilidade única
<?php

    class CalculadoraDesconto{

      public function calcularDescontoRegiaoSul($produto){}
      public function calcularDescontoDemaisRegioes($produto){}

      }

    ?>




Princípio da responsabilidade única
Tudo Isso de métodos?
Simmmm. Mas isso é um problema?
“Entidades de software
                (classes, módulos, funções, etc)
                    devem ser abertas para
                  extensão mas fechadas para
                         modificações”




Princípio Aberto-fechado
<?php
       class Cliente {

           private $nome;
           private $documento;

           public function realizarCompra($compra){
             //código para efetuar compra
           }
       }
     ?>




Princípio Aberto-fechado
Mas agora tem
                      PF e PJ?
 Acho que vou
colocar um if, ai
  eu passo um
  $tipoPessoa.
Nãoooooooooo
Cliente                  TipoPessoa




                 PessoaFisica            PessoJuridica




Princípio Aberto-fechado
<?php
       class Cliente {

          private $nome;
          private $documento;
          private $tipoPessoa;
     ?>



Princípio Aberto-fechado
abstract class TipoPessoa{                                       Bem mais
     public function realizarCompra($compra);                      flexível
  }
                   class PessoaJuridica extends TipoPessoa{
                       public function realizarCompra($compra){
                          //código para efetuar compra
                       }
                     }
   class PessoaFisica extends TipoPessoa{
      public function realizarCompra($compra){
        //código para efetuar compra
      }
   }




Princípio Aberto-fechado
Sem impacto no cliente
    Cliente                  TipoPessoa            quando eu alterar.




              PessoaFisica       PessoJuridica




Princípio Aberto-fechado
“Se q(x) é uma propriedade
                     demonstrável dos objetos X de
                  tipo T . Então deve ser verdadeiro
                       para objetos Y de tipo S
                     onde S é um subtipo de T.”




Princípio da substituição de Liskov
Regra é
simples, apenas ele
  quis dizer para
programarmos para
    a interface.
<?php

     class CalculadoraDesconto{

         public function valorDesconto(TipoPessoa $tipoPessoa){
           $desconto = $tipoPessoa->precentualDesconto();
           // codigo restante para o calculo
         }
     }

     ?>




Princípio da substituição de Liskov
Muito mais robusto

  <?php

  $calculadoraDesconto = new CalculadoraDesconto();

  $PessoaFisica = new PessoaFisica();
  $calculadoraDesconto->valorDesconto($PessoaFisica);

  $PessoaJuridica = new PessoaJuridica();
  $calculadoraDesconto->valorDesconto($PessoaJuridica);

  ?>




Princípio da substituição de Liskov
“Os clientes não devem ser
                    forçados a depender de
                     interfaces que eles não
                             utilizam




Princípio da Segregação de Interface
<?php

Interface DAO{

    public function buscar($id);
    public function salvar($objeto);
    public function alterar(($objeto);

}

?>
Todas classes que implementarem essa
 interface agora vão ter esses métodos. Mas
será que todas as DAOs vão precisar desses
                  métodos?
Grande Acoplamento! Vou dividir
                                       essa Interface.

<?php

Interface DAO{

    public function buscar($id);
    public function salvar($objeto);
    public function alterar(($objeto);

}

?>
Grande Coesão!
                                                Projeto mais flexível.

Interface BuscaDAO{
    public function buscar($id);
}
           Interface AlterarDAO{
                public function alterar($id);
           }


  Interface SalvarDAO{
      public function salvar($id);
  }
“Dependa de
                   abstrações e não de
                    classes concretas”



Princípio da Inversão de Dependência
Acho que vou mexer em
                       vários locais do projeto?


Como posso melhorar?
Inver tendo a
Dependência?
Projeto pode crescer agora
  de maneira sustentável
Conclusão
Flexível
Robusto
Sustentável
Saudável
?? ?? ??
??     ?
   ? ?
Obrigado!!!
• Email: joleques@gmail.com
• Twitter : @jorgeoleques



• Blog : joleques.blogspot.com
• GiHub : github.com/joleques
• Slideshare : www.slideshare.net/jorgeoleques
•   http://www.objectmentor.com/resources/articles/srp.pdf
 •   http://www.objectmentor.com/resources/articles/ocp.pdf
 •   http://www.objectmentor.com/resources/articles/lsp.pdf
 •   http://www.objectmentor.com/resources/articles/isp.pdf
 •   http://www.objectmentor.com/resources/articles/dip.pdf
 •   http://refactoring.com/catalog/index.html
 •   Martin, Rebert C., Clean Code




Referencias

Mais conteúdo relacionado

Mais procurados

Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosLudimila Monjardim Casagrande
 
Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHPDanilo Godoy
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOAndré Victor
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTKPablo Dall'Oglio
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Pythonchackero
 
Javascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksJavascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksBruno Abrantes
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Mario Jorge Pereira
 

Mais procurados (20)

POO - 10 - Herança
POO - 10 - HerançaPOO - 10 - Herança
POO - 10 - Herança
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
POO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a ObjetosPOO - 01 - Introdução ao Paradigma Orientado a Objetos
POO - 01 - Introdução ao Paradigma Orientado a Objetos
 
Injeção de Dependências com PHP
Injeção de Dependências com PHPInjeção de Dependências com PHP
Injeção de Dependências com PHP
 
Encapsulamento em oo
Encapsulamento em ooEncapsulamento em oo
Encapsulamento em oo
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTO
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
POO - 16 - Polimorfismo
POO - 16 - PolimorfismoPOO - 16 - Polimorfismo
POO - 16 - Polimorfismo
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTK
 
Poo
PooPoo
Poo
 
POO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de DesenvolvimentoPOO - 05 - Ambiente de Desenvolvimento
POO - 05 - Ambiente de Desenvolvimento
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com PythonWeb2py: Desenvolvimento Ágil de Aplicações Web com Python
Web2py: Desenvolvimento Ágil de Aplicações Web com Python
 
Javascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworksJavascript - Princípios da linguagem e utilização de frameworks
Javascript - Princípios da linguagem e utilização de frameworks
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
POO - 07 - Operadores do Java
POO - 07 - Operadores do  JavaPOO - 07 - Operadores do  Java
POO - 07 - Operadores do Java
 
Trabalhando com as views do Web2Py
Trabalhando com as views do Web2PyTrabalhando com as views do Web2Py
Trabalhando com as views do Web2Py
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 

Semelhante a Solid

DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016Leandro Silva
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHPAugusto das Neves
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012Luís Cobucci
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Luís Cobucci
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetosxbacon
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01joaocarlobarros
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol GynLuís Cobucci
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaElaine Naomi
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Sergio Lima
 

Semelhante a Solid (20)

DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetos
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01Serversidephp pptx2-120418140114-phpapp01
Serversidephp pptx2-120418140114-phpapp01
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Aula5
Aula5Aula5
Aula5
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
 
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
 

Mais de Jorge Oleques

Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.
Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.
Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.Jorge Oleques
 
Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parteJorge Oleques
 
TDD e Clean Code, garantia de um desenvolvimento saudável
TDD e Clean Code, garantia de um desenvolvimento saudávelTDD e Clean Code, garantia de um desenvolvimento saudável
TDD e Clean Code, garantia de um desenvolvimento saudávelJorge Oleques
 
Introdução Domain-Driven-Design
Introdução Domain-Driven-Design Introdução Domain-Driven-Design
Introdução Domain-Driven-Design Jorge Oleques
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012Jorge Oleques
 

Mais de Jorge Oleques (6)

Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.
Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.
Todo Super-herói tem suas fraquezas. Saiba como o Super-Agile foi derrotado.
 
Lei de Demeter parte
Lei de Demeter parteLei de Demeter parte
Lei de Demeter parte
 
TDD e Clean Code, garantia de um desenvolvimento saudável
TDD e Clean Code, garantia de um desenvolvimento saudávelTDD e Clean Code, garantia de um desenvolvimento saudável
TDD e Clean Code, garantia de um desenvolvimento saudável
 
Introdução Domain-Driven-Design
Introdução Domain-Driven-Design Introdução Domain-Driven-Design
Introdução Domain-Driven-Design
 
TDD e Clean Code
TDD e Clean CodeTDD e Clean Code
TDD e Clean Code
 
Apresentacao tdc 2012
Apresentacao tdc 2012Apresentacao tdc 2012
Apresentacao tdc 2012
 

Último

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 

Último (8)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 

Solid

  • 1.
  • 2. Jorge Oleques • Pós-Graduando Eng. Software • Graduado Analise e Desnv. Sistemas • Desenvolvedor PHP • Desenvolvedor Java • Email: joleques@gmail.com • Twitter : @jorgeoleques • Blog : joleques.blogspot.com • GiHub : github.com/joleques • Slideshare : www.slideshare.net/jorgeoleques
  • 3.
  • 4. Como assim além das classes?
  • 5. Atributos Objetos Classes Herança Encapsulamento Polimorfismo
  • 8.
  • 9. BDD Design Patterns DDD TDD Refactory Clean Code GRASP Princípios Base Testes Unidade
  • 10. Tudo Isso além das classes?
  • 12. BDD GoF DDD TDD Refactory Clean Code GRASP Princípios Base Testes Unidade
  • 13. BDD GoF DDD TDD Refactory Clean Code GRASP Princípios Base Testes Unidade
  • 15. Princípio da responsabilidade única • Princípio Abrir-Fechar • Princípio Liskov da substituição • Princípio de Segregação de Interface • Princípio Inversão de Dependência SOLID
  • 16. @unclebobmartin www.cleancoders.com Tio Bob
  • 17. Deve existir um e somente UM MOTIVO para que uma CLASSE ou MÉTODO exista. Princípio da responsabilidade única
  • 18. <?php class Produto { private $descricao; private $valor; public function calcularValorDesconto(){} public function salvar(){} public function verificarSeTemNoEstoque(){} } ?> Princípio da responsabilidade única
  • 19. O que faz essa classe?
  • 20. <?php class Produto { private $descricao; private $valor; public function calcularValorDesconto(){} public function salvar(){} public function verificarSeTemNoEstoque(){} } ?> Princípio da responsabilidade única
  • 21. <?php Será que tem mais de class Produto { uma responsabilidade? private $descricao; Realiza private $valor; Calculo public function calcularValorDesconto(){} Salva public function salvar(){} na base public function verificarSeTemNoEstoque(){} } Verifica na base ?> Princípio da responsabilidade única
  • 22. <?php class CalculadoraDesconto{ public function calcularValorDesconto($produto){} } ?> Princípio da responsabilidade única
  • 23. <?php class ProdutoDAO{ public function salvar($produto){} public function verificarSeTemNoEstoque($produto){} } ?> Princípio da responsabilidade única
  • 24. Tudo Isso de classe?
  • 25. Simmmm. Mas isso é um problema?
  • 26. <?php class CalculadoraDesconto{ public function calcularValorDesconto($produto){ if($produto->regiao == 'SUL'){ //codigo para executar calculo para a região sul }else{ //codigo p/executar calculo demais regiões } }} ?> Princípio da responsabilidade única
  • 27. O que esta fazendo esse método?
  • 28. <?php class CalculadoraDesconto{ public function calcularValorDesconto($produto){ if($produto->regiao == 'SUL'){ //codigo para executar calculo para a região sul }else{ //codigo p/executar calculo demais regiões } }} ?> Princípio da responsabilidade única
  • 29. Mais de Uma <?php responsabilidade class CalculadoraDesconto{ public function calcularValorDesconto($produto){ if($produto->regiao == 'SUL'){ //codigo para executar calculo para a região sul }else{ //codigo p/executar calculo demais regiões } }} Isso não é reaproveitamento ?> Princípio da responsabilidade única
  • 30. <?php class CalculadoraDesconto{ public function calcularDescontoRegiaoSul($produto){} public function calcularDescontoDemaisRegioes($produto){} } ?> Princípio da responsabilidade única
  • 31. Tudo Isso de métodos?
  • 32. Simmmm. Mas isso é um problema?
  • 33. “Entidades de software (classes, módulos, funções, etc) devem ser abertas para extensão mas fechadas para modificações” Princípio Aberto-fechado
  • 34. <?php class Cliente { private $nome; private $documento; public function realizarCompra($compra){ //código para efetuar compra } } ?> Princípio Aberto-fechado
  • 35. Mas agora tem PF e PJ? Acho que vou colocar um if, ai eu passo um $tipoPessoa.
  • 37. Cliente TipoPessoa PessoaFisica PessoJuridica Princípio Aberto-fechado
  • 38. <?php class Cliente { private $nome; private $documento; private $tipoPessoa; ?> Princípio Aberto-fechado
  • 39. abstract class TipoPessoa{ Bem mais public function realizarCompra($compra); flexível } class PessoaJuridica extends TipoPessoa{ public function realizarCompra($compra){ //código para efetuar compra } } class PessoaFisica extends TipoPessoa{ public function realizarCompra($compra){ //código para efetuar compra } } Princípio Aberto-fechado
  • 40. Sem impacto no cliente Cliente TipoPessoa quando eu alterar. PessoaFisica PessoJuridica Princípio Aberto-fechado
  • 41. “Se q(x) é uma propriedade demonstrável dos objetos X de tipo T . Então deve ser verdadeiro para objetos Y de tipo S onde S é um subtipo de T.” Princípio da substituição de Liskov
  • 42.
  • 43. Regra é simples, apenas ele quis dizer para programarmos para a interface.
  • 44. <?php class CalculadoraDesconto{ public function valorDesconto(TipoPessoa $tipoPessoa){ $desconto = $tipoPessoa->precentualDesconto(); // codigo restante para o calculo } } ?> Princípio da substituição de Liskov
  • 45. Muito mais robusto <?php $calculadoraDesconto = new CalculadoraDesconto(); $PessoaFisica = new PessoaFisica(); $calculadoraDesconto->valorDesconto($PessoaFisica); $PessoaJuridica = new PessoaJuridica(); $calculadoraDesconto->valorDesconto($PessoaJuridica); ?> Princípio da substituição de Liskov
  • 46. “Os clientes não devem ser forçados a depender de interfaces que eles não utilizam Princípio da Segregação de Interface
  • 47. <?php Interface DAO{ public function buscar($id); public function salvar($objeto); public function alterar(($objeto); } ?>
  • 48. Todas classes que implementarem essa interface agora vão ter esses métodos. Mas será que todas as DAOs vão precisar desses métodos?
  • 49. Grande Acoplamento! Vou dividir essa Interface. <?php Interface DAO{ public function buscar($id); public function salvar($objeto); public function alterar(($objeto); } ?>
  • 50. Grande Coesão! Projeto mais flexível. Interface BuscaDAO{ public function buscar($id); } Interface AlterarDAO{ public function alterar($id); } Interface SalvarDAO{ public function salvar($id); }
  • 51. “Dependa de abstrações e não de classes concretas” Princípio da Inversão de Dependência
  • 52.
  • 53.
  • 54. Acho que vou mexer em vários locais do projeto? Como posso melhorar?
  • 56. Projeto pode crescer agora de maneira sustentável
  • 62. ?? ?? ?? ?? ? ? ?
  • 63. Obrigado!!! • Email: joleques@gmail.com • Twitter : @jorgeoleques • Blog : joleques.blogspot.com • GiHub : github.com/joleques • Slideshare : www.slideshare.net/jorgeoleques
  • 64. http://www.objectmentor.com/resources/articles/srp.pdf • http://www.objectmentor.com/resources/articles/ocp.pdf • http://www.objectmentor.com/resources/articles/lsp.pdf • http://www.objectmentor.com/resources/articles/isp.pdf • http://www.objectmentor.com/resources/articles/dip.pdf • http://refactoring.com/catalog/index.html • Martin, Rebert C., Clean Code Referencias