Programação Defensiva Glaucio Scheibel Glauco Vinicius Scheffel  v: 1.1 Facilidade e velocidade em fazer uma coisa não  of...
Agenda <ul><li>Objetivo e um pequeno conto </li></ul><ul><li>Práticas para melhorar o produto desenvolvido </li></ul><ul><...
Objetivo <ul><li>Apresentar boas práticas de programação para auxiliar no desenvolvimento Java e entender quando asserções...
Janelas Quebradas, um conto
Os donos foram embora
E levaram o cachorro (t-rex)
Meses se passaram
Veio o sol, veio a chuva
E a casa mantinha-se por meses
Ops, apareceu uma janela quebrada
Outra?!
O que esta havendo?
Manutenção de software? Não conviva com  janelas quebradas
Por que se preocupar ? <ul><li>80% do custo de um software é gasto na manutenção </li></ul><ul><li>dificilmente o autor da...
Boas maneiras
Conheça a linguagem <ul><li>Dedique algum tempo para estudar a linguagem e suas API's </li></ul>public class Demonstracao ...
Termine o que começou Alocar recursos Usar os recursos Liberar os recursos <ul><li>Não crie objetos desnecessários </li></...
Use todos parâmetros <ul><ul><li>public class Exemplo { </li></ul></ul><ul><ul><li>public void  metodo ( int par1, int par...
Cuidado com o exagero <ul><li>public static Object processar(String file, int dados, char variavel, Object status, int lin...
Cuidado com o exagero <ul><li>Evite receber mais de 5 parâmetros </li></ul><ul><ul><li>Grande acoplamento </li></ul></ul><...
public class Aluno extends Pessoa { // outros atributos foram ocultados private float[] n; //  notas private static Algori...
Convenção de nomes JCC <ul><li>Java Code Convention </li></ul><ul><li>Classes  </li></ul><ul><ul><li>primeira letra de cad...
Convenção de nomes JCC <ul><li>Constantes (static final) </li></ul><ul><ul><li>todas letras em maiúsculas </li></ul></ul><...
Documentação <ul><li>O Java possui um padrão para documentar </li></ul><ul><ul><li>Classes </li></ul></ul><ul><ul><li>Memb...
Documentação <ul><li>A partir da documentação escrita podem ser gerados arquivos html de documentação </li></ul><ul><ul><l...
Documentação da classe <ul><li>/** </li></ul><ul><li>* Uma inteface que pode ser  </li></ul><ul><li>* usada para permitir ...
<ul><li>public interface AlgoritmoMedia { </li></ul><ul><li>int ARITMETICA  = 0; </li></ul><ul><li>int PONDERADA = 1; </li...
Exemplo de javadoc
Manipulação de Erros
Robusteza vs Precisão Especificação Precisão Robusteza Habilidade de funcionar mesmo em situações anormais  Habilidade de ...
<ul><li>public class MediaAritmetica </li></ul><ul><li>implements AlgoritmoMedia{ </li></ul><ul><li>public float getMedia(...
Tratamento de erros <ul><li>O que se considera erro pode variar de acordo com: </li></ul><ul><ul><li>A linguagem  </li></u...
Exceções <ul><li>Mecanismo provido pela linguagem para auxiliar no processo de reportar e manipular erros </li></ul>
Comandos Java <ul><li>try </li></ul><ul><ul><li>bloco onde uma exceção pode vir a ser lançada. </li></ul></ul><ul><li>catc...
Formato dos comandos <ul><li>try { </li></ul><ul><li>statement(s) </li></ul><ul><li>} catch ( exceptiontype   name ) { </l...
E se não tratarmos uma exceção ? <ul><li>O compilador irá advertir como em: </li></ul>InputFile.java:11: Exception  java.i...
Como lançar uma exceção? <ul><li>Declare no método que ele pode lançar uma exceção usando throws seguido do nome da classe...
Exceções diretas x indiretas <ul><li>Uma exceção é direta em um método quando usamos o comando throw. </li></ul><ul><li>A ...
Exceções de sistema <ul><li>Uma exceção de sistema indica problemas com o serviços que uma aplicação suporta. Como: </li><...
Exceções de aplicação <ul><li>Um erro de lógica de negócio como: </li></ul><ul><ul><li>InsufficentBalanceException lançado...
RuntimeException <ul><li>Este tipo de exceção indica um erro de programação </li></ul><ul><li>Encontre as RuntimeException...
E se não estiver nos limites do software ??? Especificação Precisão Robusteza
Asserções <ul><li>São expressões booleanas que definem o estado correto do seu programa numa localização particular do cód...
Asserções e Contratos <ul><li>A pré e pós condições são dois tipos específicos de Asserções </li></ul><ul><li>As asserções...
Asserções e Java
Keyword assert <ul><li>Sintaxe: </li></ul><ul><ul><li>assert expressão1; </li></ul></ul><ul><ul><li>assert expressão1:expr...
Execução <ul><li>Por default, as asserções estão desabilitadas </li></ul><ul><li>java [ -enableassertions | -ea  ] [:<pack...
Asserções vs Exceções <ul><li>Asserções: discrepâncias que teoricamente nunca deveriam ocorrer, melhor abortar a execução ...
Qual usar? <ul><li>Se tiveres certeza que algo nunca irá ocorrer, assine embaixo com uma Asserção. </li></ul><ul><li>Ex: T...
E se ocorrer um erro ? <ul><li>Apenas iniciantes culpam </li></ul><ul><ul><li>O compilador </li></ul></ul><ul><ul><li>A li...
E se não for fora do limite? <ul><li>Procure pelos padrões mais comuns </li></ul><ul><li>Examine a alteração mais recente ...
E se não for fora do limite? Divida para conquistar
<ul><li>“ Bullet-proof your code  </li></ul><ul><li>with contracts, assertions  </li></ul><ul><li>and exceptions.” </li></...
Dúvidas ?
Referências bibliográficas <ul><li>Coleman, Derek et al;Desenvolvimento Orientado a Objetos o Método Fusion; Editora Campu...
Referências bibliográficas <ul><li>JavaDoc </li></ul><ul><ul><li>http://java.sun.com/docs/javadoc-paper.html </li></ul></u...
Próximos SlideShares
Carregando em…5
×

Programação Defensiva

2.285 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
2.285
No SlideShare
0
A partir de incorporações
0
Número de incorporações
26
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • Programação Defensiva

    1. 1. Programação Defensiva Glaucio Scheibel Glauco Vinicius Scheffel v: 1.1 Facilidade e velocidade em fazer uma coisa não oferece a solidez duradoura ou a exatidão da beleza. - Plutarco, Vida de Péricles
    2. 2. Agenda <ul><li>Objetivo e um pequeno conto </li></ul><ul><li>Práticas para melhorar o produto desenvolvido </li></ul><ul><ul><li>siga a convenção JLS </li></ul></ul><ul><ul><li>documente o código </li></ul></ul><ul><ul><li>asserções </li></ul></ul><ul><ul><li>exemplos em java </li></ul></ul><ul><ul><li>conheça a linguagem </li></ul></ul><ul><ul><li>termine o que começou </li></ul></ul><ul><ul><li>use todos parâmetros </li></ul></ul><ul><ul><li>não passe muitos parâmetros </li></ul></ul>
    3. 3. Objetivo <ul><li>Apresentar boas práticas de programação para auxiliar no desenvolvimento Java e entender quando asserções devem ser usadas </li></ul>
    4. 4. Janelas Quebradas, um conto
    5. 5. Os donos foram embora
    6. 6. E levaram o cachorro (t-rex)
    7. 7. Meses se passaram
    8. 8. Veio o sol, veio a chuva
    9. 9. E a casa mantinha-se por meses
    10. 10. Ops, apareceu uma janela quebrada
    11. 11. Outra?!
    12. 12. O que esta havendo?
    13. 13. Manutenção de software? Não conviva com janelas quebradas
    14. 14. Por que se preocupar ? <ul><li>80% do custo de um software é gasto na manutenção </li></ul><ul><li>dificilmente o autor dará manutenção para sempre </li></ul><ul><li>todo produto que você expede deve ser bem empacotado e limpo </li></ul>Caso a histórinha não tenha sido o suficiente
    15. 15. Boas maneiras
    16. 16. Conheça a linguagem <ul><li>Dedique algum tempo para estudar a linguagem e suas API's </li></ul>public class Demonstracao { public String concact() { String t = “a”; for (int i=0; i<30; i++) { t = t + “a”; } return t; } } StringBuilder t = new StringBuilder( “a”); for(int i=0; i<30; i++) { t.append( “a” ); } return t.toString();
    17. 17. Termine o que começou Alocar recursos Usar os recursos Liberar os recursos <ul><li>Não crie objetos desnecessários </li></ul><ul><li>Não receba parâmetros que não usa </li></ul><ul><li>Feche seus sockets e arquivos </li></ul><ul><li>Deixe o Garbage Collector trabalhar </li></ul><ul><li>Atribua null para objetos que não vão mais ser usados (somente se faltar muito para o fim do método) </li></ul>
    18. 18. Use todos parâmetros <ul><ul><li>public class Exemplo { </li></ul></ul><ul><ul><li>public void metodo ( int par1, int par2 ) { </li></ul></ul><ul><ul><li>// blá blá </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public void metodo ( int par1) { </li></ul></ul><ul><ul><li>this .metodo2( par1, 100 ); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>Sempre que possível use a palavra this para tornar o código mais legível Java permite dois ou mais métodos com o mesmo nome desde que possuam assinaturas diferentes
    19. 19. Cuidado com o exagero <ul><li>public static Object processar(String file, int dados, char variavel, Object status, int linhas, String query, String usuario, String senha, String banco, String host, int dia, int mes, int ano, Object entrada, Object saida) throws Exception { </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
    20. 20. Cuidado com o exagero <ul><li>Evite receber mais de 5 parâmetros </li></ul><ul><ul><li>Grande acoplamento </li></ul></ul><ul><ul><li>7 +- 2. Limite de capacidade humana. </li></ul></ul><ul><ul><ul><li>The Magical Number Seven Plus or Minus Two - George A. Miller - 1956 </li></ul></ul></ul><ul><ul><li>Verifique se é possível passar um objeto (dados correlacionados) </li></ul></ul>
    21. 21. public class Aluno extends Pessoa { // outros atributos foram ocultados private float[] n; // notas private static AlgoritmoMedia[] algoritmo = new AlgoritmoMedia[2]; static { algoritmo[0] = new MediaAritmetica(); algoritmo[1] = new MediaPonderada(pesos[]); } public float getMedia(int algoritmo) { return this.algoritmo[algoritmo].getMedia(n); } } Possui um único propósito: retornar a média Usa a convenção do JCC para nomear elementos
    22. 22. Convenção de nomes JCC <ul><li>Java Code Convention </li></ul><ul><li>Classes </li></ul><ul><ul><li>primeira letra de cada palavra em maiúsculas </li></ul></ul><ul><ul><li>demais letras em minúsculas </li></ul></ul><ul><li>Membros (Métodos e Atributos) </li></ul><ul><ul><li>primeira letra da primeira palavra em minúsculas </li></ul></ul><ul><ul><li>primeira letra das demais palavras em maiúsculas </li></ul></ul>
    23. 23. Convenção de nomes JCC <ul><li>Constantes (static final) </li></ul><ul><ul><li>todas letras em maiúsculas </li></ul></ul><ul><ul><li>palavras são separadas através do uso do caracter _ (underline) </li></ul></ul>
    24. 24. Documentação <ul><li>O Java possui um padrão para documentar </li></ul><ul><ul><li>Classes </li></ul></ul><ul><ul><li>Membros </li></ul></ul><ul><ul><ul><li>Métodos </li></ul></ul></ul><ul><ul><ul><li>Atributos </li></ul></ul></ul>
    25. 25. Documentação <ul><li>A partir da documentação escrita podem ser gerados arquivos html de documentação </li></ul><ul><ul><li>usage: javadoc [options] [packagenames] [sourcefiles] [classnames] [@files] </li></ul></ul>
    26. 26. Documentação da classe <ul><li>/** </li></ul><ul><li>* Uma inteface que pode ser </li></ul><ul><li>* usada para permitir a implementação </li></ul><ul><li>* de algoritmos plugáveis para </li></ul><ul><li>* calculo de notas </li></ul><ul><li>* @version 1.1 </li></ul><ul><li>* @since 1.0 </li></ul><ul><li>* @author Glaucio & Glauco </li></ul><ul><li>* @see com.glauc(i)o.model.Aluno </li></ul><ul><li>*/ </li></ul>
    27. 27. <ul><li>public interface AlgoritmoMedia { </li></ul><ul><li>int ARITMETICA = 0; </li></ul><ul><li>int PONDERADA = 1; </li></ul><ul><li>/** </li></ul><ul><li>* Calcula a media baseado em um </li></ul><ul><li>* conjunto de notas </li></ul><ul><li>* @parameter Notas array contendo as </li></ul><ul><li>* notas que devem ser usadas no calculo </li></ul><ul><li>* @return A media do conjunto </li></ul><ul><li>*/ </li></ul><ul><li>public float getMedia(float[] notas); </li></ul><ul><li>} </li></ul>O comentário foi feito no Slide anterior O método possui um comentário
    28. 28. Exemplo de javadoc
    29. 29. Manipulação de Erros
    30. 30. Robusteza vs Precisão Especificação Precisão Robusteza Habilidade de funcionar mesmo em situações anormais Habilidade de executar as tarefas para as quais foi definido nos requisitos
    31. 31. <ul><li>public class MediaAritmetica </li></ul><ul><li>implements AlgoritmoMedia{ </li></ul><ul><li>public float getMedia(float[] notas) { </li></ul><ul><li>float soma = 0f; </li></ul><ul><li>float media = 0f; </li></ul><ul><li>int qtdDeNotas = notas.lenght; </li></ul><ul><li>for (int i=0; i<qtdDeNotas; i++) { </li></ul><ul><li>soma += notas[ i ]; </li></ul><ul><li>} </li></ul><ul><li>media = soma / qtdDeNotas; </li></ul><ul><li>return media; </li></ul><ul><li>} } </li></ul>O que irá acontecer se qtdNotas for igual a zero ?
    32. 32. Tratamento de erros <ul><li>O que se considera erro pode variar de acordo com: </li></ul><ul><ul><li>A linguagem </li></ul></ul><ul><ul><li>O programador </li></ul></ul><ul><ul><li>O projetista </li></ul></ul>Em Java a divisão por zero só gera uma exceção quando estamos no domínio dos inteiros
    33. 33. Exceções <ul><li>Mecanismo provido pela linguagem para auxiliar no processo de reportar e manipular erros </li></ul>
    34. 34. Comandos Java <ul><li>try </li></ul><ul><ul><li>bloco onde uma exceção pode vir a ser lançada. </li></ul></ul><ul><li>catch </li></ul><ul><ul><li>sempre aparece após um bloco try e indica o início de um bloco onde a exceção será manipulada. </li></ul></ul><ul><li>finally </li></ul><ul><ul><li>associado a um bloco try indica um conjunto de comandos que devem sempre ser executados ao final do bloco crítico. </li></ul></ul>
    35. 35. Formato dos comandos <ul><li>try { </li></ul><ul><li>statement(s) </li></ul><ul><li>} catch ( exceptiontype name ) { </li></ul><ul><li>statement(s) </li></ul><ul><li>} finally { </li></ul><ul><li>statement(s) </li></ul><ul><li>} </li></ul>
    36. 36. E se não tratarmos uma exceção ? <ul><li>O compilador irá advertir como em: </li></ul>InputFile.java:11: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause of this method. in = new FileReader(filename); ^
    37. 37. Como lançar uma exceção? <ul><li>Declare no método que ele pode lançar uma exceção usando throws seguido do nome da classe de exceção que poderá ser lançada. </li></ul><ul><li>Para lançar uma exceção use o comando throw seguido de uma instância de uma classe sub-classe de Throwable . </li></ul>
    38. 38. Exceções diretas x indiretas <ul><li>Uma exceção é direta em um método quando usamos o comando throw. </li></ul><ul><li>A exceção é indireta quando ela é lançada por outro método e não tratamos ela com um bloco try/catch. </li></ul>
    39. 39. Exceções de sistema <ul><li>Uma exceção de sistema indica problemas com o serviços que uma aplicação suporta. Como: </li></ul><ul><ul><li>Problema ao conectar em um banco de dados </li></ul></ul><ul><ul><li>Um comando insert falha em um banco de dados por falta de privilégios </li></ul></ul><ul><ul><li>Um lookup por uma interface remota não encontra nenhum objeto registrado </li></ul></ul>
    40. 40. Exceções de aplicação <ul><li>Um erro de lógica de negócio como: </li></ul><ul><ul><li>InsufficentBalanceException lançado por exemplo ao se fazer um débito em uma Conta Corrente </li></ul></ul>
    41. 41. RuntimeException <ul><li>Este tipo de exceção indica um erro de programação </li></ul><ul><li>Encontre as RuntimeException e evite que ocorram </li></ul>
    42. 42. E se não estiver nos limites do software ??? Especificação Precisão Robusteza
    43. 43. Asserções <ul><li>São expressões booleanas que definem o estado correto do seu programa numa localização particular do código (Dr Dobs) </li></ul><ul><li>Uma expressão booleana associada a um trecho de código que: </li></ul><ul><ul><li>deve sempre ser verdadeira </li></ul></ul><ul><ul><li>deve gerar um erro com uma mensagem quando for falsa </li></ul></ul>
    44. 44. Asserções e Contratos <ul><li>A pré e pós condições são dois tipos específicos de Asserções </li></ul><ul><li>As asserções surgem durante a análise </li></ul><ul><li>A execução de um método deve manter as asserções verdadeiras </li></ul><ul><li>Caso uma asserção torne-se falsa existe alguma tipo de erro no sistema </li></ul>
    45. 45. Asserções e Java
    46. 46. Keyword assert <ul><li>Sintaxe: </li></ul><ul><ul><li>assert expressão1; </li></ul></ul><ul><ul><li>assert expressão1:expressão2; </li></ul></ul><ul><ul><ul><li>expressão1: booleano </li></ul></ul></ul><ul><ul><ul><li>expressão2: parâmetro para o construtor da classe AssertionError (String, int, boolean, ...) </li></ul></ul></ul>
    47. 47. Execução <ul><li>Por default, as asserções estão desabilitadas </li></ul><ul><li>java [ -enableassertions | -ea ] [:<package name>&quot;...&quot; | :<class name> ] </li></ul>
    48. 48. Asserções vs Exceções <ul><li>Asserções: discrepâncias que teoricamente nunca deveriam ocorrer, melhor abortar a execução para evitar danos. Fora dos conjuntos precisão e robusteza . </li></ul><ul><li>Exceções: Ocorrências anormais passíveis de tratamento. Robusteza . </li></ul><ul><li>Comportamento normal: Precisão. </li></ul>
    49. 49. Qual usar? <ul><li>Se tiveres certeza que algo nunca irá ocorrer, assine embaixo com uma Asserção. </li></ul><ul><li>Ex: Tenho um método que retorna a raiz quadrada e tenho certeza que o sistema nunca irá enviar um número negativo. </li></ul>
    50. 50. E se ocorrer um erro ? <ul><li>Apenas iniciantes culpam </li></ul><ul><ul><li>O compilador </li></ul></ul><ul><ul><li>A linguagem </li></ul></ul><ul><ul><li>Forças sobrenaturais </li></ul></ul><ul><li>Ligue as asserções para verificar se é algo fora dos limites de robusteza </li></ul><ul><ul><li>Se for decida o que fazer </li></ul></ul>
    51. 51. E se não for fora do limite? <ul><li>Procure pelos padrões mais comuns </li></ul><ul><li>Examine a alteração mais recente </li></ul><ul><li>Não cometa o mesmo erro duas vezes (testes unitários) </li></ul><ul><li>Comece a depurar agora e não depois </li></ul><ul><li>Torne o Bug reproduzível </li></ul><ul><li>Use uma ferramenta de log (log4j) </li></ul><ul><ul><li>Log é persistente, debug é transiente. </li></ul></ul><ul><li>Use ferramentas </li></ul><ul><li>Explique o programa para outra pessoa </li></ul>Depure o Código
    52. 52. E se não for fora do limite? Divida para conquistar
    53. 53. <ul><li>“ Bullet-proof your code </li></ul><ul><li>with contracts, assertions </li></ul><ul><li>and exceptions.” </li></ul><ul><li>Andrew Hunt and David Thomas </li></ul>
    54. 54. Dúvidas ?
    55. 55. Referências bibliográficas <ul><li>Coleman, Derek et al;Desenvolvimento Orientado a Objetos o Método Fusion; Editora Campus </li></ul><ul><li>Convenção de código http://java.sun.com/docs/codeconv/ </li></ul><ul><li>Trabalhando com sockets (termine o que começou) http://java.sun.com/docs/books/tutorial/networking/sockets/index.html </li></ul>
    56. 56. Referências bibliográficas <ul><li>JavaDoc </li></ul><ul><ul><li>http://java.sun.com/docs/javadoc-paper.html </li></ul></ul><ul><ul><li>http://java.sun.com/docs/index.html </li></ul></ul><ul><li>The Pragamatic Programmer </li></ul><ul><ul><li>http://www.pragmaticprogrammer.com/ppbook/extracts/balance_resources.html </li></ul></ul><ul><li>Debugging </li></ul><ul><ul><li>http://cm.bell-labs.com/cm/cs/tpop/debugging.html </li></ul></ul><ul><ul><li>The Practice of Programming by Brian W. Kernighan and Rob Pike (Addison-Wesley, 1999; ISBN 0-201-61586-X). </li></ul></ul>

    ×