Crafters

MongoID e campos que armazenam valores monetários

Em um dos projetos que estamos trabalhando atualmente, estamos utilizando Rails e MongoDB juntamente com o Mongoid para fazer o relacionamento ODM (Object-Document-Mapper).

Nesse projeto temos alguns documentos onde armazenamos valores monetários; a primera coisa que fizemos foi mapear o campo para BigDecimal seguindo a documentação do Mongoid. Não vou entrar nos méritos dos motivos de se utilizar BigDecimal ao invés de Float pois não é esse o foco deste post. A questão é que não existe um tipo BigDecimal nativo no MongoDB, o Mongoid faz o trabalho sujo de converter esse valor pra você trabalhar em alto nivel, mas na base do MongoDB ele acaba sendo armazenado como String.

Não tinhamos problemas com isso maaaaaasssssssss, tudo na vida tem um porém, senão eu não estaria blogando sobre isso. Aconteceu que o cliente pediu para pesquisar por esses valores dentro de um range, por exemplo, de R$ 0,00 a R$ 1.000,00. Nenhum de nós percebeu problema nisso, e implementamos a busca, que aparentemente funcionou sem problemas. E digo aparentemente pois tinha funcionado em valores de 0 até 999.999, se eu usasse 800.000 a 1.000.000 por exemplo, mesmo existindo um documento com esse valor armazenado ele não listava.

O real problema era exatamente o fato de ele armazenar esses valores como String. Se usássemos inteiros ou floats a pesquisa funcionava, nossa intenção não era usar Float, pelos seus problemas naturais, e resolvemos usar Inteiros, armazenando-os com suas casas decimais, ou seja, o valor 1.530,99 seria armazenado como 153099. Confesso que é uma abordagem estranha, mas depois de alguns dias lutando com isso resolvemos seguir em frente e usar isso mesmo (se alguém souber algo por favor avise :D ), outro ponto a ser comentado, é que na aplicação não queriamos trabalhar com esse nivel, e resolvemos fazer o que o mongodb faz com o BigDecimal, mas ao invés de retornar um BigDecimal, resolvemos usar um objeto que representasse valores monetários, nesse caso o projeto Money.

Seguindo a documentação do Mongoid de como criar tipos customizados, criamos um tipo chamado MoneyField, o nome tem o Field no final para não conflitar com o nome da Gem e o codigo desse tipo ficou assim:

e no nosso documento fizemos somente um:

field :valor, type: Mongoid::MoneyField

o valor armazenado no mongodb é inteiro e o que tabalhamos na aplicação é um objeto to tipo Money.

Abraços.

Read more →
 

Mocks são realmente maus?

Hoje rolou uma pequena discussão no twitter, sobre usar ou não usar mocks, tudo começou com o Felipe Rodrigues, depois o Alexandre Porcelli respondeu, eu defendi mocks, e por ai foi os vários outros tweets, como achei 140 caracteres pouco resolvi defender meu ponto de vista aqui.

É um assunto antigo mas ainda causa confusão. Devo eu usar mocks nos meus testes? A resposta é um “depende”. Existem alguns objetos que não possuem dependências, e esses objetos não necessitam de mocks, afim simular o comportamento do próprio objeto que estou testando e realmente algo ruim. Mas em muitos casos temos objetos com dependências, e essas dependências podem ser ou não externas.

Ao meu ver quando estou testando uma classe, esse teste deve ser exclusivo desse objeto, e as dependências dele não necessitam estar testadas, pois, presumimos que essa dependência possua um teste e está funcionando perfeitamente. Só pra ilustrar temos a seguinte situação, temos um objeto Order, que por sua vez tem como dependência um objeto Adapter, esse Adapter se conecta a um serviço qualquer de pagamento (Braspag, Cielo, PagSeguro, Paypal, escolha um :D ), o adapter tem a responsabilidade de moldar os dados do objeto Order de acordo com a especificação do gateway.

 

Ignorando o código do Adapter e do Gateway, que de qualquer forma eu não controlo o gateway, qual seria a vantagem de escrever um teste dessa classe que conecte ao meu gateway de pagamento, mesmo em ambiente de testes? O máximo que eu ganharia é uma lentidão nos meus testes, e provavelmente erros do servidor iriam alterar o comportamento esperado do meu teste, o que não seria bom. Existem alguns gateways que mesmo em ambiente de testes só aceitam um número de transação, e em um caso de um projeto real, o teste estava competindo com a aplicação que estava em staging pra homologação. Ou seja, o teste conectava realmente no gateway pra realizar a transação, mas quando os números das transações começaram a ficar iguais, os testes começaram a falhar por que o retorno não era o esperado.

Como eu escreveria esse teste:

