Usarei este tópico para postar alguns exercícios baseados em casos reais.
Os que pensei hoje são baseados em dois pequenos detalhes que já deixaram desenvolvedores com a pulga atrás da orelha por não saberem o que estava acontecendo, passando um bom tempo deles debugando o código para encontrar a solução.
Estes exercícios não acabam quando uma solução é encontrada, procure também refatorar o métodos e as classes envolvidas para que erros humanos como esse sejam minimizados.
Expliquem também o por quê destes erros ocorrerem.
- Nos dias das mães, uma loja resolveu coletar o nome das mães de seus clientes e seus respectivos e-mails para mandar cupons de presentes da loja. Parte do código era assim:
Mãe mãeDoCliente = new Mãe();
List listaDasMães = new ArrayList();
for (Cliente c : clientes)
{
mãeDoCliente.setNome(c.getNomeDaMãe());
mãeDoCliente.setEmail(c.getEmailDaMãe());
listaDasMães.add(mãeDoCliente);
}
Segunda-feira depois dos dias das mães, uma senhora chegou com mais de mil cupons para trocar, e para surpresa da loja, todos eram válidos, com o nome dela. Como era de se esperar, entrou Procon, a justiça e advogados no meio, e a loja saiu perdendo dezenas de milhares de reais. Estranhamente, nenhuma outra pessoa apareceu na loja com cupons. O que aconteceu?
- Em um shopping center, havia uma promoção que a cada 100 reais em compras nas lojas usando um cartão de crédito de certa bandeira, o consumidor ganharia 1 cupom para concorrer à a um carro de luxo ao final do mês. Ao final de cada dia os responsáveis colhiam os cupons, e digitavam somente os números dos cartões das pessoas num arquivo texto, cada um separado por linha, e os carregavam num servidor. Numa dessas semanas, o computador com Windows que usavam pegou um vírus, mas logo arranjaram outro, um notebook com Linux, para terminarem o trabalho.
No dia do sorteio foram relacionar os números com a base de dados da operadora de cartões, para eliminar casos suspeitos. E deu um erro:
java.lang.NumberFormatException: For input string: "1111222233334444"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:403)
E o código:
final String REGEX_SEPARAÇÃO_POR_LINHAS = "\n";
List cartõesVálidos = new ArrayList();
String textoDoArquivo = arquivo.getConteúdo();
String[] cartões = textoDoArquivo.split(REGEX_SEPARAÇÃO_POR_LINHAS);
for (String cartão : cartões)
{
long numero = Long.parseLong(cartão);
if (okNaOperadora(numero))
cartõesValidos.add(cartão);
}
Note que o número 1111222233334444 é um long válido.
EDIT (Moderador) - alguém verificou que o código certo é “String[] cartões”, não “String cartões”, mas isso não é o ponto; só um erro de transcrição. Corrigi para poderem perceber exatamente qual é o problema.
EDIT (Bruno) - Obrigado pela correção!