IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Boas Práticas de Programação
João Arthur Brunet Monteiro
Mestrando em Informática - COPIN
25/10/2008
João Arthur Brunet Monteiro 1/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Roteiro
1 IntroduçãoObjetivosContextualização
2 Práticas de alto-nível
3 Práticas de baixo-nível
4 Comportamento de um bom programador
João Arthur Brunet Monteiro 2/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
ObjetivosContextualização
Objetivos
Apresentar boas práticas de programação
Alto nívelBaixo nível
Apresentar o comportamento de um bom programador
João Arthur Brunet Monteiro 3/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
ObjetivosContextualização
Código elegante
“Any fool can write code that a computer can understand. Goodprogrammers write code that humans can understand. (MartinFowler)”
Código elegante (elegância funcional)
Reuso de códigoManutenção de códigoDiminuição de bugsFacilita comunicaçãoDiminui curva de aprendizado
João Arthur Brunet Monteiro 4/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
ObjetivosContextualização
Código elegante
“Any fool can write code that a computer can understand. Goodprogrammers write code that humans can understand. (MartinFowler)”
Código elegante (elegância funcional)
Reuso de códigoManutenção de códigoDiminuição de bugsFacilita comunicaçãoDiminui curva de aprendizado
João Arthur Brunet Monteiro 4/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Pensando no problema
Pense no problema antes
Quanto mais tempo no teclado, mais bugs são adicionados
Mapeie seu problema para objetos
Use boas abstrações
João Arthur Brunet Monteiro 5/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Programe para interface
Programe para a interface, não para a implementação
Interfaces são mais democráticas!
Exemplo
Collections.sort(List list)
Flexibilidade
Reuso
João Arthur Brunet Monteiro 6/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Programe para interface
Programe para a interface, não para a implementação
Interfaces são mais democráticas!
Exemplo
Collections.sort(List list)
Flexibilidade
Reuso
João Arthur Brunet Monteiro 6/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Respeite a lei de Demeter
Não abuse dos pontos!
String key = entry.getValue().entrySet().iterator().next().getKey();
Princípio do mínimo conhecimento
Conhecer o mínimo possível sobre as propriedades de um objeto
"Only talk to your friends"
ParâmetrosObjetos criadosObjetos própriosMétodos próprios
Inibe efeito gelatina
João Arthur Brunet Monteiro 7/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Respeite a lei de Demeter
Não abuse dos pontos!
String key = entry.getValue().entrySet().iterator().next().getKey();
Princípio do mínimo conhecimento
Conhecer o mínimo possível sobre as propriedades de um objeto
"Only talk to your friends"
ParâmetrosObjetos criadosObjetos própriosMétodos próprios
Inibe efeito gelatina
João Arthur Brunet Monteiro 7/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Padrões de Projeto
Soluções padrão para problemas recorrentes
Procure mapear seu problema para um já solucionado
Exemplo: Expert (padrão de distribuição de responsabilidades)
João Arthur Brunet Monteiro 8/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Testes
Teste o que você desconfia que vai falhar
Evite testes de get e set
Não encare como uma atividade secundária
Testes aumentam a confiança no código (regressão)
Testes revelam mau cheiro no código
João Arthur Brunet Monteiro 9/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Programação Defensiva
Valide dados vindos do usuário
Cheque referências nulas
Commons Validator (Apache)
João Arthur Brunet Monteiro 10/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Não construa dependência cíclica
Pacotes representam abstração diferentes (Ex.: Acesso a dadosvs GUI)Dificulta entendimentoDificulta evoluçãoDificulta testabilidadeDificulta modularidade
João Arthur Brunet Monteiro 11/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Construindo métodos - Contrato
Respeite contratos
A assinatura de um método é o contrato do programador
Implementar exatamente o que a especificação diz
Um método deve cumprir com somente uma obrigação
Não force leitura de corpo de método
Separe “o que” do “como”
João Arthur Brunet Monteiro 12/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Construindo métodos - Implementação
Crie variáveis somente quando for usá-las
Não reuse variáveis
Nomes pronunciáveis e sugestivos
Evite siglas
retorne result
Seja coerente no uso de padrões de codificação
João Arthur Brunet Monteiro 13/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Uso de coleções
Declare usando a interface:
Exemplo
List myList = new LinkedList()
João Arthur Brunet Monteiro 14/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Uso de coleções
Declare usando a interface:
Exemplo
List myList = new LinkedList()
João Arthur Brunet Monteiro 14/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Evite funções com efeito colateral
Exemplo de função com efeito colateral: Collections.sort(List l)
Dificultam reusoSão difícies de entenderDifíceis de prever o comportamento
Se for inevitável, comente os efeitos colaterais
João Arthur Brunet Monteiro 15/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Construa objetos imutáveis
Objetos imutáveis
Facilitam testesSão confiáveis para serem usados em coleçõesSão thread-safePermitem cache de resultados de métodos (hashCode)Ganho em memóriaÓtimas chaves para HashMap
Como?
Não permita que a classe seja estendida (final)Atributos private e finalNão permita métodos setNão permita funções com efeito colateral
João Arthur Brunet Monteiro 16/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Cópia Defensiva
Proteção contra objetos mutáveis
No construtorthis.date = new Date(param.getTime())
Evita efeito gelatina
Torna o código mais seguro
Métodos get de coleções
Collections.unmodifiableList(this.alunos)
João Arthur Brunet Monteiro 17/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Cópia Defensiva
Proteção contra objetos mutáveis
No construtorthis.date = new Date(param.getTime())
Evita efeito gelatina
Torna o código mais seguro
Métodos get de coleções
Collections.unmodifiableList(this.alunos)
João Arthur Brunet Monteiro 17/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Parametrize coleções
Qual o problema?
List alunos = new ArrayList()
Melhorou?List<Aluno> alunos = new ArrayList<Aluno>();
Evita casts
Evita coleções guarda-chuva
Segurança ao acessar os elementos da coleção
Facilita uso do for
João Arthur Brunet Monteiro 18/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Parametrize coleções
Qual o problema?
List alunos = new ArrayList()
Melhorou?List<Aluno> alunos = new ArrayList<Aluno>();
Evita casts
Evita coleções guarda-chuva
Segurança ao acessar os elementos da coleção
Facilita uso do for
João Arthur Brunet Monteiro 18/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Use for vs Iterator
IteratorIterator it = alunos.iterator();while (it.hasNext()) {Aluno aluno = (Aluno) it.next()}
Forfor (Aluno aluno : alunos)
João Arthur Brunet Monteiro 19/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Use for vs Iterator
IteratorIterator it = alunos.iterator();while (it.hasNext()) {Aluno aluno = (Aluno) it.next()}
Forfor (Aluno aluno : alunos)
João Arthur Brunet Monteiro 19/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Streams
Sempre feche os streams
Bug conhecido!Pergunta clássica: Você fechou o stream?
Use bufferização
Exemplos
BufferedReader e StringBuffer
StringBuffer X Concatenação de Strings
João Arthur Brunet Monteiro 20/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Streams
Sempre feche os streams
Bug conhecido!Pergunta clássica: Você fechou o stream?
Use bufferização
Exemplos
BufferedReader e StringBuffer
StringBuffer X Concatenação de Strings
João Arthur Brunet Monteiro 20/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Equals e HashCode
Sempre que implementar equals, implemente hashCode
Bug muito comum: hashset.contains( algo )
Effective Java [1] possui diretrizes para construção desses doismétodos
João Arthur Brunet Monteiro 21/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Implemente compareTo
Implemente Comparable
Reuso do método Collections.sort(List l)
Mudança na estratégia de ordenação Collections.sort(List l,Comparator c)
João Arthur Brunet Monteiro 22/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Como lidar com erros
Mensagens de erro inúteis
System.out.println("Deu erro aqui")
Use mensagens de erro que façam sentido
Tratamento de erros deve ser adequado
Use exceções ao invés de valores extremos
João Arthur Brunet Monteiro 23/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Como lidar com erros
Mensagens de erro inúteis
System.out.println("Deu erro aqui")
Use mensagens de erro que façam sentido
Tratamento de erros deve ser adequado
Use exceções ao invés de valores extremos
João Arthur Brunet Monteiro 23/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Equals vs "=="
Qual o resultado?Integer i = new Integer("4");Integer j = new Integer("4");assert i.equals(j);assert i == j;
Sempre use equals ao invés de "=="
Exceção: Comparar referências
João Arthur Brunet Monteiro 24/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Equals vs "=="
Qual o resultado?Integer i = new Integer("4");Integer j = new Integer("4");assert i.equals(j);assert i == j;
Sempre use equals ao invés de "=="
Exceção: Comparar referências
João Arthur Brunet Monteiro 24/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Aprenda com os gurus
Cole nos caras bons
Troque experiências
Pair programming
Joshua Bloch, Kent Beck, Marting Fowler, Eric Gahma
Leia bons livros (Effective Java, Beautiful Code [4], PragmaticProgrammer [3], Design Patterns [2] etc)Discussões e Sites [5]
João Arthur Brunet Monteiro 25/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Não conviva com Janelas Quebradas
"Don’t Live with Broken Windows"
Bons programadores têm coragem
João Arthur Brunet Monteiro 26/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
Perguntas
Perguntas?
João Arthur Brunet Monteiro 27/ 27
IntroduçãoBoas práticas de alto-nível
Boas práticas de baixo-nívelComportamento de um bom programador
J. Bloch.Effective Java: Programming Language Guide.Addison-Wesley Professional, 2001.
E. Gamma, R. Helm, R. Johnson, and J. Vlissides.Design patterns: elements of reusable object-oriented software.Addison-Wesley Reading, MA, 1995.
A. Hunt and D. Thomas.The Pragmatic Programmer: From Journeyman to Master.Addison-Wesley Professional, 2000.
A. Oram and G. Wilson.Beautiful Code: Leading Programmers Explain how They Think.O’Reilly, 2007.
H. Systems.Java Practices.At http://www.javapractices.com/home/HomeAction.do.
João Arthur Brunet Monteiro 27/ 27