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

Solid

  • 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
  • 4.
    Como assim alémdas classes?
  • 5.
    Atributos Objetos Classes Herança Encapsulamento Polimorfismo
  • 6.
  • 7.
  • 9.
    BDD Design Patterns DDD TDD Refactory Clean Code GRASP Princípios Base Testes Unidade
  • 10.
    Tudo Isso alémdas classes?
  • 11.
  • 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
  • 14.
  • 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 ume 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.
  • 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 declasse?
  • 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 fazendoesse 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 demé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.
  • 36.
  • 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 nocliente 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
  • 43.
    Regra é simples, apenasele 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ãodevem 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 queimplementarem essa interface agora vão ter esses métodos. Mas será que todas as DAOs vão precisar desses métodos?
  • 49.
    Grande Acoplamento! Voudividir 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
  • 54.
    Acho que voumexer em vários locais do projeto? Como posso melhorar?
  • 55.
  • 56.
    Projeto pode cresceragora de maneira sustentável
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 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