Refinamento e boas práticas de
              programação




Luiz Artur Botelho da Silva – labotelho@gmail.com
Pós-gradução Engenharia de Software - FBV
Engenheiro de Sistemas – C.E.S.A.R
Agenda

 Código Limpo;
 Como transformar um código ruim em
  um bom;
 Programação Geral;
Código Limpo
Qual o melhor caminho?
Dificuldades de se ter um
código limpo
  1.   Prazos apertados;
  2.   Pressa para lançar o produto no
       mercado;
  3.   Cronograma extenso.


“Uma bagunça que funciona é melhor
 do que nada.” (Robert C. Martin)
Custo de ter um código
confuso
Solução para produtividade:




Lei de Brooks: "Incluir mais gente em
um projeto atrasado vai atrasá-lo ainda
mais"
O que é código limpo?

“Um código limpo é simples e direto. Ele
 é tão bem legível quanto uma prosa bem
 escrita.“
                Fonte: Grady Booch,
                Autor do livro: Aplicações com design e análise
                orientado a objeto.
O que é código limpo?
 "Além do seu criador, um
 desenvolvedor pode ler e melhorar
 um código limpo.“

                   Fonte: Dave Thomas,
                   fundador da estratégia Eclipse.
Vantagens de ter o código
limpo
1.   Simplicidade;
2.   Clareza;
3.   Flexibilidade;
4.   Fácil manutenção;
5.   Boa performance;
6.   ...
Como se aprende a gerar
código limpo?
Não há uma metodologia especifica.

Solução:
1. Ler vários livros;

2. Aprender com a experiência dos
   outros.
Como transformar um
código ruim em um
bom
Nomes Significativos

   Código Ruim




   Código Bom
Nomes Significativos

   Código Ruim




   Código Bom
Nomes Significativos
   Código Ruim




                  Sugestão: Usar
                  fontes distintas com
                  propósito de realçar
                  mais as diferenças.
Nomes Significativos
   Código Ruim




                  Sugestão: Faça
                  distinção dos nomes.
Nomes Significativos
   Código Ruim




   Código Bom
Funções

 Devem ser pequenas (no máximo 20
  linhas);
 Devem fazer apenas uma coisa por
  função;
 Devem ter poucos parâmetros de
  entrada;
Funções (Vários Parâmetros)
   Código Ruim




   Código Bom
Funções

 Prefira exceções a retorno de códigos
  de erro;
 Evite repetição de código;

 Manter blocos e indentação (no
  máximo em 2 níveis);
Construtores (Vários Parâmetros)

 Uso do padrão construtor telescópio;
 Uso do padrão javaBeans;

 Uso de objeto criador;
Construtores (Vários Parâmetros)
   Código Ruim




Criando uma instância da classe acima:
Uso do padrão construtor
    telescópio
   Código Bom




Criando uma instância da classe acima:
Desvantagens

 O leitor é tentado a entender todos os
  parâmetros;
 Longa seqüência de parâmetros
  digitadas pode causar erros;
Uso do padrão javaBeans
   Código Bom




Criando uma instância da classe acima:
Desvantagens

 Um javaBean pode iniciar já em um
  estado inconsistente;
 O padrão javaBean impossibilita que
  uma classe seja imutável;
Uso de objeto criador
   Código Bom
Uso de objeto criador
   Criando uma instância default de um objeto criador:




   Criando uma instância setando parâmetros opcionais em
    um objeto criador:
Uso de objeto criador

 Garante a consistência dos dados
  conforme o padrão de construtor
  telescópio;
 Garante a legibilidade do padrão
  javaBeans;
Comentários

 Não usar comentários Javadocs para
  métodos privados;
 Evitar comentários excessivos;

 Marcar com comentário ToDo no código
  possíveis pontos de modificação;
Comentários

 Alertar sobre conseqüências;
 Comentários informativos sobre o
  funcionamento da função;
 Evitar comentários redundantes;

 Sempre colocar o comentário junto ao
  código que ele descreve;
