Princípios de projeto ...

           ... e boas práticas de programação
           em Java




           Márcio Torres
           Desenvolvedor de Software (e Professor)
Patrocinadores
Patrocinadores
Patrocinadores
Agenda
●
    Boas práticas lidando com ...
    ●
        Strings
    ●
        Números
    ●
        Coleções
    ●
        Métodos
    ●
        Estruturas
●
    e ...
    ●
        dicas e princípios, digamos, transversalmente.
Prelúdio
Strings: concatene com
StringBuilder
●
     Evite a concatenação de Strings, se for o
     caso, use StringBuilder.
    Ao invés disto:

    String var = sobrenome + “, “ + nome + “; ”;

    Faça isto:

    String var = new StringBuilder(sobrenome)
                     .append(“, “)
                     .append(nome)
                     .append(“; “);
CONHECER A API
  VOCÊ DEVE




         Cuidado para não reinventar a roda
Strings: declare Strings
literalmente
●
    Não use new para declarar uma String

    Ao invés disto:

    String var = new String(“Texto”);

    Faça isto:

    String var = “texto”;
Strings: compare com o
método equals
●
    Não use == para comparar Strings. O
    operador compara a referência da variável.



    Ao invés disto:

    boolean igual = sobrenome == nome;

    Faça isto:

    boolean igual = sobrenome.equals(nome);
Strings: compare o literal
com a variável
●
    Evite comparar uma variável com uma
    String, tu podes receber uma
    NullPointerException


    Ao invés disto:

    boolean igual = sobrenome.equals(“silva”);

    Faça isto:

    boolean igual = “silva”.equals(sobrenome);
Números: use primitivos
sempre que possível
●
    No Java existem duas maneiras de
    representar caracteres, números e boleanos,
    usando primitivos (char, byte, short, int,
    long, float, double, boolean) ou suas versões
    Objeto (Character, Byte, Short, Integer,
    Long, Float, Double, Boolean).
●
    Evite usar Wrappers quando são realizados
    cálculos e a performance e o footprint sejam
    importantes
USE SEU IDE
                        COM SABEDORIA




Aproveite os atalhos, geradores de código e
demais recursos do seu IDE para tornar-se
produtivo
                                              Mas saiba se virar sem ele
Números: use BigDecimal
para cálculos precisos
●
    Evite usar double e float para operações que
    necessitam de precisão.



    Ao invés disto:

    double salario = 2551.25;

    Faça isto:

    BidDecimal salario = BidDecimal.valueOf(2551.25);
USE A FORÇA




Experimente programar usando a intenção, declare
seu desejo e então subjugue o código a sua
vontade ...
Números: use Wrappers
para representar o nulo
●
    Mas cuidado com a NullPointerException




    Ao invés disto:

    double taxa;

    Faça isto:

    Double taxa;
Coleções: parametrize
suas coleções
●
    Não use arrays e evite usar ArrayList ou
    HashSet sem parametrizar o tipo.



    Ao invés disto:

    String[] nomes = new String[10];

    Faça isto:

    List<String> nomes = new ArrayList<String>();
Coleções: devolva uma
lista vazia ao invés de nulo
●
    Evite devolver nulo.
●
    Em um método que devolva uma coleção
    prefira devolvê-la vazia.

Ao invés disto:

public List<Algo> getLista() {
   return lista;
}

Faça isto:

public List<Algo> getLista() {
   if (lista == null) return Collections.emptyList();
   return lista;
}
Ao desenvolver a API pública de seus módulos
pergunte-se a cada tipo de entrada, válida ou inválida,
qual o retorno que não surpreenderia ...
Coleções: sempre sobrescreva
equals e hashCode
●
    Os métodos equals e hashCode são usados
    em conjuntos (Set) e outras coleções
    baseados em hash (como o HashMap).
Métodos: não passe nulo
como parâmetros
●
    Prefira a sobrecarga a passar nulo nos
    parâmetros
●
    Se o método tem muitos parâmetros aplique
    a refatoração Objeto Parâmetro
Ao invés disto:

printer.print(null, null, 2, null, doc);

Faça isto:

printer.print(2, doc);

