| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 11:00:35
|
Bruno Laturner
GUJ Expert
![[Avatar]](/images/avatar/5800ccd9514fd789d08e5831951aa6bc.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 11:37:13
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 11:52:55
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 12:45:31
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 12:48:25
|
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ê.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 12:49:48
|
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
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 12:56:28
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 12:57:50
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:02:45
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:05:11
|
Bruno Laturner
GUJ Expert
![[Avatar]](/images/avatar/5800ccd9514fd789d08e5831951aa6bc.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:14:51
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:19:59
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:21:23
|
Bruno Laturner
GUJ Expert
![[Avatar]](/images/avatar/5800ccd9514fd789d08e5831951aa6bc.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:26:08
|
moacirjava
Virtual Machine Man
![[Avatar]](/images/avatar/7cc273e8acc02886b2c4c65da1a74663.jpg)
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/05/2009 13:30:35
|
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.
|
|
|
 |
|
|