SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
Refatoração e Boas Práticas 
no Desenvolvimento de 
Software com Java



         Márcio Torres
Agenda

●
    Apresentação
●
    Introdução
●
    Mãos a obra!
●
    Bibliografia
Apresentação
“Quem é Márcio Torres?”


●
    Primeiro contato com um computador na década de 
    90, um CP 500 com Basic embedded;
●
    Desenvolvedor dBase e Clipper;
●
    Instrutor de Informática na Degraus;
●
    Suporte e Manutenção;
●
    Instrutor de Informática no Senac;
●
    Desenvolvedor Java;
●
    Professor no IFRS nos cursos técnico e tecnólogo;
Introdução                                            ●   Práticas transversais:
O que veremos e por que é importante?                     ●   Fazendo um bom design;
●   Conversaremos sobre:                                  ●   Aderir a convenções;
    ●   Boas práticas lidando com: Strings,               ●   Seguir princípios de design 
        Números, Coleções;                                    orientado a objetos;
    ●   Como lidar com: Nulos, Exceções, 
        Passagem de parâmetros;
    ●   Problemas típicos de domínio, assinaturas 
        de métodos;
    ●   Como melhorar o código aplicando 
        refatorações;
●   É importante por que:
    ●   Torna a aplicação mais resistente a falhas;
    ●   Deixa o código mais fácil de ler;
    ●   A aplicação fica mais robusta e rápida;
    ●   O mercado busca bons profissionais;
É sobre requisitos não funcionais ...

Performance
                                          Extensibilidade


              Responsividade
                                                            Manutenibilidade

                               Robustez


      Legibilidade
                                                    Confiabilidade



                                   Testabilidade



… e qualidade interna.
Mãos a obra


●
    Exemplos práticos, com 
    embasamento técnico e/ou 
    bibliográfico;
Lidando com Strings ...
Como instanciar Strings
String q = new String("sim");                      As instâncias de Strings literais 
                                                   são armazenadas em um espaço 
if (q == "sim") {
                                                   de memória chamado Permanent 
     System.out.println("SIM!!!");
                                                   Generation. Elas são reusadas, 
} else {                                           com a exceção de quando é 
     System.out.println("NÃO??!! COMO NÃO?!!");    usado o operador new, que por 
                                                   consequência cria dois objetos.
}



                                      String q = "sim";
    O operador == compara 
    igualdade da variável, não        if ("sim".equals(q)) {

    dos objetos. Sempre use               System.out.println("SIM!!!");
    equals, e prefira passar a        } else {
    variável como parâmetro 
                                          System.out.println("NÃO??!! COMO NÃO?!!");
    do equals.
                                      }


           Entenda como a memória é gerenciada na plataforma Java
Organização da memória na 
Máquina Virtual Java da Sun Oracle
Lidando com Strings ...
Como concatenar Strings
String nomes = “Nomes: “;

for (int i = 1; i < 1000000; i++) {
                                                 Use StringBuilder para 
                                                 concatenar muitas Strings, é mais 
    nomes = nomes + “, “ + getNome();
                                                 rápido e usa menos memória
}



Cada resultado com 
o operador + gera 
uma nova String             StringBuilder nomes = new StringBuilder(“Nomes: “);

                            for (int i = 1; i < 1000000; i++) {

                                nomes.append(“, “).append(getNome());

                            }




          Conheça a API do Java, estude­a.
Lidando com Números ...
Como declarar membros numéricos           Tipos primitivos consomem 
class PlanoDesconto {                     menos memória, além de ter um 
     Double    rendaMinima;               footprint menor
     Double    rendaMaxima;
     Integer   idadeMinima;
     Integer   idadeMaxima;
                                                           class PlanoDesconto {

