Solid

635 visualizações

Publicada em

Palestra sobre principios

Publicada em: Tecnologia
0 comentários
2 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
635
No SlideShare
0
A partir de incorporações
0
Número de incorporações
2
Ações
Compartilhamentos
0
Downloads
18
Comentários
0
Gostaram
2
Incorporações 0
Nenhuma incorporação

Nenhuma nota no 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

×