Qual a vantagem dessa abordagem? Por que não usar o objeto real e simular o gateway com projetos no estilo FakeWeb? Dessa forma eu tenho total isolamento no teste da minha classe Order, eu posso futuramente mudar meu adapter para qualquer outro gateway, e se ele atender a minha API (possuir um metodo pay que retorne um symbol com o resultado da transação), o teste vai continuar passando como deveria ser. Agora usando um projeto que simule as urls eu tenho um problema, se eu mudar do PagSeguro para o Paypal? Esses testes vão falhar, o que não seria interessante, pois o comportamento da minha classe Order não mudou, o que mudou foi o gateway, consequentemente tenho um novo adapter, ou o comportamento do meu Adapter mudou. Algo que simule as urls e os retornos seria interessante no teste do Adapter, mas no teste do Order não faria sentido algum. Sem falar que um teste dessa forma está muito mais DRY, as mudanças não precisam ser propagadas por todos os testes, e o custo de manutenção cai bastante.

Claro que nem sempre mocks são uma boa idéia, mas na minha opinião, na maioria das vezes, você deve fazer mock das dependências de um objeto e testar o comportamento dele de forma isolada.

Read more →
 

Rails 3.1 Is comming

Amanhã, dia 30/08, se não houver maiores problemas deve ser lançada a versão do Rails 3.1 final.

Então resolvi preparar um post com as novidades dessa versão, não vou muito afundo detalhar cada um dos itens, só vou ressaltar algumas mudanças e melhorias e claro, links para quem quiser se aprofundar em cada um dos itens.

A primeira novidade anunciada foi a adição do JQuery como plugin javascript padrão, ao inves do prototype que vinha se arrastando em cada versão, e era removido por uns 90% dos programadores rails. Na verdade o padrão anterior foi removido, não vem mais nenhum framework javascript padrão no rails, o que vem é o driver ujs do JQuery, o que permite uma remoção muito mais simples ou troca por outro framework disponível.

O maior chororó da comunidade ( :P ) foi quando foi anunciado que CoffeeScript e Scss seriam incorporados por padrão no Rails, formando o Asset Pipeline. Apartir da versão 3.1 o rails tera um novo diretório dentro da pasta app chamado assets, e dentro desse diretorio será incluido outros como images, javascripts e stylesheets a pasta public não mais terá por padrão esses diretórios, e é claro que o desenvolvedor pode alterar. Com a adição do Sprockets, todos os arquivos scss dentro da pasta stylesheets e arquivos .coffee dentro da pasta javascript serão compilados em um único arquivo chamado application, para css é application.css e para javascript é application.js. E outras bibliotecas podem ser adicionadas na pasta vendor/assets, por exemplo algum plugin do JQuery, vendor/assets/javascripts, e esses scripts de terceiros precisam ser aidicionados no arquivo de manifesto localizado em app/assets/javascripts/application.js.

Também foi adicionado suporte a chunked encoding para forçar arquivos JavaScript e CSS a serem carregados em parelelo enquanto a pagina é carregada.
O suporte a mapas de identidade no ActiveRecord evita que várias cópias do mesmo objeto sejam instanciadas.

Outra funcionalidade bacana é o ActiveRecord::Base#has_secure_password , que adiciona ao seu model um mecanismo simples de password, usando a engine do BCrypt para criptografar as senhas:

Existem muitas outras coisa, vale a pena dar uma conferida e estudar um pouco mais sobre essa nova versão do Rails. alguns links para estudos:

http://getsprockets.org/
https://gist.github.com/958283
http://railscasts.com/episodes/265-rails-3-1-overview
http://weblog.rubyonrails.org/releases
https://github.com/rails/rails/tree/3-1-stable

Read more →

TDC 2011 – Florianópolis

E ae pessoal,

Vamos atualizar um pouco o blog :) .
Final de semana passado dias 20 e 21 de Agosto aconteceu o TDC 2011 em Florianópolis, muita gente bacana, bastante networking, e nada mais que 12 trilhas para o pessoal assistir com diversas palestras de alto nível, eu como bom catarinense, estive lá, e participei das trilhas web e ruby/python.

Na trilha Web falei sobre Backbone.js, e fiquei muito contente em saber que existem empresas de SC trabalhando com o Backbone, algo que achei que estava sendo usado somente fora do Brasil, os slides da palestra estão abaixo:

Na trilha de Ruby/Python falei sobre Design Patterns em Ruby, com pouca teoria e bastante código, tive um feedback legal da apresentação, e ela chegou a estar na home do slideshare por um tempo :) , muito obrigado a todos que compartilharam a apresentação, podem ver ela abaixo:

Obrigado a todos que participaram do TDC em Floripa, nos vemos ano que vem :)

Read more →

Backbone.JS

