Exercícios baseados em casos reais para iniciantes  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

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.



1) 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:

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?


2) 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:



E o código:


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!

This message was edited 5 times. Last update was at 13/05/2009 13:33:16


A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

Bom, em relação ao primeiro exemplo, eu pensei o seguinte:
Dentro do for está sendo adicionado a lista os dados referentes de um mesmo objeto. Eu mudaria o código com a seguinte linha:


Em relação ao segundo exemplo a linha onde é feito:

Não teria de retornar um array de cartões?

This message was edited 1 time. Last update was at 13/05/2009 12:55:36


"Para conseguir algo que você nunca teve, precisa fazer algo que nunca fez."

Analista de Sistemas.
SCJP 5


thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Para o caso 2, vou dar uma pequena dica. O que ocorre quando você roda o seguinte programa?



Ele dá a seguinte mensagem de erro no Windows: (note a quebra de linha bizarra. Rodei o programa em um Prompt de Comando com 80 colunas):


Para deixá-los com mais pulgas atrás da orelha, vou alterar o Prompt de Comando para mostrar 132 colunas (o comando é "mode con cols=132").
Note a quebra de linha bizarra.
A mensagem aparece como:


E para deixar na porta do gol (basta você acabar de bater o pênalti), qual é a diferença entre arquivos-texto gravados no Windows e no Linux?

[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

Vixi ai complicou, de Linux não manjo nada...rsrsrs

No caso 1 minha solução está correta?

This message was edited 1 time. Last update was at 13/05/2009 12:46:22


"Para conseguir algo que você nunca teve, precisa fazer algo que nunca fez."

Analista de Sistemas.
SCJP 5


thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Vou dizer o que deveria ter sido feito no caso 2, mas ainda quero que alguém explique direitinho por quê.

[WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

moacirjava wrote:
No caso 1 minha solução está correta?


Ainda não. É new ArrayList ou new Mãe?

E além disso, você não precisa setar = null.

This message was edited 1 time. Last update was at 13/05/2009 12:51:08



[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

Opa...rsrsr, já "consertei" minha resposta da questão 1, e sete o objeto com null para não ficar recriando ele toda hora e ocupando o espaço na memória, agora essa formatação de printf ainda não tenho muito conhecimento.

This message was edited 1 time. Last update was at 13/05/2009 12:57:23


"Para conseguir algo que você nunca teve, precisa fazer algo que nunca fez."

Analista de Sistemas.
SCJP 5


thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Uma dica que dou sempre e repito todos os dias: para ler um arquivo-texto, normalmente você nunca deve lê-lo por completo dentro de uma variável String; usualmente é melhor lê-lo linha por linha, já que a estrutura de um arquivo-texto é por linhas.

Use sempre new BufferedReader (new FileReader()) se você não tem problemas de encoding, ou new BufferedReader (new InputStreamReader (new FileInputStream(), "encoding"))) se você os tiver.

A vantagem de usar BufferedReader é que ele sabe que arquivos-texto podem ter linhas terminadas por "\r\n" (Windows) ou "\n" (Linux) e pode até ler arquivos com essas combinações misturadas, e você nem precisa ficar sabendo que houve alguma linha que terminava por "\r\n" ou "\n", já que isso é desprezado. De qualquer maneira, é sempre bom usar "trim" antes de efetuar o parse de um dado numérico, para eliminar eventuais sujeiras.

[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

E o 1?

"Para conseguir algo que você nunca teve, precisa fazer algo que nunca fez."

Analista de Sistemas.
SCJP 5


Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

Opps, Botão errado.

This message was edited 1 time. Last update was at 13/05/2009 13:05:34


A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

Bom, como vc disse, a mesma mãe 1000 cupons válidos todos no nome dela.
Então não poderia ser guardado o nome da mesma mãe repetidamente.

Ao invés de List quem sabe implementar um HashMap que não permite repetições?! Essa é minha resposta agora.

"Para conseguir algo que você nunca teve, precisa fazer algo que nunca fez."

Analista de Sistemas.
SCJP 5


thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Moacir, não fique chutando para todo lado. O que você tinha respondido antes estava certo, mas só queria que o Bruno confirmasse.
[WWW]
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

moacirjava wrote:Bom, como vc disse, a mesma mãe 1000 cupons válidos todos no nome dela.
Então não poderia ser guardado o nome da mesma mãe repetidamente.

Ao invés de List quem sabe implementar um HashMap que não permite repetições?! Essa é minha resposta agora.


Não, esta não é a mensagem que queria passar, por mim tudo bem que ela tenha dois ou mais filhos que sejam clientes. Mas ela não tem 1000 filhos, nem é a única mãe do mundo.

A tua primeira resposta está certa.


Agora, os exercícios não param depois de solucionados, gostaria que sugerissem uma refatoração daquele método e das classes envolvidas para que erros humanos como aqueles não aconteçam (dica: sets e gets são perigosos). O thingol já sugeriu os Readers para usar no segundo exercício.

This message was edited 2 times. Last update was at 13/05/2009 13:23:30


A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
moacirjava
Virtual Machine Man
[Avatar]

Membro desde: 11/01/2008 11:31:08
Mensagens: 658
Localização: Minas Gerais
Offline

thingol wrote:Moacir, não fique chutando para todo lado. O que você tinha respondido antes estava certo, mas só queria que o Bruno confirmasse.


Foi mal... inexperiência é foda...

This message was edited 1 time. Last update was at 13/05/2009 13:27:33

thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

moacirjava wrote:
thingol wrote:Moacir, não fique chutando para todo lado. O que você tinha respondido antes estava certo, mas só queria que o Bruno confirmasse.


Foi mal... inexperiência é f*...


Não é inexperiência, é ansiedade

De fato, em alguns casos (mas não nesse) um Set (HashSet, TreeSet) poderia até ser usado, mas não nesse aqui.
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team