De Júnior para Pleno

Quando aprendemos a programar, os exemplos são apresentados de forma bem didática, para aprendermos as noções de programação. Somos incentivamos a desenvolver ferramentas que já existem, para aprender como funcionam. Não temos contato com muitas ferramentas, nem com muitos exemplos da “vida real”. No final, acabamos pegando várias manias. À seguir, vou dar algumas dicas para ajudar os novatos a programarem de forma mais profissional.

Testes e Refatoração

Ah, você fez um código que funciona? Parabéns! Mas você também precisa de um código inteligível quando outra pessoa for ler. Às vezes, a pessoa será o você do futuro.

Então, depois que seu código estiver funcionando, crie alguns testes unitários para comprovar isso, se ainda não existirem. Depois de criar os testes, você pode alterar o código para que fique mais legível. Crie métodos novos, reordene as linhas de código, dê nomes mais significativos para as variáveis e para os métodos. Se ainda achar que precisa colocar algum comentário, provavelmente você ainda pode deixar o código mais claro. Não tenha medo de fazer alterações, se algo parar de funcionar seus testes vão indicar.

Testes unitários

A sua classe “Compra” terá um método “int calculaDesconto()“, por exemplo. Seu teste terá 3 etapas principais:

  1. Preparar as classes para o estado desejado;
  2. Chamar o método a ser testado;
  3. Verificar se o resultado é o esperado.

Lembre-se de testar uma coisa de cada vez. Não há problema algum ter muitos testes, para verificar resultados diferentes e para testar métodos diferentes.

Na verificação, se estiver usando o JUnit, utilize os métodos “assert”, nada de usar “System.out.println”!

Exemplo:

package com.matruskan.vendas;
import static org.junit.Assert.*;
public class CompraTest {
    public void testCalculaDesconto() {
        // 1. Preparar
        Compra compra = new Compra();
        compra.addProduto(new Produto(100, Moedas.REAIS_BRASILEIROS));
        // 2. Testar
        int valorComDesconto = compra.calcularDesconto(10); // 10%
        // 3. Verificar
        assertEquals(90, valorComDesconto);
    }
}

System.out.println e Log

Pior que usar o “System.out.println” no teste é usar no produto. Use uma ferramenta de log para informar o que está acontecendo.

Algumas dicas rápidas:

  1. Não concatene Strings no log. A maioria das ferramentas permite que você passe uma String que será formatada com os valores desejados. Exemplo:
    LOGGER.debug("Compra {} realizada por usuário {}.", compra, usuario);

    Assim, se por acaso o nível do log for mais alto, a ferramenta não perderá tempo formatando a String desnecessariamente.

  2. Estude os níveis de log, nem tudo precisa ser INFO.
  3. Sempre que capturar uma excessão, lembre-se de colocar com nível WARN ou ERROR, e não informe apenas o nome do erro.
    LOGGER.warn("Deu erro {}", exception.getMessage()); // errado
    LOGGER.warn("Erro ao finalizar compra", exception); // correto
  4. Não adicione “com sucesso” nos logs. Leia a mensagem do log sem o “com sucesso” e veja se faz sentido. Fez? Então o texto extra não acrescentou nada à mensagem, é só poluição.

Variáveis de uma letra

Você encontra um código assim:

public static double pow(double a, double b) {
    return StrictMath.pow(a, b); // default impl.
}

até mesmo na API do Java! Por que não fazer assim:

public static double pow(double base, double exponent) {
 return StrictMath.pow(base, exponent); // default impl.
}

Muito mais claro, não?

A situação fica pior ainda quando o método é grande. Veja a implementação do StrictMath: http://developer.classpath.org/doc/java/lang/StrictMath-source.html#line.1511

A partir de agora, comece a reparar nisso. e dê nomes melhores para variáveis, atributos e parâmetros. Não se preocupe em perder um tempinho na refatoração para deixar seu código mais claro!

Não conhecer a API e reinventar a roda

Já vi muita gente fazendo:

String textoInvertido = "":
for (int i = textoNormal.size()-1; i >= 0; i--) {
    textoInvertido += textoNormal.charAt(i);
}

Por que não fazer assim?

String textoInvertido = new StringBuilder(textoNormal).reverse().toString();

Porque geralmente o programador não conhece a API que tem disponível. Na verdade, esse exemplo é bobo, porque raramente você precisa inverter uma String. Mas consegue passar a ideia de que um programador pode perder muito tempo com algo que já está pronto e disponível.

Não tenha vergonha de abrir a API e de pesquisar formas melhores de resolver os problemas.

O problema dos for

E se eu escrever o exemplo anterior assim?

String textoInvertido = "":
for (int i = textoNormal.size()-1; i >= 0; i++) {
    textoInvertido += textoNormal.charAt(i);
}

Ou assim?

String textoInvertido = "":
for (int i = normal.size(); i > 0; i--) {
    textoInvertido += textoNormal.charAt(i);
}

Conseguiu identificar os problemas? Várias vezes, você passa o olho e não sabe que fez algo errado. Por isso, sempre que puder, prefira um for mais seguro, como o do exemplo à seguir:

List listaDeOpcoes = geraOpcoes();
for (String a : listaDeOpcoes) {
    // Não tem como errar!
}

Finalizando

Com certeza você já aprendeu algo que daria uma ótima dica. Compartilhe nos comentários outros exemplos!

Anúncios

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 )

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.