Codifique melhor    Marcos Sousa   @marcos_sousa
about.me
afinal, o nosso objetivo é
+
valorize seu cliente
conheça o negócio
o importante é osoftware em operação
com feedbacks curtos
É fácil encontrar alguma coisa aí?
tenha como objetivo
organizar e mater organizado
código deve ser legível
analogia: software    com livro
classes são capítulos
os capítulos (aka classes)  devem ser concisos
parágrafos (métodos)   interconectadas
as informações (nomes devariáveis/metodos/classes)     claras e objetivas
vamos à prática
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
public boolean finalizar(AditivoContato aditivo) {    if ((aditivo.getValor() > aditivo.getContrato().getValor() * 0.30   ...
passo-a-passo
public boolean finalizar(AditivoContato aditivo) {    if (aditivo.isValorPermitidoOuAprovado()        && aditivo.getValor(...
public boolean finalizar(AditivoContato aditivo) {    if (aditivo.isValorPermitidoOuAprovado()        && aditivo.getValor(...
public boolean isValorPermitidoOuAprovado() {   return isValorPermitidoSemAprovacao() ||hasAprovacaoGerente();}private boo...
public boolean isValorPermitidoOuAprovado() {   return isValorPermitidoSemAprovacao() ||hasAprovacaoGerente();}private boo...
... e o resultado é
public boolean finalizar(AditivoContato aditivo) {   return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repositor...
public boolean finalizar(AditivoContato aditivo) {   return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repositor...
public boolean finalizar(AditivoContato aditivo) {   return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repositor...
public boolean finalizar(AditivoContato aditivo) {   return aditivo.podeFinalizar() &&hasSaldoAditivo(aditivo) &&repositor...
métodos pequenos          =Sigle Responsability      Principle
... mas nem sempre sobra          tempo
e por onde começar?
e vença uma batalha por vez
jamais tenha recaídas
tendo sempre em mente
...eis o dilema preciso de testes para refatorar. Mas para tertestes preciso refatorar!
sintoma de alto      acoplamentovisível quando tentamos  testar partes isoladas
Quando fazer um  refactoring?
Quando fazer um       refactoring?✓Inclusão de novas funcionalidades
Quando fazer um       refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs
Quando fazer um       refactoring?✓Inclusão de novas funcionalidades✓Correção de bugs✓Revisão do código
algorítimo do refactoring
identificar pontos de      mudanças
identificar cenários de        testes
eliminar dependências
fazer as mundanças
e refatore
mas lembre-se!o bom é inimigo do ótimo                      Voltaire
...para atingir o objetivo✓Faça mudanças necessárias✓Não quebre funcionalidade✓E melhore o design do código
regra 1: contato com código  siga o modelo já existente             nomenclaturas, bibliotecas, estrutura
regra 2: contato com código respeite os desenvolvedores           que estão ou que passaram pelo projeto
regra 3: em quem não confiar?      em sistemas de deploy   analise as etapas, dependências e refine-o removendo passos      ...
regra 4: em quem não confiar?   apenas nas especificações         documentos facilmente estão desatualizados
regra 5: em quem não confiar?   apenas no código e testes              eles estão atendendo ao propósito?
regra 6: feedbacks rápidosfaça deploy, execute e teste-o!       Mais de uma vez                  quanto tempo você gasta?
regra 7: feedbacks rápidos        crie falhas!           veja o quão tolerante é o seu sistema
regra 8: feedbacks rápidoscrie um ambiente de testes   não fique no escuro e porque não integração contínua?
regra 9: feedbacks rápidos prove que suas mudanças       funcionaram               Tudo continua funcionando              ...
regra 9: feedbacks rápidos prove que suas mudanças       funcionaram               Tudo continua funcionando              ...
regra 9: feedbacks rápidos    prove que suas mudanças          funcionaram                      Tudo continua funcionando ...
regra 10: manter a ordem evite inserir comentários                deixe o código falar pro si
código auto-explicativo// funcionários de contratação mensal que tenhacertificações e quetenham mais de 5 anos de carreira...
código auto-explicativo// funcionários de contratação mensal que tenhacertificações e quetenham mais de 5 anos de carreira...
regra 11: manter a ordemremova códigos comentados       se é velho ou desnecessário porque está aqui?
regra 12: manter a ordemsempre que puder, remova excessos de acoplamento          o ideal é ter um ponto de mudança
mas lembre-se
o código de que acabou  de criar já é legado
escreva código fácil de ser       modificado
faça pair programming  sempre que puder
aprenda com o códigolegado como codificar       melhor
Marcos Sousafalecomigo@marcossousa.com            @marcos_sousa
Codifique melhor
Codifique melhor
Codifique melhor
Codifique melhor
Próximos SlideShares
Carregando em…5
×

Codifique melhor

1.079 visualizações

Publicada em

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.

Publicada em: Tecnologia
  • Seja o primeiro a comentar

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

×