SlideShare une entreprise Scribd logo
1  sur  82
Codifique melhor
    Marcos Sousa
   @marcos_sousa
about.me
afinal, o nosso objetivo é
+
valorize seu cliente
conheça o negócio
o importante é o
software 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 de
variáveis/metodos/classes)
     claras e objetivas
vamos à prática
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;
    }
}
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?
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;
    }
}
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
}
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
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
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
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
passo-a-passo
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.30
public static float FLAG_APROVACAO_GERENTE = ‘S’
public boolean isValorPermitidoOuAprovado() {
  return (aditivo.getValor() >
  aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO)
  && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE;
}
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.30
public static float FLAG_APROVACAO_GERENTE = ‘S’
public boolean isValorPermitidoOuAprovado() {
  return (aditivo.getValor() >
  aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO)
  && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE;
}
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;
}
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
... e o resultado é
public boolean finalizar(AditivoContato aditivo) {
   return aditivo.podeFinalizar() &&
hasSaldoAditivo(aditivo) &&
repository.salvo(aditivo.finalizado()));
}
public boolean finalizar(AditivoContato aditivo) {
   return aditivo.podeFinalizar() &&
hasSaldoAditivo(aditivo) &&
repository.salvo(aditivo.finalizado()));
}

        Realizando apenas uma operção :)
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
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
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 ter
testes preciso refatorar!
sintoma de alto
      acoplamento

visí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
                                                personalizados
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ápidos

faç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ápidos

crie 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
              Nova funcionalidade está ok
regra 9: feedbacks rápidos

 prove que suas mudanças
       funcionaram
               Tudo continua funcionando
              Nova funcionalidade está ok
Como?
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
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 tenha
certificações e que
tenham mais de 5 anos de carreira ganham 5%
if (tipoContratacao() == “mensal” || certificacoes > 0 &&
getTotalEmAnosContratado() > 5) {
  bonus = 0.05;
}
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())
regra 11: manter a ordem

remova códigos comentados
       se é velho ou desnecessário porque está aqui?
regra 12: manter a ordem

sempre 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ódigo
legado como codificar
       melhor
Marcos Sousa
falecomigo@marcossousa.com
            @marcos_sousa

Contenu connexe

En vedette

Como se lleva la información desde el ADN hasta la proteína.
Como se lleva la información desde el ADN hasta la proteína.Como se lleva la información desde el ADN hasta la proteína.
Como se lleva la información desde el ADN hasta la proteína.samiraanuel
 
Hip hop español
Hip hop españolHip hop español
Hip hop españolCaarolaVC
 
Lista do pagamento FGTS
Lista do pagamento FGTSLista do pagamento FGTS
Lista do pagamento FGTSSINSMUJG
 

En vedette (8)

Como se lleva la información desde el ADN hasta la proteína.
Como se lleva la información desde el ADN hasta la proteína.Como se lleva la información desde el ADN hasta la proteína.
Como se lleva la información desde el ADN hasta la proteína.
 
Freetainers
FreetainersFreetainers
Freetainers
 
Amizade
AmizadeAmizade
Amizade
 
Como podemos-pensar470
Como podemos-pensar470Como podemos-pensar470
Como podemos-pensar470
 
Hip hop español
Hip hop españolHip hop español
Hip hop español
 
Uso de la v y b
Uso de la v y bUso de la v y b
Uso de la v y b
 
Paciência
PaciênciaPaciência
Paciência
 
Lista do pagamento FGTS
Lista do pagamento FGTSLista do pagamento FGTS
Lista do pagamento FGTS
 

Similaire à Codifique melhor

TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSFábio Miranda
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane FidelixCris Fidelix
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e CatchUilian Ries
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
"Pau que nasce torto ...". TDD e a qualidade de código.
"Pau que nasce torto ...". TDD e a qualidade de código."Pau que nasce torto ...". TDD e a qualidade de código.
"Pau que nasce torto ...". TDD e a qualidade de código.Juliano Santos
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003elliando dias
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Danilo Pereira De Luca
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraValberto Carneiro
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaVraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaKaio Valente
 
Fundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareFundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareÁlvaro Farias Pinheiro
 