Objetos
 Evite a criação de objetos
  desnecessários;
 Prefira primitivas simples a primitivas
  encaixotadas;
 Elimine referências de objetos
  obsoletas;
 Evite finalizadores;
Evite a criação de objetos
    desnecessários;
   Código Ruim




   Código Bom
Evite a criação de objetos
    desnecessários;
   Código Ruim       Código Bom
Evite a criação de objetos
desnecessários;
    Vantagens:
    1.   Reutilização do objeto em outros
         pontos do código;
    2.   Reutilizar um objeto é mais rápido
         que criar um novo;
    Desvantagem:
    1.   Objeto pode nunca está pronto para
         ser coletado;
Diferença entre primitivas
     simples e encaixotadas
   Primitivas simples:          Primitivas encaixotadas:
    1.  Possui apenas os          1.  Possui identidade e seus
        seus valores;                 valores, ou seja, 2
    2.  Mas eficiente;                instancias desse tipo
    3.  Possui apenas                 podem ter o mesmo valor
        valores funcionais;           com instancias diferentes;
        Ex.: int i = 2;           2.  Menos eficiente;
                                  3.  Pode ter tanto valores
                                      funcionais quanto não
                                      funcionais;
                                      Ex.: Integer i = 2; OU
                                           Integer i = null;
Prefira primitivas simples a
    primitivas encaixotadas
   O que acontece com a saída desse
    código?
Prefira primitivas simples a
    primitivas encaixotadas
   Código Ruim




   Código Bom
Quem é mais rápido?

   Código Ruim




   Código Bom
Resposta:

   Mudar Long para long na declaração de
    sum reduz o tempo de execução de 43
    segundos para 6,8 segundos.




                     Máquina AMD Opteron
                     170 dual-core de 2,2
                     GHz e 2 GB de RAM
Elimine referências de
     objetos obsoletas
   Código Ruim
Elimine referências de
     objetos obsoletas
   Código Bom
Atenção!

   Problemas de OutOfMemoryError
    podem ser provocados caso não se
    elimine as referências obsoletas;
Evite finalizadores

   Código Ruim
Evite finalizadores

 Finalizadores são imprevisíveis e com
  isso não se sabe a hora que eles
  serão executados;
 Finalizadores provocam perda de
  desempenho;
Evite finalizadores



                       Conclusão: A inclusão de um
                       finalizador aumenta o tempo para
                       2400 ns, deixando o processo de
                       criação e destruição de objetos
                       430 vezes mais lento.


Máquina AMD Opteron
170 dual-core de 2,2
GHz e 2 GB de RAM
Programação Geral
Programação Geral

 Reduza o escopo de variáveis locais,
  ou seja, declare ela apenas onde for
  usada;
 Prefira loops for a loops while;
Programação Geral

 Evite float e double a respostas
  exatas;
 Cuidado com o desempenho da
  concatenação de strings;
Prefira loops for a loops
    while
   Código Ruim
Prefira loops for a loops
while
   Com loop “for” não há motivo para o uso de
    nomes de variáveis diferentes nos dois
    loops;
   A variável alocada no loop “for” é liberada
    logo após terminar o seu delimitador de
    escopo;

   Obs.: Tanto o loop “for” quanto o loop
    “while” apresentam o mesmo desempenho.
     Fonte: http://stackoverflow.com/questions/1165457/java-for-loop-vs-while-loop-performance-difference
Prefira loops for a loops
      while




Usando o comando “javap” podemos ver que os 2 loops
são convertidos para o mesmo código interpretado pela
JVM.
Cuidado com o desempenho
    da concatenação de strings
   Código Ruim
Cuidado com o desempenho
    da concatenação de strings
   Código Bom
Dúvidas
Referências Bibliográficas

          ROBERT C. MARTIN.
           Código Limpo:
           habilidades práticas do
           Agile Software, Alta
           Books, 2011.
Referências Bibliográficas

           Joshua Bloch. Java
            Efetivo, 2ª Edição, Alta
            Books 2010.

