Boas Práticas de Programação



Documentos relacionados
Padrões de projeto 1

Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Introdução ao Design

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

Introdução ao TDD. Dionatan Moura. #guma10anos Abril de about.me/dionatanmoura

EMENTA DO CURSO. Tópicos:

Algoritmos e Estrutura de Dados. Introdução a Linguagem Python (Parte I) Prof. Tiago A. E. Ferreira

Orientação a Objetos com Java

Padrão Básico de Projeto: Interfaces e Polimorfismo

PADRÕES DE SOFTWARE. Jerffeson Teixeira de Souza, Ph.D. Tarciane de Castro Andrade. Grupo de Padrões de Software da UECE (GPS.

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Dois clientes com a mesma data de pagamento não podem compartilhar instâncias

Trilha Agile TDD e 20 coisas que você precisa saber

1Introdução Helder da Rocha

Desenvolvimento Dirigido por Testes (TDD)

Padrões de Projeto de Software Orientado a Objetos

Guia de Fatores de Qualidade de OO e Java

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Prototype, um Design Patterns de Criação

J930. Padrões. Projeto. Introdução. argonavis.com.br. Helder da Rocha

Padrões. Projeto (Design) de Software

5. Generics, Iterators e Comparable em Java. Tipos de Dados Abstractos Generics em Java

Desenvolvimento Dirigido por Testes (TDD)

ESTENDENDO A UML PARA REPRESENTAR RESTRIÇÕES DE INTEGRIDADE

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária

Padrões de Projeto. Prof. Jefersson Alex dos Santos

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

ATIVIDADES PRÁTICAS SUPERVISIONADAS

BSI UFRPE Prof. Gustavo Callou

TESTE DE SOFTWARE COM XP. Isac Aguiar isacaguiar.com.br

Aspectos técnicos do desenvolvimento baseado em componentes

Programação Orientada a Testes Rodrigo Rebouças de Almeida

Princípios de Design TRADUÇÃO DE TATIANE CRISTINE ARNOLD, DO ARTIGO IBM DESIGN: DESIGN PRINCIPLES CHECKLIST.

Reuso com Herança a e Composiçã

Jonas de Souza H2W SYSTEMS

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Computação II Orientação a Objetos

Tópicos Avançados em Engenharia de Software

Programação Orientada a Objetos. Padrões de Criação

Categorias de Padrões

Padrão Arquitetura em Camadas

Design Patterns. Viviane Torres da Silva

XP extreme Programming, uma metodologia ágil para desenvolvimento de software. Equipe WEB Cercomp

Curso - Padrões de Projeto Módulo 1: Introdução

Roteiro do Programa e Entrada/Saída

UNIVERSIDADE FEDERAL DO PARANÁ

Processo de Desenvolvimento de Software. Engenharia de Software.

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

USANDO O IZCODE PARA GERAR SOFTWARE RAPIDAMENTE

CSF FasTest SOLUÇÕES DE OUTPUT DE PAGAMENTO

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

Análise e Projeto de Sistemas de Informação. Andrêza Leite andreza.lba@gmail.com

Organização e Arquitetura de Computadores I. de Computadores

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

AULA 4 VISÃO BÁSICA DE CLASSES EM PHP

6.170 Revisão para a Prova

Testes de Software. Testes de Software. Teste de Validação. Teste de Defeito. Modelo de Entrada e Saída. Modelo de Entrada e Saída

AULA 12 CLASSES DA API JAVA. Disciplina: Programação Orientada a Objetos Professora: Alba Lopes alba.lopes@ifrn.edu.br

Exercícios 07 Introdução à POO (Interface Gráfica)

PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Programação de Computadores - I. Profª Beatriz Profº Israel

2 echo "PHP e outros.";

Autoria:Aristófanes Corrêa Silva Adaptação: Alexandre César M de Oliveira

Universidade do Estado da Bahia UNEB Departamento de Ciências Exatas e da Terra - Campus I

Desenvolvimento Web com Framework Demoiselle versão 1.0

UML & Padrões. Aula 1 Apresentação. Profª Kelly Christine C. Silva

Modelos do Design de Software

Curso - Padrões de Projeto Módulo 2: Padrões de Criação

UNIVERSIDADE FEDERAL DO PARANÁ UFPR Bacharelado em Ciência da Computação

Tópicos de Ambiente Web. Modulo 2 Processo de desenvolvimento de um site Professora: Sheila Cáceres

Exercícios de Revisão Java Básico

O Processo de Desenvolvimento de Software

Padrões GoF. Leonardo Gresta Paulino Murta

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Padrões de Projeto. Singleton

A Linguagem Pascal e o Ambiente de Programação Dev-Pascal. Introdução à Ciência da Computação I

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Java. em Ambiente Distribuído. Ênfase no Mapeamento Objeto-Relacional com JPA, EJB e Hibernate. Douglas Rocha Mendes.

Profa. Thienne Johnson

TRABALHO DE DIPLOMAÇÃO Regime Modular ORIENTAÇÕES SOBRE O ROTEIRO DO PROJETO FINAL DE SISTEMAS DE INFORMAÇÕES

CONVENÇÃO DE CÓDIGO JAVA

Gerenciador de Log. Documento Visão. Projeto Integrador 2015/2. Engenharia de Software. Versão 2.0. Engenharia de Software

Padrões de Projeto em Aplicações Web Desenvolvendo projetos web consistentes baseados em reuso de soluções

Programação Orientada por Objetos

Capítulo 22. Associações entre Classes. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Curso Superior de Tecnologia emtelemática Programação Orientada a Objetos Streams em Java. Copyright 2010 Prof. César Rocha

Roteiro. Interfaces de Programação de Aplicações (Application Programming Interfaces) Conceitos BásicosB. ! Definição

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Figura 1. A Classe Java

Conteúdo. Disciplina: INF Engenharia de Software. Monalessa Perini Barcellos. Centro Tecnológico. Universidade Federal do Espírito Santo

Felipe Denis M. de Oliveira. Fonte: Alice e Carlos Rodrigo (Internet)

A Evolução de XP segundo Kent Beck Parte 2

UNIVERSIDADE FEDERAL DO PARANÁ

Transcrição:

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

Roteiro Introdução 1 Introdução Objetivos Contextualização 2 Práticas de alto-nível 3 Práticas de baixo-nível 4 João Arthur Brunet Monteiro 2/ 27

Objetivos Introdução Objetivos Contextualização Apresentar boas práticas de programação Alto nível Baixo nível Apresentar o comportamento de um bom programador João Arthur Brunet Monteiro 3/ 27

Código elegante Introdução Objetivos Contextualização Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Martin Fowler) Código elegante (elegância funcional) Reuso de código Manutenção de código Diminuição de bugs Facilita comunicação Diminui curva de aprendizado João Arthur Brunet Monteiro 4/ 27