Projeto Integrador 2
Projeto Integrador 2Projeto Integrador 2
Projeto Integrador 2r7c4rd0
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 

Similaire à Codifique melhor (20)

TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
Aula 3 - Java Prof.ª Cristiane Fidelix
Aula 3 -  Java Prof.ª Cristiane FidelixAula 3 -  Java Prof.ª Cristiane Fidelix
Aula 3 - Java Prof.ª Cristiane Fidelix
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
"Pau que nasce torto ...". TDD e a qualidade de código.
"Pau que nasce torto ...". TDD e a qualidade de código."Pau que nasce torto ...". TDD e a qualidade de código.
"Pau que nasce torto ...". TDD e a qualidade de código.
 
introdução a linguagem java-2003
introdução a linguagem java-2003introdução a linguagem java-2003
introdução a linguagem java-2003
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração segura
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Vraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em JavaVraptor - Alta produtividade no Desenvolvimento Web em Java
Vraptor - Alta produtividade no Desenvolvimento Web em Java
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
Refactoring
RefactoringRefactoring
Refactoring
 
Fundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de SoftwareFundamentos de Padrões de Projeto de Software
Fundamentos de Padrões de Projeto de Software
 
Projeto Integrador 2
Projeto Integrador 2Projeto Integrador 2
Projeto Integrador 2
 
Entendento Arquitetura MVI + Flow
Entendento Arquitetura MVI + FlowEntendento Arquitetura MVI + Flow
Entendento Arquitetura MVI + Flow
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 

Codifique melhor

  • 1. Codifique melhor Marcos Sousa @marcos_sousa
  • 3.
  • 4. afinal, o nosso objetivo é
  • 5.
  • 6. +
  • 9. o importante é o software em operação
  • 11. É fácil encontrar alguma coisa aí?
  • 13. organizar e mater organizado
  • 14. código deve ser legível
  • 15. analogia: software com livro
  • 17. os capítulos (aka classes) devem ser concisos
  • 18. parágrafos (métodos) interconectadas
  • 19. as informações (nomes de variáveis/metodos/classes) claras e objetivas
  • 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; } } Quantas operações são realizadas neste método?
  • 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; } }
  • 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
  • 30. 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.30 public static float FLAG_APROVACAO_GERENTE = ‘S’ public boolean isValorPermitidoOuAprovado() { return (aditivo.getValor() > aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO) && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE; }
  • 31. 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.30 public static float FLAG_APROVACAO_GERENTE = ‘S’ public boolean isValorPermitidoOuAprovado() { return (aditivo.getValor() > aditivo.getContrato().getValor() * MAXIMO_PERMITIDO_SEM_APROVACAO) && aditivo.getAprovacaoGerente() == FLAG_APROVACAO_GERENTE; }
  • 32. 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; }
  • 33. 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
  • 34. ... e o resultado é
  • 35. public boolean finalizar(AditivoContato aditivo) { return aditivo.podeFinalizar() && hasSaldoAditivo(aditivo) && repository.salvo(aditivo.finalizado())); }
  • 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
  • 39. métodos pequenos = Sigle Responsability Principle
  • 40. ... mas nem sempre sobra tempo
  • 41. e por onde começar?
  • 42.
  • 43. e vença uma batalha por vez
  • 46. ...eis o dilema preciso de testes para refatorar. Mas para ter testes preciso refatorar!
  • 47. sintoma de alto acoplamento visível quando tentamos testar partes isoladas
  • 48. Quando fazer um refactoring?
  • 49. Quando fazer um refactoring? ✓Inclusão de novas funcionalidades
  • 50. Quando fazer um refactoring? ✓Inclusão de novas funcionalidades ✓Correção de bugs
  • 51. Quando fazer um refactoring? ✓Inclusão de novas funcionalidades ✓Correção de bugs ✓Revisão do código
  • 56.
  • 59. mas lembre-se! o bom é inimigo do ótimo Voltaire
  • 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
  • 78. o código de que acabou de criar já é legado
  • 79. escreva código fácil de ser modificado
  • 80. faça pair programming sempre que puder
  • 81. aprenda com o código legado como codificar melhor

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n