Codifique melhor
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Codifique melhor

on

  • 1,088 views

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 ...

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.

Statistics

Views

Total Views
1,088
Views on SlideShare
1,086
Embed Views
2

Actions

Likes
3
Downloads
15
Comments
0

1 Embed 2

https://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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 Presentation Transcript

  • 1. Codifique melhor Marcos Sousa @marcos_sousa
  • 2. about.me
  • 3. afinal, o nosso objetivo é
  • 4. +
  • 5. valorize seu cliente
  • 6. conheça o negócio
  • 7. o importante é osoftware em operação
  • 8. com feedbacks curtos
  • 9. É fácil encontrar alguma coisa aí?
  • 10. tenha como objetivo
  • 11. organizar e mater organizado
  • 12. código deve ser legível
  • 13. analogia: software com livro
  • 14. classes são capítulos
  • 15. os capítulos (aka classes) devem ser concisos
  • 16. parágrafos (métodos) interconectadas
  • 17. as informações (nomes devariáveis/metodos/classes) claras e objetivas
  • 18. vamos à prática
  • 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. 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. 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. 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. 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. 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. 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. 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. passo-a-passo
  • 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. 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. 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. 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. ... e o resultado é
  • 33. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));}
  • 34. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repository.salvo(aditivo.finalizado()));} Realizando apenas uma operção :)
  • 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. 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. métodos pequenos =Sigle Responsability Principle
  • 38. ... mas nem sempre sobra tempo
  • 39. e por onde começar?
  • 40. e vença uma batalha por vez
  • 41. jamais tenha recaídas
  • 42. tendo sempre em mente
  • 43. ...eis o dilema preciso de testes para refatorar. Mas para tertestes preciso refatorar!
  • 44. sintoma de alto acoplamentovisível quando tentamos testar partes isoladas
  • 45. Quando fazer um refactoring?
  • 46. Quando fazer um refactoring?✓Inclusão de novas funcionalidades
  • 47. Quando fazer um refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs
  • 48. Quando fazer um refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs✓Revisão do código
  • 49. algorítimo do refactoring
  • 50. identificar pontos de mudanças
  • 51. identificar cenários de testes
  • 52. eliminar dependências
  • 53. fazer as mundanças
  • 54. e refatore
  • 55. mas lembre-se!o bom é inimigo do ótimo Voltaire
  • 56. ...para atingir o objetivo✓Faça mudanças necessárias✓Não quebre funcionalidade✓E melhore o design do código
  • 57. regra 1: contato com código siga o modelo já existente nomenclaturas, bibliotecas, estrutura
  • 58. regra 2: contato com código respeite os desenvolvedores que estão ou que passaram pelo projeto
  • 59. regra 3: em quem não confiar? em sistemas de deploy analise as etapas, dependências e refine-o removendo passos personalizados
  • 60. regra 4: em quem não confiar? apenas nas especificações documentos facilmente estão desatualizados
  • 61. regra 5: em quem não confiar? apenas no código e testes eles estão atendendo ao propósito?
  • 62. regra 6: feedbacks rápidosfaça deploy, execute e teste-o! Mais de uma vez quanto tempo você gasta?
  • 63. regra 7: feedbacks rápidos crie falhas! veja o quão tolerante é o seu sistema
  • 64. regra 8: feedbacks rápidoscrie um ambiente de testes não fique no escuro e porque não integração contínua?
  • 65. regra 9: feedbacks rápidos prove que suas mudanças funcionaram Tudo continua funcionando Nova funcionalidade está ok
  • 66. regra 9: feedbacks rápidos prove que suas mudanças funcionaram Tudo continua funcionando Nova funcionalidade está okComo?
  • 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. regra 10: manter a ordem evite inserir comentários deixe o código falar pro si
  • 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. 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. regra 11: manter a ordemremova códigos comentados se é velho ou desnecessário porque está aqui?
  • 72. regra 12: manter a ordemsempre que puder, remova excessos de acoplamento o ideal é ter um ponto de mudança
  • 73. mas lembre-se
  • 74. o código de que acabou de criar já é legado
  • 75. escreva código fácil de ser modificado
  • 76. faça pair programming sempre que puder
  • 77. aprenda com o códigolegado como codificar melhor
  • 78. Marcos Sousafalecomigo@marcossousa.com @marcos_sousa