Hoje vou aproveitar meu primeiro post no blog da Crafters e falar de um assunto que está me tomando um certo tempo. Estou estudando Backbone.JS

WTF?

Backbone é um framework JavaScript para criação de Front-end RIA (Rich Internet Application), Novidade? Não.

O Que mais chamou a atenção no backbone, diante das 1239081238109238 opções que existem?

1) Suporte a Mobile.
2) Integrado com JQuery
3) Visual Clean
4) Focado em MVC
5) Usa RestFull

5 itens para ressaltar o por que do Backbone.

Read more →

Criando Tiles no Windows Phone 7

Fala galera, beleza? Uma das coisas bacanas do Windows Phone 7 é a idéia de “Live Tiles” que nada mais são do que informações sobre nossas apps na home do aparelho.
O conceito de live/vivo vem da idéia de que podemos manter os Tiles atualizados, exibindo informações, mesmo se nossa app estiver fechada. Cool hã?
(se você ainda não sabe nada do Windows Phone 7 leia estes posts, e visite esta página no MSDN)

Criando Tiles no Windows Phone 7

Criar Tiles no Windows Phone 7 é muito, mas muito simples mesmo (o modelo de desenvolvimento do WP7 é sensacional).

Criando o background para seu tile do Windows Phone 7

Primeiro vamos criar uma imagem para o nosso tile. As imagens para tiles devem seguir alguns padrões, confira aqui.
Como eu sou bem preguiçoso eu apenas criei uma imagem 173×173 pixels no paint mesmo(salve como png).

Criando Tiles via C#

Agora vamos criar uma app para Windows Phone 7 no Visual Studio.
Primeiro adicione sua imagem ao projeto e marque suas propriedades como abaixo:

Configurando background tile no projeto WP7

Configurando background tile no projeto WP7

Read more →

SessionState Provider com Windows Azure AppFabric Caching

Fala galera, depois de explicar como habilitar o Windows Azure AppFabric Caching no portal do Windows Azure vamos tirar proveito dele para armazenar o estado de nossas sessões em aplicações ASP.NET no Windows Azure.

Por que usar o Windows Azure AppFabric Caching para Sessions?

Quando estamos em um ambiente como o Windows Azure onde normalmente trabalharemos com mais de uma máquina(instância) para nossas aplicações os requests que fizermos aos nossos sites poderão ser encaminhados para qualquer uma destas máquinas.

Read more →

Windows Azure Management Tools – Windows Azure MMC

Fala galera, beleza? Aproveitando as dicas que já dei sobre como acessar o Storage Account do Windows Azure agora vou mostrar uma outra forma de fazer isso: utilizando o Windows Azure Management Tools ou Windows Azure MMC.

Com o Windows Azure Management Tools podemos gerenciar nossos roles, explorar nossa storage account, e outras coisas. Neste primeiro post mostrarei como instalar, e nos psots subsequentes veremos como utilziar algumas das features do Windows Azure Management Tools.

Read more →

Refactoring: O momento de buscar excelência técnica!

Hoje fui procurar resolver um problema em um código antigo, produzido por minha própria equipe. Ao tentar encontrar o problema, identifiquei alguns “mau cheiros” no código. Imediatamente iniciei um refactoring simples, porém que me serve como inspiração para este post.

Refactoring de código é modificar a estrutura de um código sem alterar a sua funcionalidade. É incrível como as pessoas ainda confundem refactoring com modificação de código. Ouço frequentemente pessoas dizendo que vão refatorar um código, quando na verdade deveriam dizer que vão modificar uma funcionalidade. Bom, isso é assunto pra outro tipo de discussão.

Read more →

Professional Scrum Developer Java

Muito tem se falado de Scrum para gestão de projetos de software, de forma que a maioria das empresas estão buscando adotar este framework. Há graus diferentes de adoção no mercado mas todos eles precisam de profissionais qualificados para ajudá-los na sua trajetória.rutoreQuando se adota Scrum em um projeto de software, nunca podemos negligenciar as práticas de engenharia de software, necessárias para assegurar a qualidade e a produtividade da equipe, assim como reduzir o custo de manutenção do software produzido. Essas práticas não são tão difundidas quanto às práticas de gestão do Scrum, mesmo quando todas as empresas que usam Scrum para software devem utilizá-las.

Diante disso, a Crafters traz o curso de Professional Scrum Developer para o Brasil e América Latina. Um curso oficial da Scrum.org, entidade mantida pelo co-criador do Scrum, Ken Schwaber e montado especificamente para a plataforma Java. Este curso oferece ao participante o conhecimento das práticas de engenharia recomendadas pela comunidade Scrum de todo o mundo, baseado na experiência e vivência de seus instrutores e criadores. Os alunos aprenderão:

Read more →