Codifique melhor

1,039 views

Published on

Projetos novos ou legados exigem da equipe muita disciplina para manter todo o código limpo e conciso. Mesmo seguindo várias técnicas e padrões, devido a nossa condição humana, estamos sujeitos a cometer falhas o que nos leva a escrever código complexo e de difícil entendimento. Há várias práticas que ajudam a amenizar e corrigir estas falhas. Fazer testes, saber como e quando fazer um refactoring são essenciais para garantir a satisfação do cliente. Esta palestra aborda pontos que ajudam a criar ou manter um projeto através de testes, boas práticas de codificação, refactoring e design evolutivo.

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

No Downloads
Views
Total views
1,039
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
17
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Codifique melhor

    1. 1. Codifique melhor Marcos Sousa @marcos_sousa
    2. 2. about.me
    3. 3. afinal, o nosso objetivo é
    4. 4. +
    5. 5. valorize seu cliente
    6. 6. conheça o negócio
    7. 7. o importante é osoftware em operação
    8. 8. com feedbacks curtos
    9. 9. É fácil encontrar alguma coisa aí?
    10. 10. tenha como objetivo
    11. 11. organizar e mater organizado
    12. 12. código deve ser legível
    13. 13. analogia: software com livro
    14. 14. classes são capítulos
    15. 15. os capítulos (aka classes) devem ser concisos
    16. 16. parágrafos (métodos) interconectadas
    17. 17. as informações (nomes devariáveis/metodos/classes) claras e objetivas
    18. 18. vamos à prática
    19. 19. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }}
    20. 20. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }} Quantas operações são realizadas neste método?
    21. 21. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }}
    22. 22. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }1 - Checa se ultrapassa 30% e se está aprovado}
    23. 23. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }1 - Checa se ultrapassa 30% e se está aprovado}2 - Verifica se há saldo para o aditivo
    24. 24. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }1 - Checa se ultrapassa 30% e se está aprovado}2 - Verifica se há saldo para o aditivo3 - atualiza status e calcula novo valor docontrato
    25. 25. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }1 - Checa se ultrapassa 30% e se está aprovado}2 - Verifica se há saldo para o aditivo3 - atualiza status e calcula novo valor docontrato4 - Define novo status
    26. 26. public boolean finalizar(AditivoContato aditivo) { if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30 && aditivo.getAprovacaoGerente() == ‘S’) && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); dao.save(aditivo); return true; } else { return false; }1 - Checa se ultrapassa 30% e se está aprovado}2 - Verifica se há saldo para o aditivo3 - atualiza status e calcula novo valor docontrato4 - Define novo status5 - Responde a resquisição
    27. 27. passo-a-passo
    28. 28. public boolean finalizar(AditivoContato aditivo) { if (aditivo.isValorPermitidoOuAprovado() && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); repository.save(aditivo); return true; } else { return false; }}...public static float MAXIMO_PERMITIDO_SEM_APROVACAO = 0.30public static float FLAG_APROVACAO_GERENTE = ‘S’public boolean isValorPermitidoOuAprovado() { return (aditivo.getValor() > aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO) && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE;}
    29. 29. public boolean finalizar(AditivoContato aditivo) { if (aditivo.isValorPermitidoOuAprovado() && aditivo.getValor() < getSaldoConta(aditivo.getConta())) { aditivo.getContrato().setStatus(‘A’); aditivo.getContrato().setValor(aditivo.getValor() ...); aditivo.setStatus(‘F’); repository.save(aditivo); return true; } else { return false; } USE CONSTANTES AUTO-EXPLICATIVAS}...public static float MAXIMO_PERMITIDO_SEM_APROVACAO = 0.30public static float FLAG_APROVACAO_GERENTE = ‘S’public boolean isValorPermitidoOuAprovado() { return (aditivo.getValor() > aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO) && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE;}
    30. 30. public boolean isValorPermitidoOuAprovado() { return isValorPermitidoSemAprovacao() ||hasAprovacaoGerente();}private boolean isValorPermitidoSemAprovacao() { return valor > contrato.getValor() *MAXIMO_PERMITIDO_SEM_APROVACAO;}private boolean hasAprovacaoGerente() { return aprovacaoGerente == FLAG_APROVACAO_GERENTE;}
    31. 31. public boolean isValorPermitidoOuAprovado() { return isValorPermitidoSemAprovacao() ||hasAprovacaoGerente();}private boolean isValorPermitidoSemAprovacao() { return valor > contrato.getValor() *MAXIMO_PERMITIDO_SEM_APROVACAO;}private boolean hasAprovacaoGerente() { return aprovacaoGerente == FLAG_APROVACAO_GERENTE;} A ORDEM AJUDA NA LEITURA
    32. 32. ... e o resultado é
    33. 33. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));}
    34. 34. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));} Realizando apenas uma operção :)
    35. 35. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));} Uma mudança de requisitos pode impactar apenas um método no sistema
    36. 36. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));} Realizando apenas uma operção :) Uma mudança de requisitos pode impactar apenas um método no sistema
    37. 37. métodos pequenos =Sigle Responsability Principle
    38. 38. ... mas nem sempre sobra tempo
    39. 39. e por onde começar?
    40. 40. e vença uma batalha por vez
    41. 41. jamais tenha recaídas
    42. 42. tendo sempre em mente
    43. 43. ...eis o dilema preciso de testes para refatorar. Mas para tertestes preciso refatorar!
    44. 44. sintoma de alto acoplamentovisível quando tentamos testar partes isoladas
    45. 45. Quando fazer um refactoring?
    46. 46. Quando fazer um refactoring?✓Inclusão de novas funcionalidades
    47. 47. Quando fazer um refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs
    48. 48. Quando fazer um refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs✓Revisão do código
    49. 49. algorítimo do refactoring
    50. 50. identificar pontos de mudanças
    51. 51. identificar cenários de testes
    52. 52. eliminar dependências
    53. 53. fazer as mundanças
    54. 54. e refatore
    55. 55. mas lembre-se!o bom é inimigo do ótimo Voltaire
    56. 56. ...para atingir o objetivo✓Faça mudanças necessárias✓Não quebre funcionalidade✓E melhore o design do código
    57. 57. regra 1: contato com código siga o modelo já existente nomenclaturas, bibliotecas, estrutura
    58. 58. regra 2: contato com código respeite os desenvolvedores que estão ou que passaram pelo projeto
    59. 59. regra 3: em quem não confiar? em sistemas de deploy analise as etapas, dependências e refine-o removendo passos personalizados
    60. 60. regra 4: em quem não confiar? apenas nas especificações documentos facilmente estão desatualizados
    61. 61. regra 5: em quem não confiar? apenas no código e testes eles estão atendendo ao propósito?
    62. 62. regra 6: feedbacks rápidosfaça deploy, execute e teste-o! Mais de uma vez quanto tempo você gasta?
    63. 63. regra 7: feedbacks rápidos crie falhas! veja o quão tolerante é o seu sistema
    64. 64. regra 8: feedbacks rápidoscrie um ambiente de testes não fique no escuro e porque não integração contínua?
    65. 65. regra 9: feedbacks rápidos prove que suas mudanças funcionaram Tudo continua funcionando Nova funcionalidade está ok
    66. 66. regra 9: feedbacks rápidos prove que suas mudanças funcionaram Tudo continua funcionando Nova funcionalidade está okComo?
    67. 67. regra 9: feedbacks rápidos prove que suas mudanças funcionaram Tudo continua funcionando Nova funcionalidade está ok Como?Testes Unitários + Testes de Integração
    68. 68. regra 10: manter a ordem evite inserir comentários deixe o código falar pro si
    69. 69. código auto-explicativo// funcionários de contratação mensal que tenhacertificações e quetenham mais de 5 anos de carreira ganham 5%if (tipoContratacao() == “mensal” || certificacoes > 0 &&getTotalEmAnosContratado() > 5) { bonus = 0.05;}
    70. 70. código auto-explicativo// funcionários de contratação mensal que tenhacertificações e quetenham mais de 5 anos de carreira ganham 5%if (tipoContratacao() == “mensal” || certificacoes > 0 &&getTotalEmAnosContratado() > 5) { bonus = 0.05;}Que tal isso?if (possuiCriteriosParaBonus())
    71. 71. regra 11: manter a ordemremova códigos comentados se é velho ou desnecessário porque está aqui?
    72. 72. regra 12: manter a ordemsempre que puder, remova excessos de acoplamento o ideal é ter um ponto de mudança
    73. 73. mas lembre-se
    74. 74. o código de que acabou de criar já é legado
    75. 75. escreva código fácil de ser modificado
    76. 76. faça pair programming sempre que puder
    77. 77. aprenda com o códigolegado como codificar melhor
    78. 78. Marcos Sousafalecomigo@marcossousa.com @marcos_sousa

    ×