17 Mar
Lembro que em pelo menos um post anterior eu comentei sobre o Infinitest.
O Infinitest é uma ferramenta que roda seus testes unitários a cada vez que você salva algum arquivo. Mas ele não roda todos. Roda apenas os que são afetados pela modificação que você fez.
Isso é muito legal porque reduz muito o tempo de feedback. Imaginem, a cada vez que você salva o arquivo, teria que rodar todos os testes unitários (em geral é meio difícil saber se uma modificação afetou um teste ou não), o que pode demorar vários segundos em um projeto saudável. O infinitest te dá feedback quase instantâneo.
Outra coisa muito legal é que ele coloca um marcador de erro (sabe a marcação de erro de compilação do eclipse? pois é.) no teste que falhou ou onde foi lançada a exceção que impediu a execução do teste. Nem preciso dizer o quanto isso facilita para encontrar o problema.
A primeira versão (3.X) que usei dele, foi durante o desenvolvimento do Mirror. Na época era meio complicado colocar ele para rodar e tinha uns bugs meio estranhos (testes em loop infinito ficavam rodando eternamente). A versão atual (4.X) possui plugins para Eclipse e IntelliJ.
Vale muito a pena, em especial se você quer aprender TDD.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
10 Mar
Uma coisa que ouço sempre na comunidade Java (falo dessa pois é a que conheço melhor) são os brados de “não reinventar a roda”. Cada vez que alguém aparece com um problema e fala de uma solução que algum projeto já resolve, desincentivam o programador completamente, falando que não vale a pena resolver novamente o problema já resolvido.
Eu não tenho como discordar mais de uma afirmação como essa.
A maior parte do tempo que dedico ao desenvolvimento fora do trabalho eu estou reinventando rodas. O Mirror é um exemplo disso. Dá pra fazer quase tudo que ele faz usando a API de reflection nativa do Java, mas é muito mais trabalhoso. Se eu não decido que reinventar a roda era uma coisa boa, eu não teria uma forma melhor de trabalhar com reflection. Além de que meu conhecimento sobre reflection não seria um décimo do que é hoje.
Além disso, tem um problema maior. Quando você usa uma camada de abstração, você ignora o que está acontecendo por baixo dos panos. Muitas vezes isso é bem importante, mas é bem perigoso também porque abstrações vazam. Em algum momento você terá que lidar com a infraestrutura que está embaixo da abstração e nesse momento, conhecer como a roda foi criada é fundamental.
Então, ao contrário do que a maioria diz, eu reinvento a roda sempre que posso. Depois que está funcionando e tem uma boa cobertura de testes, se for melhor (na minha opnião) do que existe no mercado eu extraio e lanço opensource. Caso contrário, migro meu código para uma das soluções existentes. Gastei mais tempo? Não. Fiz um investimento em mim (e provavelmente na minha equipe). Me tornei mais capacitado para resolver esse e vários outros problemas.
Mas é bom lembrar que você não vai poder fazer isso sempre (afinal, não se vive apenas de investimentos). Sem contar que reinventar a mesma roda sempre é bobagem (você vai aprender muito menos do que reinventando uma roda nova).
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
3 Mar
Semanas atrás eu apanhei bastante do Hibernate Search. Na verdade, não foi dele que eu apanhei, mas de não entender algo fundamental sobre ele.
Pra quem não sabe, o hibernate search é uma ferramenta muito legal para busca textual construída em cima do Lucene e do Hibernate. É realmente muito simples de configurar e usar. Mas tem um ponto que eu sabia mas não entendia as implicações.
O cenário era o seguinte. Eu tinha uma aplicação que usava lucene para fazer busca textual. Tudo era feito na mão e tinhámos uma boa suite de testes cobrindo a busca textual. Como a utilização do lucene foi em um momento experimental (fazer e depois melhorar), resolvemos migrar para hibernate search. Tirando o tempo que demorei para notar que a versão atual do hibernate search exige Lucene 2 e não o 3 que usávamos, dois testes insistiam em não passar por nada no mundo.
Todo o resto funcionava (o que praticamente garantia que a configuração estava certa). Depois de muito quebrar a cabeça, me lembrei de como o hibernate search funciona.
O hibernate possui uma estrutura de interceptadores para muita coisa interna dele, inclusive operações básicas com o banco, como inserir, atualizar, remover, etc.
O hibernate search entra exatamente nesse ponto. Cadastrando interceptadores para todas essas funções, ele é capaz de pegar os dados e serializar no índice do lucene também (notem que existe replicação de informação, uma vez que você terá os dados no banco e no índice do lucene). E esse é exatamente o ponto.
O teste que não passava era um teste que simulava o comportamento do usuário, usando WebDriver. Na funcionalidade em questão, não eram enviados todos os dados do objeto, apenas a chave primária dele. Com isso, o hibernate search indexava apenas a chave, pois todo o resto do objeto estava vazio. Quando me lembrei disso, foi necessário apenas fazer uma busca antes de mandar gravar o objeto.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.
24 Feb
Quando eu comecei a trabalhar na Adaptworks em setembro do ano passado, estou em um projeto onde temos muito espaço para experimentação e criação de melhorias.
Uma dessas melhorias é uma forma diferente de se trabalhar com internacionalização em Java.
Em geral, usamos uma taglib para fazer isso (como a JSTL/fmt). Mas eu realmente não gosto muito de sintaxes como:
<input type="submit" value="<fmt:message key="project.submit.button" />">
Fica bem ruim de ler. Eu lembrava de ter ouvido que era possível estender a Expression Language do JSP, mas nunca tinha dado muita bola pra isso.
Enfim, depois de apanhar um pouco chegamos a uma solução interessante para o mesmo código:
<input type="submit" value="${i18n.project.submit.button}">
Não sei quanto a vocês, mas acho bem mais legível.
O projeto está em http://projetos.vidageek.net/i18n
Feedback é sempre bem vindo.
Posts Relacionados:
Acompanhe-nos por
RSS, por Email ou via Twitter.
Veja como ter um desconto no Dreamhost: um excelente servidor web.