Workshop: Testes automatizados, Refactoring e Design Patterns

805 views
727 views

Published on

Palestra realizada junto com @jorgeoleques‎ no evento de comemoração dos 10 anos do Grupo de Usuários de Metodologias Ágeis do Rio Grande do Sul sobre qualidade de código.

Published in: Technology, Design
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
805
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
2
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Workshop: Testes automatizados, Refactoring e Design Patterns

  1. 1. Workshop: Testesautomatizados, RefactoringeDesginPatterns #GUMA10ANOS
  2. 2. Maurício Andreazza Sganderla - @m_andreazza • Desenvolvedor na uMov.me • Aficionado por Agile • No mercado de T.I. há 8 anos • Formado em Sistemas de Informação • Pós-Graduando em Métodos Ágeis Jorge Oleques - @jorgeoleques • Desenvolvedor na uMov.me • Entusiasta XP • No mercado de T.I. há 6 anos • Formado Analise e Desenvolvimento • Pós-Graduando em Eng. Software na FGV
  3. 3. ANO:
  4. 4. 2014
  5. 5. Ano de copa amigo...
  6. 6. quem testa seu software?
  7. 7. Quem testa de forma automatizada ?
  8. 8. Já pensou no tempo que você perde?
  9. 9. PIRÂMIDE DE TESTES
  10. 10. PIRÂMIDE DE TESTES
  11. 11. MAS AFINAL, O QUE É TESTE DE UNIDADE ?
  12. 12. “ “
  13. 13. mas tenho uma equipe de teste, por que testar?
  14. 14. Equipes de testes
  15. 15. testes caixa preta
  16. 16. E o teste de unidade pra que serve ?
  17. 17. definição de pronto
  18. 18. REFATORAR
  19. 19. REFATORAR? Do que se trata?
  20. 20. para refatorar preciso de patterns?
  21. 21. ● Extrair Método (Extract Method) ● Mover Método (Move Method) ● Mover Atributo (Move Field') ● Extrair Classe (Extract Class) ● Encapsular Atributo (Encapsulate Field) ● Renomear Método (Rename Method) ● Subir Método (Pull Up Method) ● Subir Atributo (Pull Up Field) ● Descer Método (Push Down Method) ● Descer Atributo (Push Down Field) ● Extrair Sub-classe (Extract Subclass) ● Extrair Super-classe (Extract Superclass) Refactory
  22. 22. public void save() { // Verifica propriedades if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome"); } else if (this.getTipo() == "E"&& this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } this.getDatabase().save(this); } fonte:http://pt.wikipedia.org/wiki/Refatoração código ruim
  23. 23. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração código melhor
  24. 24. mas ta realmente bom?
  25. 25. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração código melhor
  26. 26. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração como vamos testar?
  27. 27. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração quantas responsabilidade?
  28. 28. mas o que faço então?
  29. 29. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração quantas responsabilidade?
  30. 30. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração quantas responsabilidade? REFATORAR ENTÃO
  31. 31. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração quantas responsabilidade? 1. extrair para uma clase 2. extrair para metodo 3. extrair interface 4. aplicar strategy 5. criar factory
  32. 32. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração Extrair para uma classe 1. extrair para uma clase 2. extrair para metodo 3. extrair interface 4. aplicar strategy 5. criar factory
  33. 33. public classe checkProperties{ public void check() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } } Extrair para uma classe
  34. 34. public classe checkProperties{ public void check() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } } quantas responsabilidades?
  35. 35. public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } } public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } } Extrair para metodo
  36. 36. public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } } public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } } métodos testaveis
  37. 37. public interface Check(){ public void check(); } Extrair interface
  38. 38. public classe checkProperties{ public void check() { validateName(); validateDescription(); } public void validateName() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } } public void validateDescription() { if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } } aplicar strategy
  39. 39. public classe checkNome implements Check{ @Override public void check() { if (this.getName() == null) { throw new Exception("Falta nome do produto."); } } } aplicar strategy
  40. 40. public classe checkDescritpion implements Check{ @Override public void check() { if (this.getDescription() == null){ throw new Exception("Falta a descrição do produto."); } } } aplicar strategy
  41. 41. public classe CheckFactory{ public static Check getInstance(String type) { if (type == "E"){ return new CheckDescription(); }else if (type == "P"){ return new CheckName(); } } aplicar factory
  42. 42. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { if (this.getTipo() == "P" && this.getName() == null) { throw new Exception("Falta nome do produto."); } else if (this.getTipo() == "E" && this.getDescription() == null) { throw new Exception("Falta a descrição do produto."); } } fonte:http://pt.wikipedia.org/wiki/Refatoração o que tinhamos
  43. 43. public void save() { this.checkProperties(); this.getDatabase().save(this); } private void checkProperties() { CheckFactory.getInstance(this.getTipo()).check(); } e agora
  44. 44. e agora vod save(); void chekProperties(); Cliente Check getInstance(); CheckFactory void check(); Check void check(); CheckName void check(); CheckDescription
  45. 45. vantagens
  46. 46. 1. Código testável 2. Código mais simples 3. Mais fácil evoluir 4. Rápida manutenção vantagens
  47. 47. 1. Maior complexidade nas classes desvantagens
  48. 48. LET'S CODE !!!

×