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

Post on 20-Feb-2020

0 views 0 download

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

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