Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com...

38
Introdução Boas práticas de alto-nível Boas práticas de baixo-nível Comportamento 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

Transcript of Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com...

Page 1: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 2: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 3: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 4: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 5: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 6: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 7: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 8: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 9: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 10: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 11: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 12: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 13: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 14: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 15: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 16: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 17: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 18: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 19: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 20: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 21: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 22: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 23: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 24: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 25: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 26: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 27: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 28: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 29: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 30: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 31: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 32: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 33: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 34: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 35: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 36: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 37: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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

Page 38: Boas Práticas de Programaçãojarthur/upload/GoodPractices.pdf · Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27. Introdução Boas práticas de

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