class Printer {
   public void print(int copias, Document doc) {
   }
NÃO SE REPITA




Projete tendo o princípio DRY (Don't Repeat Yourself) em
mente. Cada parte de código deve ser expresso em único
ponto e sem ambiguidades
Métodos: escreva métodos
pequenos e legíveis
●
    Se o método crescer muito decomponha em
    métodos menores, aplique a refatoração
    Extrair Método
Estruturas: use
Enumerados para opções
●
    Não use Strings, Números ou Boleanos para
    opções


Ao invés disto:

mailer.send(true);

Faça isto:

mailer.send(Prioridade.ALTA);
SEMPRE QUE UM
   COMENTÁRIO VOCÊ FOR
   ADICIONAR, A SI MESMO
PERGUNTE: “COMO POSSO EU
  ESSE CÓDIGO MELHORAR
      POSSO PARA QUE
    DESNECESSÁRIO ESSE
 COMENTÁRIO POSSA SER”
Estruturas: crie novas classes
para grupos de dados
●
    Evite grupos de dados criando novas classes
●
    Evite a Obsessão Primitiva


Ao invés disto:

class Rota {
   int distancia;
}

Faça isto:

class Rota {
   Distancia distancia;
}
SIGA O PRINCÍPIO DE
                           ACESSO UNIFORME




Forneça acesso às propriedades e serviços de
seus objetos através de uma notação uniforme
escondendo se eles são obtidos através de
armazenamento ou computação ....
Bibliografia
Perguntas?
Contato
●
    marciojrtorres.blogspot.com
●
    marciojrtorres at gmail.com

Princípios de projeto e boas práticas de programação em Java - Márcio Torres

  • 1.
    Princípios de projeto... ... e boas práticas de programação em Java Márcio Torres Desenvolvedor de Software (e Professor)
  • 2.
  • 3.
  • 4.
  • 5.
    Agenda ● Boas práticas lidando com ... ● Strings ● Números ● Coleções ● Métodos ● Estruturas ● e ... ● dicas e princípios, digamos, transversalmente.
  • 6.
  • 7.
    Strings: concatene com StringBuilder ● Evite a concatenação de Strings, se for o caso, use StringBuilder. Ao invés disto: String var = sobrenome + “, “ + nome + “; ”; Faça isto: String var = new StringBuilder(sobrenome) .append(“, “) .append(nome) .append(“; “);
  • 8.
    CONHECER A API VOCÊ DEVE Cuidado para não reinventar a roda
  • 9.
    Strings: declare Strings literalmente ● Não use new para declarar uma String Ao invés disto: String var = new String(“Texto”); Faça isto: String var = “texto”;
  • 10.
    Strings: compare como método equals ● Não use == para comparar Strings. O operador compara a referência da variável. Ao invés disto: boolean igual = sobrenome == nome; Faça isto: boolean igual = sobrenome.equals(nome);
  • 11.
    Strings: compare oliteral com a variável ● Evite comparar uma variável com uma String, tu podes receber uma NullPointerException Ao invés disto: boolean igual = sobrenome.equals(“silva”); Faça isto: boolean igual = “silva”.equals(sobrenome);
  • 12.
    Números: use primitivos sempreque possível ● No Java existem duas maneiras de representar caracteres, números e boleanos, usando primitivos (char, byte, short, int, long, float, double, boolean) ou suas versões Objeto (Character, Byte, Short, Integer, Long, Float, Double, Boolean). ● Evite usar Wrappers quando são realizados cálculos e a performance e o footprint sejam importantes
  • 13.
    USE SEU IDE COM SABEDORIA Aproveite os atalhos, geradores de código e demais recursos do seu IDE para tornar-se produtivo Mas saiba se virar sem ele
  • 14.
    Números: use BigDecimal paracálculos precisos ● Evite usar double e float para operações que necessitam de precisão. Ao invés disto: double salario = 2551.25; Faça isto: BidDecimal salario = BidDecimal.valueOf(2551.25);
  • 15.
    USE A FORÇA Experimenteprogramar usando a intenção, declare seu desejo e então subjugue o código a sua vontade ...
  • 16.
    Números: use Wrappers pararepresentar o nulo ● Mas cuidado com a NullPointerException Ao invés disto: double taxa; Faça isto: Double taxa;
  • 17.
    Coleções: parametrize suas coleções ● Não use arrays e evite usar ArrayList ou HashSet sem parametrizar o tipo. Ao invés disto: String[] nomes = new String[10]; Faça isto: List<String> nomes = new ArrayList<String>();
  • 18.
    Coleções: devolva uma listavazia ao invés de nulo ● Evite devolver nulo. ● Em um método que devolva uma coleção prefira devolvê-la vazia. Ao invés disto: public List<Algo> getLista() { return lista; } Faça isto: public List<Algo> getLista() { if (lista == null) return Collections.emptyList(); return lista; }
  • 19.
    Ao desenvolver aAPI pública de seus módulos pergunte-se a cada tipo de entrada, válida ou inválida, qual o retorno que não surpreenderia ...
  • 20.
    Coleções: sempre sobrescreva equalse hashCode ● Os métodos equals e hashCode são usados em conjuntos (Set) e outras coleções baseados em hash (como o HashMap).
  • 21.
    Métodos: não passenulo como parâmetros ● Prefira a sobrecarga a passar nulo nos parâmetros ● Se o método tem muitos parâmetros aplique a refatoração Objeto Parâmetro Ao invés disto: printer.print(null, null, 2, null, doc); Faça isto: printer.print(2, doc); class Printer { public void print(int copias, Document doc) { }
  • 22.
    NÃO SE REPITA Projetetendo o princípio DRY (Don't Repeat Yourself) em mente. Cada parte de código deve ser expresso em único ponto e sem ambiguidades
  • 23.
    Métodos: escreva métodos pequenose legíveis ● Se o método crescer muito decomponha em métodos menores, aplique a refatoração Extrair Método
  • 24.
    Estruturas: use Enumerados paraopções ● Não use Strings, Números ou Boleanos para opções Ao invés disto: mailer.send(true); Faça isto: mailer.send(Prioridade.ALTA);
  • 25.
    SEMPRE QUE UM COMENTÁRIO VOCÊ FOR ADICIONAR, A SI MESMO PERGUNTE: “COMO POSSO EU ESSE CÓDIGO MELHORAR POSSO PARA QUE DESNECESSÁRIO ESSE COMENTÁRIO POSSA SER”
  • 26.
    Estruturas: crie novasclasses para grupos de dados ● Evite grupos de dados criando novas classes ● Evite a Obsessão Primitiva Ao invés disto: class Rota { int distancia; } Faça isto: class Rota { Distancia distancia; }
  • 27.
    SIGA O PRINCÍPIODE ACESSO UNIFORME Forneça acesso às propriedades e serviços de seus objetos através de uma notação uniforme escondendo se eles são obtidos através de armazenamento ou computação ....
  • 28.
  • 29.
  • 30.
    Contato ● marciojrtorres.blogspot.com ● marciojrtorres at gmail.com