Refinamento e boas práticas de programação

  • 1.
    Refinamento e boaspráticas de programação Luiz Artur Botelho da Silva – labotelho@gmail.com Pós-gradução Engenharia de Software - FBV Engenheiro de Sistemas – C.E.S.A.R
  • 2.
    Agenda  Código Limpo; Como transformar um código ruim em um bom;  Programação Geral;
  • 3.
  • 4.
    Qual o melhorcaminho?
  • 5.
    Dificuldades de seter um código limpo 1. Prazos apertados; 2. Pressa para lançar o produto no mercado; 3. Cronograma extenso. “Uma bagunça que funciona é melhor do que nada.” (Robert C. Martin)
  • 6.
    Custo de terum código confuso
  • 7.
    Solução para produtividade: Leide Brooks: "Incluir mais gente em um projeto atrasado vai atrasá-lo ainda mais"
  • 8.
    O que écódigo limpo? “Um código limpo é simples e direto. Ele é tão bem legível quanto uma prosa bem escrita.“ Fonte: Grady Booch, Autor do livro: Aplicações com design e análise orientado a objeto.
  • 9.
    O que écódigo limpo? "Além do seu criador, um desenvolvedor pode ler e melhorar um código limpo.“ Fonte: Dave Thomas, fundador da estratégia Eclipse.
  • 10.
    Vantagens de tero código limpo 1. Simplicidade; 2. Clareza; 3. Flexibilidade; 4. Fácil manutenção; 5. Boa performance; 6. ...
  • 11.
    Como se aprendea gerar código limpo? Não há uma metodologia especifica. Solução: 1. Ler vários livros; 2. Aprender com a experiência dos outros.
  • 12.
  • 13.
    Nomes Significativos  Código Ruim  Código Bom
  • 14.
    Nomes Significativos  Código Ruim  Código Bom
  • 15.
    Nomes Significativos  Código Ruim Sugestão: Usar fontes distintas com propósito de realçar mais as diferenças.
  • 16.
    Nomes Significativos  Código Ruim Sugestão: Faça distinção dos nomes.
  • 17.
    Nomes Significativos  Código Ruim  Código Bom
  • 18.
    Funções  Devem serpequenas (no máximo 20 linhas);  Devem fazer apenas uma coisa por função;  Devem ter poucos parâmetros de entrada;
  • 19.
    Funções (Vários Parâmetros)  Código Ruim  Código Bom
  • 20.
    Funções  Prefira exceçõesa retorno de códigos de erro;  Evite repetição de código;  Manter blocos e indentação (no máximo em 2 níveis);
  • 21.
    Construtores (Vários Parâmetros) Uso do padrão construtor telescópio;  Uso do padrão javaBeans;  Uso de objeto criador;
  • 22.
    Construtores (Vários Parâmetros)  Código Ruim Criando uma instância da classe acima:
  • 23.
    Uso do padrãoconstrutor telescópio  Código Bom Criando uma instância da classe acima:
  • 24.
    Desvantagens  O leitoré tentado a entender todos os parâmetros;  Longa seqüência de parâmetros digitadas pode causar erros;
  • 25.
    Uso do padrãojavaBeans  Código Bom Criando uma instância da classe acima:
  • 26.
    Desvantagens  Um javaBeanpode iniciar já em um estado inconsistente;  O padrão javaBean impossibilita que uma classe seja imutável;
  • 27.
    Uso de objetocriador  Código Bom
  • 28.
    Uso de objetocriador  Criando uma instância default de um objeto criador:  Criando uma instância setando parâmetros opcionais em um objeto criador:
  • 29.
    Uso de objetocriador  Garante a consistência dos dados conforme o padrão de construtor telescópio;  Garante a legibilidade do padrão javaBeans;
  • 30.
    Comentários  Não usarcomentários Javadocs para métodos privados;  Evitar comentários excessivos;  Marcar com comentário ToDo no código possíveis pontos de modificação;
  • 31.
    Comentários  Alertar sobreconseqüências;  Comentários informativos sobre o funcionamento da função;  Evitar comentários redundantes;  Sempre colocar o comentário junto ao código que ele descreve;
  • 32.
    Objetos  Evite acriação de objetos desnecessários;  Prefira primitivas simples a primitivas encaixotadas;  Elimine referências de objetos obsoletas;  Evite finalizadores;
  • 33.
    Evite a criaçãode objetos desnecessários;  Código Ruim  Código Bom
  • 34.
    Evite a criaçãode objetos desnecessários;  Código Ruim  Código Bom
  • 35.
    Evite a criaçãode objetos desnecessários;  Vantagens: 1. Reutilização do objeto em outros pontos do código; 2. Reutilizar um objeto é mais rápido que criar um novo;  Desvantagem: 1. Objeto pode nunca está pronto para ser coletado;
  • 36.
    Diferença entre primitivas simples e encaixotadas  Primitivas simples:  Primitivas encaixotadas: 1. Possui apenas os 1. Possui identidade e seus seus valores; valores, ou seja, 2 2. Mas eficiente; instancias desse tipo 3. Possui apenas podem ter o mesmo valor valores funcionais; com instancias diferentes; Ex.: int i = 2; 2. Menos eficiente; 3. Pode ter tanto valores funcionais quanto não funcionais; Ex.: Integer i = 2; OU Integer i = null;
  • 37.
    Prefira primitivas simplesa primitivas encaixotadas  O que acontece com a saída desse código?
  • 38.
    Prefira primitivas simplesa primitivas encaixotadas  Código Ruim  Código Bom
  • 39.
    Quem é maisrápido?  Código Ruim  Código Bom
  • 40.
    Resposta:  Mudar Long para long na declaração de sum reduz o tempo de execução de 43 segundos para 6,8 segundos. Máquina AMD Opteron 170 dual-core de 2,2 GHz e 2 GB de RAM
  • 41.
    Elimine referências de objetos obsoletas  Código Ruim
  • 42.
    Elimine referências de objetos obsoletas  Código Bom
  • 43.
    Atenção!  Problemas de OutOfMemoryError podem ser provocados caso não se elimine as referências obsoletas;
  • 44.
  • 45.
    Evite finalizadores  Finalizadoressão imprevisíveis e com isso não se sabe a hora que eles serão executados;  Finalizadores provocam perda de desempenho;
  • 46.
    Evite finalizadores Conclusão: A inclusão de um finalizador aumenta o tempo para 2400 ns, deixando o processo de criação e destruição de objetos 430 vezes mais lento. Máquina AMD Opteron 170 dual-core de 2,2 GHz e 2 GB de RAM
  • 47.
  • 48.
    Programação Geral  Reduzao escopo de variáveis locais, ou seja, declare ela apenas onde for usada;  Prefira loops for a loops while;
  • 49.
    Programação Geral  Evitefloat e double a respostas exatas;  Cuidado com o desempenho da concatenação de strings;
  • 50.
    Prefira loops fora loops while  Código Ruim
  • 51.
    Prefira loops fora loops while  Com loop “for” não há motivo para o uso de nomes de variáveis diferentes nos dois loops;  A variável alocada no loop “for” é liberada logo após terminar o seu delimitador de escopo;  Obs.: Tanto o loop “for” quanto o loop “while” apresentam o mesmo desempenho. Fonte: http://stackoverflow.com/questions/1165457/java-for-loop-vs-while-loop-performance-difference
  • 52.
    Prefira loops fora loops while Usando o comando “javap” podemos ver que os 2 loops são convertidos para o mesmo código interpretado pela JVM.
  • 53.
    Cuidado com odesempenho da concatenação de strings  Código Ruim
  • 54.
    Cuidado com odesempenho da concatenação de strings  Código Bom
  • 55.
  • 56.
    Referências Bibliográficas  ROBERT C. MARTIN. Código Limpo: habilidades práticas do Agile Software, Alta Books, 2011.
  • 57.
    Referências Bibliográficas  Joshua Bloch. Java Efetivo, 2ª Edição, Alta Books 2010.