Código elegante Introdução Objetivos Contextualização Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Martin Fowler) Código elegante (elegância funcional) Reuso de código Manutenção de código Diminuição de bugs Facilita comunicação Diminui curva de aprendizado João Arthur Brunet Monteiro 4/ 27

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

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

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

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âmetros Objetos criados Objetos próprios Métodos próprios Inibe efeito gelatina João Arthur Brunet Monteiro 7/ 27

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âmetros Objetos criados Objetos próprios Métodos próprios Inibe efeito gelatina João Arthur Brunet Monteiro 7/ 27

Padrões de Projeto Introdução 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

Testes Introdução 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

Programação Defensiva Valide dados vindos do usuário Cheque referências nulas Commons Validator (Apache) João Arthur Brunet Monteiro 10/ 27

Não construa dependência cíclica Pacotes representam abstração diferentes (Ex.: Acesso a dados vs GUI) Dificulta entendimento Dificulta evolução Dificulta testabilidade Dificulta modularidade João Arthur Brunet Monteiro 11/ 27

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

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

Uso de coleções Introdução Exemplo Declare usando a interface: List mylist = new LinkedList() João Arthur Brunet Monteiro 14/ 27

Uso de coleções Introdução Exemplo Declare usando a interface: List mylist = new LinkedList() João Arthur Brunet Monteiro 14/ 27

Evite funções com efeito colateral Exemplo de função com efeito colateral: Collections.sort(List l) Dificultam reuso São difícies de entender Difíceis de prever o comportamento Se for inevitável, comente os efeitos colaterais João Arthur Brunet Monteiro 15/ 27

Construa objetos imutáveis Objetos imutáveis Como? Facilitam testes São confiáveis para serem usados em coleções São thread-safe Permitem cache de resultados de métodos (hashcode) Ganho em memória Ótimas chaves para HashMap Não permita que a classe seja estendida (final) Atributos private e final Não permita métodos set Não permita funções com efeito colateral João Arthur Brunet Monteiro 16/ 27

Cópia Defensiva Introdução Proteção contra objetos mutáveis No construtor this.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

Cópia Defensiva Introdução Proteção contra objetos mutáveis No construtor this.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

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

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

Use for vs Iterator Introdução Iterator Iterator it = alunos.iterator(); while (it.hasnext()) { Aluno aluno = (Aluno) it.next() } For for (Aluno aluno : alunos) João Arthur Brunet Monteiro 19/ 27

Use for vs Iterator Introdução Iterator Iterator it = alunos.iterator(); while (it.hasnext()) { Aluno aluno = (Aluno) it.next() } For for (Aluno aluno : alunos) João Arthur Brunet Monteiro 19/ 27

Streams Introdução Exemplos Sempre feche os streams Bug conhecido! Pergunta clássica: Você fechou o stream? Use bufferização BufferedReader e StringBuffer StringBuffer X Concatenação de Strings João Arthur Brunet Monteiro 20/ 27

Streams Introdução Exemplos Sempre feche os streams Bug conhecido! Pergunta clássica: Você fechou o stream? Use bufferização BufferedReader e StringBuffer StringBuffer X Concatenação de Strings João Arthur Brunet Monteiro 20/ 27

Equals e HashCode Sempre que implementar equals, implemente hashcode Bug muito comum: hashset.contains( algo ) Effective Java [1] possui diretrizes para construção desses dois métodos João Arthur Brunet Monteiro 21/ 27

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

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

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

Equals vs "==" Introdução 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

Equals vs "==" Introdução 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

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], Pragmatic Programmer [3], Design Patterns [2] etc) Discussões e Sites [5] João Arthur Brunet Monteiro 25/ 27

Não conviva com Janelas Quebradas "Don t Live with Broken Windows" Bons programadores têm coragem João Arthur Brunet Monteiro 26/ 27

Perguntas Introdução Perguntas? João Arthur Brunet Monteiro 27/ 27

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