Jorge Oleques            •   Pós-Graduando Eng. Software            •   Graduado Analise e Desnv. Sistemas            •   ...
Como assim além das classes?
Atributos   Objetos   ClassesHerança Encapsulamento    Polimorfismo
Base
Universo OO
BDD   Design Patterns           DDDTDD             Refactory          Clean Code                 GRASP                Prin...
Tudo Isso além das classes?
Simmmm............
BDD       GoF                DDDTDD          Refactory          Clean Code              GRASP             PrincípiosBase  ...
BDD       GoF                DDDTDD          Refactory          Clean Code              GRASP             PrincípiosBase  ...
Existem vários
•   Princípio da responsabilidade única•   Princípio Abrir-Fechar•   Princípio Liskov da substituição•   Princípio de Segr...
@unclebobmartin          www.cleancoders.comTio Bob
Deve existir um e                  somente UM MOTIVO                  para que uma CLASSE                   ou MÉTODO exis...
<?php    class Produto {        private $descricao;        private $valor;        public function calcularValorDesconto(){...
O que fazessa classe?
<?php    class Produto {        private $descricao;        private $valor;        public function calcularValorDesconto(){...
<?php                                    Será que tem mais de    class Produto {                uma responsabilidade?     ...
<?php    class CalculadoraDesconto{        public function calcularValorDesconto($produto){}    }    ?>Princípio da respon...
<?php    class ProdutoDAO{        public function salvar($produto){}        public function verificarSeTemNoEstoque($produ...
Tudo Isso de classe?
Simmmm. Mas isso é um problema?
<?php    class CalculadoraDesconto{      public function calcularValorDesconto($produto){         if($produto->regiao == S...
O que estafazendo esse  método?
<?php    class CalculadoraDesconto{      public function calcularValorDesconto($produto){         if($produto->regiao == S...
Mais de Uma    <?php                                     responsabilidade    class CalculadoraDesconto{      public functi...
<?php    class CalculadoraDesconto{      public function calcularDescontoRegiaoSul($produto){}      public function calcul...
Tudo Isso de métodos?
Simmmm. Mas isso é um problema?
“Entidades de software                (classes, módulos, funções, etc)                    devem ser abertas para          ...
<?php       class Cliente {           private $nome;           private $documento;           public function realizarCompr...
Mas agora tem                      PF e PJ? Acho que voucolocar um if, ai  eu passo um  $tipoPessoa.
Nãoooooooooo
Cliente                  TipoPessoa                 PessoaFisica            PessoJuridicaPrincípio Aberto-fechado
<?php       class Cliente {          private $nome;          private $documento;          private $tipoPessoa;     ?>Princ...
abstract class TipoPessoa{                                       Bem mais     public function realizarCompra($compra);    ...
Sem impacto no cliente    Cliente                  TipoPessoa            quando eu alterar.              PessoaFisica     ...
“Se q(x) é uma propriedade                     demonstrável dos objetos X de                  tipo T . Então deve ser verd...
Regra ésimples, apenas ele  quis dizer paraprogramarmos para    a interface.
<?php     class CalculadoraDesconto{         public function valorDesconto(TipoPessoa $tipoPessoa){           $desconto = ...
Muito mais robusto  <?php  $calculadoraDesconto = new CalculadoraDesconto();  $PessoaFisica = new PessoaFisica();  $calcul...
“Os clientes não devem ser                    forçados a depender de                     interfaces que eles não          ...
<?phpInterface DAO{    public function buscar($id);    public function salvar($objeto);    public function alterar(($objet...
Todas classes que implementarem essa interface agora vão ter esses métodos. Masserá que todas as DAOs vão precisar desses ...
Grande Acoplamento! Vou dividir                                       essa Interface.<?phpInterface DAO{    public functio...
Grande Coesão!                                                Projeto mais flexível.Interface BuscaDAO{    public function...
“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 aDependê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...
•   http://www.objectmentor.com/resources/articles/srp.pdf •   http://www.objectmentor.com/resources/articles/ocp.pdf •   ...
Solid
Solid
Solid
Solid
Solid
Solid
Upcoming SlideShare
Loading in …5
×

Solid

647 views

Published on

Palestra sobre principios

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
647
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
18
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Solid

  1. 1. 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
  2. 2. Como assim além das classes?
  3. 3. Atributos Objetos ClassesHerança Encapsulamento Polimorfismo
  4. 4. Base
  5. 5. Universo OO
  6. 6. BDD Design Patterns DDDTDD Refactory Clean Code GRASP PrincípiosBase Testes Unidade
  7. 7. Tudo Isso além das classes?
  8. 8. Simmmm............
  9. 9. BDD GoF DDDTDD Refactory Clean Code GRASP PrincípiosBase Testes Unidade
  10. 10. BDD GoF DDDTDD Refactory Clean Code GRASP PrincípiosBase Testes Unidade
  11. 11. Existem vários
  12. 12. • 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ênciaSOLID
  13. 13. @unclebobmartin www.cleancoders.comTio Bob
  14. 14. Deve existir um e somente UM MOTIVO para que uma CLASSE ou MÉTODO exista.Princípio da responsabilidade única
  15. 15. <?php class Produto { private $descricao; private $valor; public function calcularValorDesconto(){} public function salvar(){} public function verificarSeTemNoEstoque(){} } ?>Princípio da responsabilidade única
  16. 16. O que fazessa classe?
  17. 17. <?php class Produto { private $descricao; private $valor; public function calcularValorDesconto(){} public function salvar(){} public function verificarSeTemNoEstoque(){} } ?>Princípio da responsabilidade única
  18. 18. <?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
  19. 19. <?php class CalculadoraDesconto{ public function calcularValorDesconto($produto){} } ?>Princípio da responsabilidade única
  20. 20. <?php class ProdutoDAO{ public function salvar($produto){} public function verificarSeTemNoEstoque($produto){} } ?>Princípio da responsabilidade única
  21. 21. Tudo Isso de classe?
  22. 22. Simmmm. Mas isso é um problema?
  23. 23. <?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
  24. 24. O que estafazendo esse método?
  25. 25. <?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
  26. 26. 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
  27. 27. <?php class CalculadoraDesconto{ public function calcularDescontoRegiaoSul($produto){} public function calcularDescontoDemaisRegioes($produto){} } ?>Princípio da responsabilidade única
  28. 28. Tudo Isso de métodos?
  29. 29. Simmmm. Mas isso é um problema?
  30. 30. “Entidades de software (classes, módulos, funções, etc) devem ser abertas para extensão mas fechadas para modificações”Princípio Aberto-fechado
  31. 31. <?php class Cliente { private $nome; private $documento; public function realizarCompra($compra){ //código para efetuar compra } } ?>Princípio Aberto-fechado
  32. 32. Mas agora tem PF e PJ? Acho que voucolocar um if, ai eu passo um $tipoPessoa.
  33. 33. Nãoooooooooo
  34. 34. Cliente TipoPessoa PessoaFisica PessoJuridicaPrincípio Aberto-fechado
  35. 35. <?php class Cliente { private $nome; private $documento; private $tipoPessoa; ?>Princípio Aberto-fechado
  36. 36. 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
  37. 37. Sem impacto no cliente Cliente TipoPessoa quando eu alterar. PessoaFisica PessoJuridicaPrincípio Aberto-fechado
  38. 38. “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
  39. 39. Regra ésimples, apenas ele quis dizer paraprogramarmos para a interface.
  40. 40. <?php class CalculadoraDesconto{ public function valorDesconto(TipoPessoa $tipoPessoa){ $desconto = $tipoPessoa->precentualDesconto(); // codigo restante para o calculo } } ?>Princípio da substituição de Liskov
  41. 41. 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
  42. 42. “Os clientes não devem ser forçados a depender de interfaces que eles não utilizamPrincípio da Segregação de Interface
  43. 43. <?phpInterface DAO{ public function buscar($id); public function salvar($objeto); public function alterar(($objeto);}?>
  44. 44. Todas classes que implementarem essa interface agora vão ter esses métodos. Masserá que todas as DAOs vão precisar desses métodos?
  45. 45. Grande Acoplamento! Vou dividir essa Interface.<?phpInterface DAO{ public function buscar($id); public function salvar($objeto); public function alterar(($objeto);}?>
  46. 46. 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); }
  47. 47. “Dependa de abstrações e não de classes concretas”Princípio da Inversão de Dependência
  48. 48. Acho que vou mexer em vários locais do projeto?Como posso melhorar?
  49. 49. Inver tendo aDependência?
  50. 50. Projeto pode crescer agora de maneira sustentável
  51. 51. Conclusão
  52. 52. Flexível
  53. 53. Robusto
  54. 54. Sustentável
  55. 55. Saudável
  56. 56. ?? ?? ???? ? ? ?
  57. 57. Obrigado!!!• Email: joleques@gmail.com• Twitter : @jorgeoleques• Blog : joleques.blogspot.com• GiHub : github.com/joleques• Slideshare : www.slideshare.net/jorgeoleques
  58. 58. • 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 CodeReferencias

×