                                                               double rendaMinima;
Tipos primitivos reduzem a necessidade                         double rendaMaxima;
de boilerplate code                                            int idadeMinima;
                                                               int idadeMaxima;


public Double getValorMensalComDesconto() {
    double _valorMensal = valorMensal == null ? 0 : valorMensal;
    double _valorDesconto = valorDesconto == null ? 0 : valorDesconto;
    return _valorMensal - _valorDesconto;
}



Prefira tipos primitivos sempre que         public double getValorMensalComDesconto() {

possível, mas cuidado com o                     return valorMensal   - valorDesconto;

Primitive Obsession Antipattern!            }
Evitando NullPointerException's  ...
Escrevendo métodos seguros

public List<Foto> getFotos1(String ordem, final Integer direcao) {
    if (ordem.equals("descricao")) {
        Collections.sort(fotos, new Comparator<Foto>() {
             @Override
             public int compare(Foto o1, Foto o2) {
                 if (direcao == 1) {
                     return o1.getDescricao().compareTo(o2.getDescricao());
                 } else if (direcao == 2) {
                     return o2.getDescricao().compareTo(o1.getDescricao());
                 }
                 return 0;


public List<Foto> getFotos2(String ordem, final Integer direcao) {
    if ("descricao".equals(ordem)) {
        Collections.sort(fotos, new Comparator<Foto>() {
             @Override
             public int compare(Foto o1, Foto o2) {
                 if (new Integer(1).equals(direcao)) {
                     return o1.getDescricao().compareTo(o2.getDescricao());
                 } else if (new Integer(2).equals(direcao)) {
                     return o2.getDescricao().compareTo(o1.getDescricao());
                 }
                 return 0;

Evite NPE escrevendo métodos testados e seguros, pensando:
“E se o parâmetro vier nulo? E se o valor recebido não é tratado?”
Escrevendo métodos seguros e 
intuitivos ...                             public List<Foto> getFotos(Ordem ordem) {

                                               return getFotos(ordem, null);
 Sobrecarregue métodos ao invés 
                                           }
 de passar nulos para parâmetros 
 opcionais

public List<Foto> getFotos(Ordem ordem, final Direcao direcao) {

    if (Ordem.DESCRICAO.equals(ordem)) {
        Collections.sort(fotos, new Comparator<Foto>() {

            @Override
            public int compare(Foto o1, Foto o2) {

                if (Direcao.DESCENDENTE.equals(direcao)) {
                    return o2.getDescricao().compareTo(o1.getDescricao());
                }

                return o1.getDescricao().compareTo(o2.getDescricao());




Não use Strings onde outro tipo é mais adequado
Avalie definir um comportamento default para o caso de omissão …
Desenhe para que nulos não sejam passados como parâmetros ...
Escrevendo métodos legíveis ...
                                               class BadReportPreview {
Não parece melhor chamar o 
                                                   public void show(String dados,
preview na impressora assim:                                        boolean impressora) {
                                                       if (impressora) {
preview.show(dados, Destino.IMPRESSORA);
                                                           // mostra na impressora
                                                       } else {
Do que assim:                                              // mostra no monitor
                                                       }
preview.show(dados, true);                         }

                                               }

                   class GoodReportPreview {

Avalie usar             public enum Destino {
                            TELA, IMPRESSORA;
enumerados              }
para passar             public void show(String dados, Destino destino) {
no método                   if (Destino.TELA.equals(destino)) {
                                // mostra na tela
ao invés de                 } else if (Destino.IMPRESSORA.equals(destino)) {
boleanos ...                    // mostra na impressora
                            } else {
                                throw new
                                     IllegalArgumentException("Destino nao foi informado");
                            }
                        }

                   }
Convenções para métodos ...
Entendendo algumas convenções
public void ordernarPorTitulo(List<Livro> livros) {
    Collections.sort(livros, new Comparator<Livro>() {
        @Override
        public int compare(Livro o1, Livro o2) {
             return o1.getTitulo().compareTo(o2.getTitulo());
        }
    });
}


public List<Livro> ordernarPorTitulo(List<Livro> livros) {
    List<Livro> copia = new ArrayList<Livro>(livros);
    Collections.sort(copia, new Comparator<Livro>() {
        @Override
        public int compare(Livro o1, Livro o2) {
             return o1.getTitulo().compareTo(o2.getTitulo());
        }
    });
    return copia;
}


Métodos tem retorno quando retornam uma nova instância ...
Se o método altera a instância parametrizada use void …
Cuidado com os métodos que trazem efeitos colaterais, isto é, alteram a 
instância parametrizada  ...
Lidando com coleções ...
Implementado os métodos necessários ...
class Foto {
    ...

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        Foto other = (Foto) obj;
        if (id != other.id) return false;
        return true;
    }


Sempre sobrescreva equals e hashCode nas classes em que suas instâncias 
participarão de coleções, especialmente baseadas em Hash.
Siga o contrato. Lembre: objetos considerados iguais devem ter o mesmo 
hashCode.
Lidando com coleções ...
Devolva listas vazias invés de nulo. Isto fará com que o cliente de sua API não 
tenha que escrever qualquer boilerplate code;

for (Livro livro : livros) {

    if (livro.getKeywords() != null && livro.getKeywords().contains(k)) {
        count++;
    }

}


for (Livro livro : livros) {

    if (livro.getKeywords().contains(k)) {
        count++;
    }

}


É possível instanciar coleções na criação da classe, que tem uma performance 
pior. Se quiser melhorar a performance pode fazer Lazy Initialization ou atuar 
como delegado da coleção (melhor aproximação);
Lidando com exceções ...
Fazer um design com ou sem exceções ?
public Conta find(Integer id) {
    if (id == null) {
        throw new IllegalArgumentException("Id inválido",
             new NullPointerException("ID nulo"));
    }
    return contas.get(id);
}

                                               public Conta find(Integer id) {
                                                   if (id == null) return null;
                                                   return contas.get(id);
                                               }

public Conta load(Integer id) throws RegistroNaoEncontradoException {
    if (id == null) throw new RegistroNaoEncontradoException("ID nulo");
    Conta c = contas.get(id);
    if (c == null) throw new RegistroNaoEncontradoException();
    return c;
}

Lance exceções só quando necessário, exceções diminuem a performance ...
Se for o caso, propague o stacktrace e documente bem …
Não ignore as exceções na hora de tratá­las...
Use Checked Exceptions para recuperáveis e Runtime Exceptions para falhas do 
sistema ...
Lidando com Three Valued Logic ...
A maldição herdada pelos SGBD's


for (Conta c : contas) {
    if (c.isEspecial() != null && c.isEspecial()) {
        contasEspeciais++;
    }
}


for (Conta c : contas) {
    if (c.isEspecial()) {
        contasEspeciais++;
    }
}




Reduza a necessidade de Boiler Plate Code …
Use primitivos, ou trate na classe …
Pense qual é o valor por omissão ...
Refatorações ...
Detectar mau cheiro no código …
Melhorar a qualidade do código …
Não alterar o comportamento ...

                                   Alguns maus cheiros:
                                   Cadeias de mensagens ...
                                   Campo temporário ...
                                   Classes, métodos grandes ...
                                   Método Longo ...
                                   Lista longa de parâmetros ...
Alguns técnicas de refatoração:
Extrair método;
Extrair classe;.
Renomear método;
Renomear atributo;
Objeto parâmetro;
Usar fábrica ao invés de construtor;
Usar constante ao invés de número mágico;
Renomeando métodos e atributos ...
Use nomes expressivos ...

for (Conta c : c1) {
    if ( ! c2.contains(c1)) {
        webService.envComAval(c1);
    }
}


                  for (Conta contaNaBase : contasNaBaseDados) {
                      if ( ! contasNoERP.contains(contaNaBase)) {
                          webService.enviaContaParaComissaoAvaliadora(contaNaBase);
                      }
                  }


Sempre que for adicionar um comentário, pergunte­se:
“Como posso melhorar o código ao ponto deste comentário não ser 
mais necessário?”
Conta c = new Conta();       Conta c = new Conta();       Conta c = new Conta();
c.numero = 66410;            c.numero = 66410;            c.numero = 66410;
c.tipo = 1;                  c.tipo = Conta.FISICA;       c.tipo = TipoConta.FISICA;




           Não use magic numbers, prefira enumerados ...
Extrair método ...
Evite métodos muito longos ...
public static void processaContas() {
    ContaRepository contaRepository = new ContaRepository();
    List<Conta> c1 = contaRepository.findContas();

    Collections.sort(c1, new Comparator<Conta>() {
        @Override
        public int compare(Conta o1, Conta o2) {
            if (o1.numero > o2.numero) return 1;
            if (o2.numero < o1.numero) return -1;
            return 0;
        }
    });

    // ...


                public static void processaContas() {
                    ContaRepository contaRepository = new ContaRepository();
                    List<Conta> contas = contaRepository.findContas();

                     ordena(contas);

                     // ...




Divida funcionalidades usando métodos privados, de preferência reusáveis ...
Mais refatorações ...


●
    Usar fábrica ao invés de construtor ...
●
    Trocar número mágico por constante ...
●
    Introduzir variável explicativa ...
●
    Usar objeto parâmetro …
●
    E várias outras ...
Na primeira vez, apenas implemente, 
lide com as duplicações mais 
evidentes, mas na terceira vez que 
fizer algo semelhante, refatore! 
                             Martin Fowler
Bibliografia Recomendada
●   Estes livros estão entre os melhores na bibliografia para quem já 
    programa com Java (e outras linguagens) e deseja tornar­se um 
    desenvolvedor melhor.
http://www.refactoring.com/catalog/
http://c2.com/xp/CodeSmell.html
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
http://marciojrtorres.blogspot.com/




                                     marciojrtorres@gmail.com

Más contenido relacionado

La actualidad más candente

Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Natanael Fonseca
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02Natanael Fonseca
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosLeonardo Melo Santos
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...Manuel Menezes de Sequeira
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Mario Jorge Pereira
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasdiogoa21
 
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...Manuel Menezes de Sequeira
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaodiogoa21
 
mod2-mecanismos
mod2-mecanismosmod2-mecanismos
mod2-mecanismosdiogoa21
 
Algoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosAlgoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosMauro Pereira
 
Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Natanael Fonseca
 

La actualidad más candente (19)

Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02
 
Java11
Java11Java11
Java11
 
Java2
Java2Java2
Java2
 
Java8
Java8Java8
Java8
 
Java6
Java6Java6
Java6
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Aula5
Aula5Aula5
Aula5
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Curso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetosCurso de OO com C# - Parte 01 - Orientação a objetos
Curso de OO com C# - Parte 01 - Orientação a objetos
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
mod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicasmod5-estruturas-dadosdinamicas
mod5-estruturas-dadosdinamicas
 
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
 
mod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacaomod4-estruturas-dadosestaticas-ordenacao
mod4-estruturas-dadosestaticas-ordenacao
 
mod2-mecanismos
mod2-mecanismosmod2-mecanismos
mod2-mecanismos
 
Algoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmosAlgoritmos e lp parte 5-subalgoritmos
Algoritmos e lp parte 5-subalgoritmos
 
Java14
Java14Java14
Java14
 
Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04
 

Destacado

Reengenharia de Software
Reengenharia de SoftwareReengenharia de Software
Reengenharia de SoftwareRafael Berto
 
Engenharia Reversa e Reengenharia Software
Engenharia Reversa e Reengenharia SoftwareEngenharia Reversa e Reengenharia Software
Engenharia Reversa e Reengenharia Softwareelliando dias
 
Boa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java EnterpriseBoa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java EnterpriseOziel Moreira Neto
 
Agile Brazil 2013 - Resumo
Agile Brazil 2013 - ResumoAgile Brazil 2013 - Resumo
Agile Brazil 2013 - ResumoBruno Nardini
 
O uso dos porquês
O uso dos porquêsO uso dos porquês
O uso dos porquêsRebeca Kaus
 
Semanal fechada 6 ano
Semanal fechada 6 anoSemanal fechada 6 ano
Semanal fechada 6 anoRebeca Kaus
 
4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio
4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio
4 Tarefa Plano Aula Bullying Claudia Cunha O IgnacioFAETEC - ETESC
 
Introdução aos Servlets e JSPs
Introdução aos Servlets e JSPsIntrodução aos Servlets e JSPs
Introdução aos Servlets e JSPsLuiz Ricardo Silva
 
Viva jovem, venha conhecer!
Viva jovem, venha conhecer!Viva jovem, venha conhecer!
Viva jovem, venha conhecer!Rebeca Kaus
 
Padrões de Projeto em Aplicações Web
Padrões de Projeto em Aplicações WebPadrões de Projeto em Aplicações Web
Padrões de Projeto em Aplicações WebJonata Weber
 
Repaso semanal aberta 2 6 ano
Repaso semanal aberta 2 6 anoRepaso semanal aberta 2 6 ano
Repaso semanal aberta 2 6 anoRebeca Kaus
 
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresPrincípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresTchelinux
 
IBM Web Content Management - Melhores práticas
IBM Web Content Management - Melhores práticasIBM Web Content Management - Melhores práticas
IBM Web Content Management - Melhores práticasrodrigoareis
 
Programação estruturada com Java-Aula01
Programação estruturada com Java-Aula01Programação estruturada com Java-Aula01
Programação estruturada com Java-Aula01Elvis Araújo
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com JavaLuiz Ricardo Silva
 
No dumb questions (Stack Overflow em Português)
No dumb questions (Stack Overflow em Português)No dumb questions (Stack Overflow em Português)
No dumb questions (Stack Overflow em Português)Luiz Ricardo Silva
 
Aula diagramas de implementacao 3º periodo uniao
Aula diagramas de implementacao 3º periodo uniaoAula diagramas de implementacao 3º periodo uniao
Aula diagramas de implementacao 3º periodo uniaoMaria Alice Jovinski
 

Destacado (20)

Reengenharia de Software
Reengenharia de SoftwareReengenharia de Software
Reengenharia de Software
 
Engenharia Reversa e Reengenharia Software
Engenharia Reversa e Reengenharia SoftwareEngenharia Reversa e Reengenharia Software
Engenharia Reversa e Reengenharia Software
 
Boa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java EnterpriseBoa Práticas no Desenvolvimento Java Enterprise
Boa Práticas no Desenvolvimento Java Enterprise
 
Agile Brazil 2013 - Resumo
Agile Brazil 2013 - ResumoAgile Brazil 2013 - Resumo
Agile Brazil 2013 - Resumo
 
O uso dos porquês
O uso dos porquêsO uso dos porquês
O uso dos porquês
 
Semanal fechada 6 ano
Semanal fechada 6 anoSemanal fechada 6 ano
Semanal fechada 6 ano
 
4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio
4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio
4 Tarefa Plano Aula Bullying Claudia Cunha O Ignacio
 
Introdução aos Servlets e JSPs
Introdução aos Servlets e JSPsIntrodução aos Servlets e JSPs
Introdução aos Servlets e JSPs
 
Viva jovem, venha conhecer!
Viva jovem, venha conhecer!Viva jovem, venha conhecer!
Viva jovem, venha conhecer!
 
Certificações Java
Certificações JavaCertificações Java
Certificações Java
 
Roteiro 6 ano
Roteiro 6 anoRoteiro 6 ano
Roteiro 6 ano
 
Padrões de Projeto em Aplicações Web
Padrões de Projeto em Aplicações WebPadrões de Projeto em Aplicações Web
Padrões de Projeto em Aplicações Web
 
Repaso semanal aberta 2 6 ano
Repaso semanal aberta 2 6 anoRepaso semanal aberta 2 6 ano
Repaso semanal aberta 2 6 ano
 
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio TorresPrincípios de projeto e boas práticas de programação em Java - Márcio Torres
Princípios de projeto e boas práticas de programação em Java - Márcio Torres
 
IBM Web Content Management - Melhores práticas
IBM Web Content Management - Melhores práticasIBM Web Content Management - Melhores práticas
IBM Web Content Management - Melhores práticas
 
Programação estruturada com Java-Aula01
Programação estruturada com Java-Aula01Programação estruturada com Java-Aula01
Programação estruturada com Java-Aula01
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com Java
 
No dumb questions (Stack Overflow em Português)
No dumb questions (Stack Overflow em Português)No dumb questions (Stack Overflow em Português)
No dumb questions (Stack Overflow em Português)
 
Aula diagramas de implementacao 3º periodo uniao
Aula diagramas de implementacao 3º periodo uniaoAula diagramas de implementacao 3º periodo uniao
Aula diagramas de implementacao 3º periodo uniao
 
Pensando TDD
Pensando TDDPensando TDD
Pensando TDD
 

Similar a Java Refatoração Boas Práticas

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
 
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de ProgramaçãoManuel Menezes de Sequeira
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++thiagodp
 
TDD em C++
TDD em C++TDD em C++
TDD em C++thiagodp
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de SoftwareVagner Santana
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8Leonardo Neuwald
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8Cristian R. Silva
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Tchelinux
 

Similar a Java Refatoração Boas Práticas (20)

NHibernate
NHibernateNHibernate
NHibernate
 
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
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
 
Java annotation
Java annotationJava annotation
Java annotation
 
DOJO - TDD com C++
DOJO - TDD com C++DOJO - TDD com C++
DOJO - TDD com C++
 
TDD em C++
TDD em C++TDD em C++
TDD em C++
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de Software
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 
Programação funcional com java 8
Programação funcional com java 8Programação funcional com java 8
Programação funcional com java 8
 
Programação Funcional com Java 8
Programação Funcional com Java 8Programação Funcional com Java 8
Programação Funcional com Java 8
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Clean Code
Clean CodeClean Code
Clean Code
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 

Más de Tchelinux

Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...
Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...
Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...Tchelinux
 
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio Grande
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio GrandeInsegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio Grande
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio GrandeTchelinux
 
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...Tchelinux
 
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...Tchelinux
 
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio Grande
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio GrandeMe formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio Grande
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio GrandeTchelinux
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...Tchelinux
 
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...Tchelinux
 
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...Tchelinux
 
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...Tchelinux
 
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio Grande
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio GrandeConstruindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio Grande
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio GrandeTchelinux
 
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio Grande
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio GrandeBikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio Grande
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio GrandeTchelinux
 
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...Tchelinux
 
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...Tchelinux
 
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...Tchelinux
 
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019Tchelinux
 
Com que ônibus eu vou? Uma gentil introdução ao Python.
Com que ônibus eu vou? Uma gentil introdução ao Python.Com que ônibus eu vou? Uma gentil introdução ao Python.
Com que ônibus eu vou? Uma gentil introdução ao Python.Tchelinux
 
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.O TCC... um dia ele chega! (The beautiful and easy LaTeX way.
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.Tchelinux
 
Não deixe para testar depois o que você pode testar antes.
Não deixe para testar depois o que você pode testar antes. Não deixe para testar depois o que você pode testar antes.
Não deixe para testar depois o que você pode testar antes. Tchelinux
 
Desenvolvendo jogos com pygame
Desenvolvendo jogos com pygameDesenvolvendo jogos com pygame
Desenvolvendo jogos com pygameTchelinux
 
Essa câmera faz fotos muito boas, né?
Essa câmera faz fotos muito boas, né?Essa câmera faz fotos muito boas, né?
Essa câmera faz fotos muito boas, né?Tchelinux
 

Más de Tchelinux (20)

Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...
Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...
Do Zero ao YouTube em menos de 10 softwares livres - Vinícius Alves Hax - Tch...
 
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio Grande
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio GrandeInsegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio Grande
Insegurança na Internet - Diego Luiz Silva da Costa - Tchelinux 2019 Rio Grande
 
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...
Explorando Editores de Texto Open Source - Gabriel Prestes Ritta - Tchelinux ...
 
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...
Desenvolvendo Jogos com PyGame - Jerônimo Medina Madruga - Tchelinux 2019 Rio...
 
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio Grande
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio GrandeMe formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio Grande
Me formei. E agora? - Matheus Cezar - Tchelinux 2019 Rio Grande
 
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
APIs, REST e RESTful: O que os programadores precisam saber? - Marcos Echevar...
 
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...
Shell Script: Seu melhor amigo na automatização de instalações e configuraçõe...
 
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...
WebRTC: Comunicação aberta em tempo real - Nelson Dutra Junior - Tchelinux 20...
 
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...
Introdução à programação funcional com Clojure - Victor Hechel Colares - Tche...
 
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio Grande
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio GrandeConstruindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio Grande
Construindo um Data Warehouse - Vítor Resing Plentz - Tchelinux 2019 Rio Grande
 
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio Grande
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio GrandeBikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio Grande
Bikeshedding - Márcio Josué Ramos Torres - Tchelinux 2019 Rio Grande
 
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...
Produção de textos com Latex - Samuel Francisco Ferrigo - Tchelinux Caxias do...
 
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...
A tecnologia no futuro e nas mãos de quem ela estará - Jaqueline Trevizan, Ne...
 
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...
oVirt uma solução de virtualização distribuída opensource - Daniel Lara - Tch...
 
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019
Sistemas Embarcados e Buildroot - Renato Severo - Tchelinux Caxias do Sul 2019
 
Com que ônibus eu vou? Uma gentil introdução ao Python.
Com que ônibus eu vou? Uma gentil introdução ao Python.Com que ônibus eu vou? Uma gentil introdução ao Python.
Com que ônibus eu vou? Uma gentil introdução ao Python.
 
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.O TCC... um dia ele chega! (The beautiful and easy LaTeX way.
O TCC... um dia ele chega! (The beautiful and easy LaTeX way.
 
Não deixe para testar depois o que você pode testar antes.
Não deixe para testar depois o que você pode testar antes. Não deixe para testar depois o que você pode testar antes.
Não deixe para testar depois o que você pode testar antes.
 
Desenvolvendo jogos com pygame
Desenvolvendo jogos com pygameDesenvolvendo jogos com pygame
Desenvolvendo jogos com pygame
 
Essa câmera faz fotos muito boas, né?
Essa câmera faz fotos muito boas, né?Essa câmera faz fotos muito boas, né?
Essa câmera faz fotos muito boas, né?
 

Java Refatoração Boas Práticas

  • 2. Agenda ● Apresentação ● Introdução ● Mãos a obra! ● Bibliografia
  • 3. Apresentação “Quem é Márcio Torres?” ● Primeiro contato com um computador na década de  90, um CP 500 com Basic embedded; ● Desenvolvedor dBase e Clipper; ● Instrutor de Informática na Degraus; ● Suporte e Manutenção; ● Instrutor de Informática no Senac; ● Desenvolvedor Java; ● Professor no IFRS nos cursos técnico e tecnólogo;
  • 4. Introdução ● Práticas transversais: O que veremos e por que é importante? ● Fazendo um bom design; ● Conversaremos sobre: ● Aderir a convenções; ● Boas práticas lidando com: Strings,  ● Seguir princípios de design  Números, Coleções; orientado a objetos; ● Como lidar com: Nulos, Exceções,  Passagem de parâmetros; ● Problemas típicos de domínio, assinaturas  de métodos; ● Como melhorar o código aplicando  refatorações; ● É importante por que: ● Torna a aplicação mais resistente a falhas; ● Deixa o código mais fácil de ler; ● A aplicação fica mais robusta e rápida; ● O mercado busca bons profissionais;
  • 5. É sobre requisitos não funcionais ... Performance Extensibilidade Responsividade Manutenibilidade Robustez Legibilidade Confiabilidade Testabilidade … e qualidade interna.
  • 6. Mãos a obra ● Exemplos práticos, com  embasamento técnico e/ou  bibliográfico;
  • 7. Lidando com Strings ... Como instanciar Strings String q = new String("sim"); As instâncias de Strings literais  são armazenadas em um espaço  if (q == "sim") { de memória chamado Permanent  System.out.println("SIM!!!"); Generation. Elas são reusadas,  } else { com a exceção de quando é  System.out.println("NÃO??!! COMO NÃO?!!"); usado o operador new, que por  consequência cria dois objetos. } String q = "sim"; O operador == compara  igualdade da variável, não  if ("sim".equals(q)) { dos objetos. Sempre use  System.out.println("SIM!!!"); equals, e prefira passar a  } else { variável como parâmetro  System.out.println("NÃO??!! COMO NÃO?!!"); do equals. } Entenda como a memória é gerenciada na plataforma Java
  • 9. Lidando com Strings ... Como concatenar Strings String nomes = “Nomes: “; for (int i = 1; i < 1000000; i++) { Use StringBuilder para  concatenar muitas Strings, é mais  nomes = nomes + “, “ + getNome(); rápido e usa menos memória } Cada resultado com  o operador + gera  uma nova String StringBuilder nomes = new StringBuilder(“Nomes: “); for (int i = 1; i < 1000000; i++) { nomes.append(“, “).append(getNome()); } Conheça a API do Java, estude­a.
  • 10. Lidando com Números ... Como declarar membros numéricos Tipos primitivos consomem  class PlanoDesconto { menos memória, além de ter um  Double rendaMinima; footprint menor Double rendaMaxima; Integer idadeMinima; Integer idadeMaxima; class PlanoDesconto { double rendaMinima; Tipos primitivos reduzem a necessidade  double rendaMaxima; de boilerplate code int idadeMinima; int idadeMaxima; public Double getValorMensalComDesconto() { double _valorMensal = valorMensal == null ? 0 : valorMensal; double _valorDesconto = valorDesconto == null ? 0 : valorDesconto; return _valorMensal - _valorDesconto; } Prefira tipos primitivos sempre que  public double getValorMensalComDesconto() { possível, mas cuidado com o  return valorMensal - valorDesconto; Primitive Obsession Antipattern! }
  • 11. Evitando NullPointerException's  ... Escrevendo métodos seguros public List<Foto> getFotos1(String ordem, final Integer direcao) { if (ordem.equals("descricao")) { Collections.sort(fotos, new Comparator<Foto>() { @Override public int compare(Foto o1, Foto o2) { if (direcao == 1) { return o1.getDescricao().compareTo(o2.getDescricao()); } else if (direcao == 2) { return o2.getDescricao().compareTo(o1.getDescricao()); } return 0; public List<Foto> getFotos2(String ordem, final Integer direcao) { if ("descricao".equals(ordem)) { Collections.sort(fotos, new Comparator<Foto>() { @Override public int compare(Foto o1, Foto o2) { if (new Integer(1).equals(direcao)) { return o1.getDescricao().compareTo(o2.getDescricao()); } else if (new Integer(2).equals(direcao)) { return o2.getDescricao().compareTo(o1.getDescricao()); } return 0; Evite NPE escrevendo métodos testados e seguros, pensando: “E se o parâmetro vier nulo? E se o valor recebido não é tratado?”
  • 12. Escrevendo métodos seguros e  intuitivos ... public List<Foto> getFotos(Ordem ordem) { return getFotos(ordem, null); Sobrecarregue métodos ao invés  } de passar nulos para parâmetros  opcionais public List<Foto> getFotos(Ordem ordem, final Direcao direcao) { if (Ordem.DESCRICAO.equals(ordem)) { Collections.sort(fotos, new Comparator<Foto>() { @Override public int compare(Foto o1, Foto o2) { if (Direcao.DESCENDENTE.equals(direcao)) { return o2.getDescricao().compareTo(o1.getDescricao()); } return o1.getDescricao().compareTo(o2.getDescricao()); Não use Strings onde outro tipo é mais adequado Avalie definir um comportamento default para o caso de omissão … Desenhe para que nulos não sejam passados como parâmetros ...
  • 13. Escrevendo métodos legíveis ... class BadReportPreview { Não parece melhor chamar o  public void show(String dados, preview na impressora assim: boolean impressora) { if (impressora) { preview.show(dados, Destino.IMPRESSORA); // mostra na impressora } else { Do que assim: // mostra no monitor } preview.show(dados, true); } } class GoodReportPreview { Avalie usar  public enum Destino { TELA, IMPRESSORA; enumerados  } para passar  public void show(String dados, Destino destino) { no método  if (Destino.TELA.equals(destino)) { // mostra na tela ao invés de  } else if (Destino.IMPRESSORA.equals(destino)) { boleanos ... // mostra na impressora } else { throw new IllegalArgumentException("Destino nao foi informado"); } } }
  • 14. Convenções para métodos ... Entendendo algumas convenções public void ordernarPorTitulo(List<Livro> livros) { Collections.sort(livros, new Comparator<Livro>() { @Override public int compare(Livro o1, Livro o2) { return o1.getTitulo().compareTo(o2.getTitulo()); } }); } public List<Livro> ordernarPorTitulo(List<Livro> livros) { List<Livro> copia = new ArrayList<Livro>(livros); Collections.sort(copia, new Comparator<Livro>() { @Override public int compare(Livro o1, Livro o2) { return o1.getTitulo().compareTo(o2.getTitulo()); } }); return copia; } Métodos tem retorno quando retornam uma nova instância ... Se o método altera a instância parametrizada use void … Cuidado com os métodos que trazem efeitos colaterais, isto é, alteram a  instância parametrizada  ...
  • 15. Lidando com coleções ... Implementado os métodos necessários ... class Foto { ... @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Foto other = (Foto) obj; if (id != other.id) return false; return true; } Sempre sobrescreva equals e hashCode nas classes em que suas instâncias  participarão de coleções, especialmente baseadas em Hash. Siga o contrato. Lembre: objetos considerados iguais devem ter o mesmo  hashCode.
  • 16. Lidando com coleções ... Devolva listas vazias invés de nulo. Isto fará com que o cliente de sua API não  tenha que escrever qualquer boilerplate code; for (Livro livro : livros) { if (livro.getKeywords() != null && livro.getKeywords().contains(k)) { count++; } } for (Livro livro : livros) { if (livro.getKeywords().contains(k)) { count++; } } É possível instanciar coleções na criação da classe, que tem uma performance  pior. Se quiser melhorar a performance pode fazer Lazy Initialization ou atuar  como delegado da coleção (melhor aproximação);
  • 17. Lidando com exceções ... Fazer um design com ou sem exceções ? public Conta find(Integer id) { if (id == null) { throw new IllegalArgumentException("Id inválido", new NullPointerException("ID nulo")); } return contas.get(id); } public Conta find(Integer id) { if (id == null) return null; return contas.get(id); } public Conta load(Integer id) throws RegistroNaoEncontradoException { if (id == null) throw new RegistroNaoEncontradoException("ID nulo"); Conta c = contas.get(id); if (c == null) throw new RegistroNaoEncontradoException(); return c; } Lance exceções só quando necessário, exceções diminuem a performance ... Se for o caso, propague o stacktrace e documente bem … Não ignore as exceções na hora de tratá­las... Use Checked Exceptions para recuperáveis e Runtime Exceptions para falhas do  sistema ...
  • 18. Lidando com Three Valued Logic ... A maldição herdada pelos SGBD's for (Conta c : contas) { if (c.isEspecial() != null && c.isEspecial()) { contasEspeciais++; } } for (Conta c : contas) { if (c.isEspecial()) { contasEspeciais++; } } Reduza a necessidade de Boiler Plate Code … Use primitivos, ou trate na classe … Pense qual é o valor por omissão ...
  • 19. Refatorações ... Detectar mau cheiro no código … Melhorar a qualidade do código … Não alterar o comportamento ... Alguns maus cheiros: Cadeias de mensagens ... Campo temporário ... Classes, métodos grandes ... Método Longo ... Lista longa de parâmetros ... Alguns técnicas de refatoração: Extrair método; Extrair classe;. Renomear método; Renomear atributo; Objeto parâmetro; Usar fábrica ao invés de construtor; Usar constante ao invés de número mágico;
  • 20. Renomeando métodos e atributos ... Use nomes expressivos ... for (Conta c : c1) { if ( ! c2.contains(c1)) { webService.envComAval(c1); } } for (Conta contaNaBase : contasNaBaseDados) { if ( ! contasNoERP.contains(contaNaBase)) { webService.enviaContaParaComissaoAvaliadora(contaNaBase); } } Sempre que for adicionar um comentário, pergunte­se: “Como posso melhorar o código ao ponto deste comentário não ser  mais necessário?” Conta c = new Conta(); Conta c = new Conta(); Conta c = new Conta(); c.numero = 66410; c.numero = 66410; c.numero = 66410; c.tipo = 1; c.tipo = Conta.FISICA; c.tipo = TipoConta.FISICA; Não use magic numbers, prefira enumerados ...
  • 21. Extrair método ... Evite métodos muito longos ... public static void processaContas() { ContaRepository contaRepository = new ContaRepository(); List<Conta> c1 = contaRepository.findContas(); Collections.sort(c1, new Comparator<Conta>() { @Override public int compare(Conta o1, Conta o2) { if (o1.numero > o2.numero) return 1; if (o2.numero < o1.numero) return -1; return 0; } }); // ... public static void processaContas() { ContaRepository contaRepository = new ContaRepository(); List<Conta> contas = contaRepository.findContas(); ordena(contas); // ... Divida funcionalidades usando métodos privados, de preferência reusáveis ...
  • 22. Mais refatorações ... ● Usar fábrica ao invés de construtor ... ● Trocar número mágico por constante ... ● Introduzir variável explicativa ... ● Usar objeto parâmetro … ● E várias outras ...
  • 24. Bibliografia Recomendada ● Estes livros estão entre os melhores na bibliografia para quem já  programa com Java (e outras linguagens) e deseja tornar­se um  desenvolvedor melhor.