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.
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
}
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 aditivo
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 aditivo
3 - atualiza status e calcula novo valor do
contrato
27. 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
3 - atualiza status e calcula novo valor do
contrato
4 - Define novo status
28. 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
3 - atualiza status e calcula novo valor do
contrato
4 - Define novo status
5 - Responde a resquisição
36. public boolean finalizar(AditivoContato aditivo) {
return aditivo.podeFinalizar() &&
hasSaldoAditivo(aditivo) &&
repository.salvo(aditivo.finalizado()));
}
Realizando apenas uma operção :)
37. 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
38. 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
60. ...para atingir o objetivo
✓Faça mudanças necessárias
✓Não quebre funcionalidade
✓E melhore o design do código
61. regra 1: contato com código
siga o modelo já existente
nomenclaturas, bibliotecas, estrutura
62. regra 2: contato com código
respeite os desenvolvedores
que estão ou que passaram pelo projeto
63. regra 3: em quem não confiar?
em sistemas de deploy
analise as etapas, dependências e refine-o removendo passos
personalizados
64. regra 4: em quem não confiar?
apenas nas especificações
documentos facilmente estão desatualizados
65. regra 5: em quem não confiar?
apenas no código e testes
eles estão atendendo ao propósito?
66. regra 6: feedbacks rápidos
faça deploy, execute e teste-o!
Mais de uma vez
quanto tempo você gasta?
67. regra 7: feedbacks rápidos
crie falhas!
veja o quão tolerante é o seu sistema
68. regra 8: feedbacks rápidos
crie um ambiente de testes
não fique no escuro e porque não integração contínua?
69. regra 9: feedbacks rápidos
prove que suas mudanças
funcionaram
Tudo continua funcionando
Nova funcionalidade está ok
70. regra 9: feedbacks rápidos
prove que suas mudanças
funcionaram
Tudo continua funcionando
Nova funcionalidade está ok
Como?
71. 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
72. regra 10: manter a ordem
evite inserir comentários
deixe o código falar pro si
73. código auto-explicativo
// funcionários de contratação mensal que tenha
certificações e que
tenham mais de 5 anos de carreira ganham 5%
if (tipoContratacao() == “mensal” || certificacoes > 0 &&
getTotalEmAnosContratado() > 5) {
bonus = 0.05;
}
74. código auto-explicativo
// funcionários de contratação mensal que tenha
certificações e que
tenham mais de 5 anos de carreira ganham 5%
if (tipoContratacao() == “mensal” || certificacoes > 0 &&
getTotalEmAnosContratado() > 5) {
bonus = 0.05;
}
Que tal isso?
if (possuiCriteriosParaBonus())
75. regra 11: manter a ordem
remova códigos comentados
se é velho ou desnecessário porque está aqui?
76. regra 12: manter a ordem
sempre que puder, remova
excessos de acoplamento
o ideal é ter um ponto de mudança