RSS

Aprende-se a programar bem sabendo o que não se deve fazer

23 nov

1. Não comentar o código
Conclusão: será um código único, porque só você vai entender;
Solução: comente o essencial, explique para que serve cada método, as principais variáveis, explique um algoritmo, faça uma pequena descrição no início de cada classe.
2. Não usar nomes apropriados para variáveis, métodos e classes
Exemplo:

  1. public class A extends B {
  2. private int h;
  3. public int go() {
  4. return h;
  5. }
  6. }

public class A extends B {     private int h;     public int go() {         return h;     } }
Conclusão: você, ao ler este código, provavelmente não entendeu muita coisa. O que a classe A representa? E a B? E… ?
Solução: utilize nomes apropriados para variáveis, métodos e classes, utilize camelCase (a segunda palavra começa com letra maiúscula) e também o padrão JavaBeans para métodos set, get e is, como por exemplo: setPropriedade(), getNumero(), isPositivo();
Exemplo:

  1. public class Calculadora {
  2. private int numeroA;
  3. private int numeroB;
  4. public int add(int a, int b) {
  5. return a + b;
  6. }
  7. //sets e gets usando o padrão JavaBeans
  8. }

public class Calculadora {     private int numeroA;     private int numeroB;     public int add(int a, int b) {         return a + b;     }     //sets e gets usando o padrão JavaBeans        }
3. Ser totalmente dependente de uma IDE
Conclusão: isso é um grave erro, pois você estará passando por cima de vários conceitos que estão nos códigos que uma IDE gera para você e estará deixando de aprender muitas coisas. Além disso, se você só souber usar a programação visual da IDE, ficará restrito, uma vez que existem muitas outras bibliotecas gráficas que poderiam ser mais adequadas ao seu projeto.
Solução: utilize uma IDE, mas saiba o que acontece no código gerado por ela.
4. try { … } catch(Exception e) { }
Conclusão: se der um erro em uma aplicação imensa, o programador vai passar dias procurando-o.
Solução: pelo menos introduza um e.printStackTrace() na cláusula catch para exibir o rastreamento da pilha.
5. Deixar objetos voando no heap à toa
Exemplo:

  1. Dog a = new Dog();
  2. Dog b = new Dog();
  3. b = a;

Dog a = new Dog(); Dog b = new Dog(); b = a;
Conclusão: temos dois objetos e somente um está sendo referenciado, ou seja, temos um objeto perdido no heap.
Solução:

  1. Dog a = new Dog();
  2. Dog b = a;

Dog a = new Dog(); Dog b = a;
6. Tudo é public
Exemplo:

  1. class A {
  2. public int x = 7; //deveria ser private
  3. }
  4. public class Teste {
  5. public static void main(String[] args) {
  6. A a = new A();
  7. a.x = 5; //Nãoooooo
  8. }
  9. }

class A {     public int x = 7; //deveria ser private } public class Teste {     public static void main(String[] args) {         A a = new A();         a.x = 5; //Nãoooooo     } }
Conclusão: Isso é o que chamamos de alto acoplamento, ou seja, as classes conseguem modificar os atributos uma das outras diretamente.
Solução: coloque as variáveis como private e use métodos sets e gets para manipulação dos dados dessas variáveis.
7. Tentar programar no estilo procedural em uma linguagem Orientada a Objetos
Muito comum em quem está começando a entrar no mundo dos objetos. Dois exemplos já foram citados aqui: os itens 5 e 6.
Conclusão: se enquanto você estiver programando surgir dúvidas se está fazendo da maneira Orientada a Objetos, você tem grandes chances de estar tentando programar da maneira procedural. Mas, não encare isso como um erro grave, pois faz parte do processo de aprendizagem.
Solução: estudar mais os conceitos de programação Orientada a Objetos, como encapsulamento, herança, polimorfismo, etc. E, além disso, procure entender alguns projetos feitos por programadores mais experientes que você.
8. Tenho uma classe que faz tudo
– Nossa João, fiz uma classe que faz de tudo, adiciona dados no bancos PostgreSQL e MySQL separadamente, grava em arquivo e armazena os dados!!! – disse Mariazinha
– Ahhhhh meuuuuuu!!!!! – eu respondo
Conclusão: um lixo de classe, pois possui baixíssima coesão.
Solução: separe sua aplicação em classes bem definidas, visando a uma alta coesão, ou seja, cada classe dá suporte a um único e bem definido papel ou responsabilidade.
9. Uma beleza de busca
Outro dia, um colega me mostra esse código que ele havia feito:

  1. public boolean busca(int[] a, int nProcurado) {
  2. boolean achei = false;
  3. for (int i = 0; i < a.size; i++) {
  4. if (nProcurado == a[i]) {
  5. achei = true;
  6. }
  7. }
  8. return achei;
  9. }

public boolean busca(int[] a, int nProcurado) {     boolean achei = false;     for (int i = 0; i < a.size; i++) {         if (nProcurado == a[i]) {             achei = true;         }     }     return achei; }
Conclusão: repare que se o dado procurado estiver no índice 0, o loop ainda vai continuar em execução até terminar de analisar o array! Imagine se este array tivesse cem mil posições. E, além disso, retorna um booleano. Ah legal, se retornar true, eu vou saber que o número está lá, mas não saberei a posição.
Solução:

  1. public int busca(int[] a, int nProcurado) {
  2. boolean achei = false;
  3. int i = 0;
  4. while (!achei && i < a.size) {
  5. if (nProcurado == a[i]) {
  6. achei = true;
  7. }
  8. else {
  9. i++
  10. }
  11. }
  12. if (!achei) {
  13. i = -1;
  14. }
  15. return i;
  16. }

public int busca(int[] a, int nProcurado) {     boolean achei = false;     int i = 0;     while (!achei && i < a.size) {         if (nProcurado == a[i]) {             achei = true;         }         else {             i++         }     }     if (!achei) {         i = -1;        }     return i; }
É um código maior, mas muito mais eficiente.
10. Esquecer de utilizar o modificador syncronized em programas que usem Threads
Suponha um método de uma loja virtual:

  1. public String comprarProduto(String nomeProduto) {
  2. Conexao c = new Conexao(); //cria uma conexão com um banco de dados
  3. int estoque = c.pegarEstoque(nomeProduto); //recebe o estoque do produto
  4. if (estoque > 0) {
  5. estoque–;
  6. c.atualizaEstoque(nomeProduto, estoque); //atualiza no banco
  7. return “sucesso”;
  8. else {
  9. return “semEstoque”;
  10. }
  11. }

public String comprarProduto(String nomeProduto) {     Conexao c = new Conexao(); //cria uma conexão com um banco de dados     int estoque = c.pegarEstoque(nomeProduto); //recebe o estoque do produto     if (estoque > 0) {         estoque–;         c.atualizaEstoque(nomeProduto, estoque); //atualiza no banco                        return “sucesso”;     else {         return “semEstoque”;     } }
Cada cliente pode ser visto como uma thread que, em dado momento pode realizar uma compra. Se João e Mariazinha por infelicidade do destino compram o mesmo produto no mesmo momento, pode acontecer do estoque ficar negativo!!!
Conclusão: os métodos e/ou trechos não sincronizados podem ser acessados por vários threads ao mesmo tempo.
Solução: para sincronizar, basta marcar os métodos e/ou trechos problemáticos com o modificador syncronized.

Anúncios
 
Deixe um comentário

Publicado por em 23/11/2009 em Estudos Java

 

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: