Isolando e testando suas queries

Os ORMs invadiram nosso mundo há um tempo e desde então estão se consolidando cada vez mais no mercado.
Apesar de sabermos sobre seus pontos negativos (Principalmente em relação a performance), seu uso traz muita produtividade, e combinado com MicroORMs, muitas vezes é uma ótima solução.

Onde ficam suas queries?

Em vários momentos, durante o desenvolvimento de sistemas, me deparei com uso de queries iguais, ou bem semelhantes, o que me levou a pesquisar mais sobre o assunto.

Eu mantinha minhas queries todas na camada de acesso à dados mesmo. Por exemplo, eu tinha uma query para listar os produtos no meu repositório de produtos, porém eu queria que esta mesma query só me listasse os produtos em estoque. Com esta afirmação, eu acabei de criar uma regra de negócio… “Somente os produtos em estoque devem ser listados”.

Posteriormente, discutindo com o @yanjustino sobre este cenário, e chegamos até uma implementação parecida com esta abaixo, utilizando Specs.
https://github.com/andrebaltieri/room-booking

Trabalhando com Specs

O segundo ponto que discutimos foi, regras de negócio devem ficar no domínio. Sendo assim, vamos mover as nossas queries no formato de especificações para nosso domínio, neste caso para uma pasta chamada Specs.

Em seguida, vamos criar as especificações para obtenção dos produtos em estoque e fora de estoque, como mostrado abaixo:

No exemplo acima temos uma classe estática, contendo duas expressões, uma onde a quantidade em estoque dos produtos é maior que zero e a outra para a quantidade em estoque dos produtos em zero. O ideal é que não haja estoque negativo, e caso queira este controle, poderá implementar uma terceira query, com quantidade menor que zero.

O que ganhamos com isso?

Bom, o primeiro ponto é o reuso, já que podemos aplicar estas queries em vários repositórios, como mostrado no exemplo abaixo.

ProductRepository.cs

Na imagem acima podemos ver o uso das duas Specs criadas na implementação do repositório de produtos.

O segundo ponto, e com certeza o mais importante é a capacidade de testar estas queries isoladamente, como mostrado na imagem abaixo

20150707-003

Com os testes escritos, é só rodar e ver o resultado 🙂

20150707-004

O que isso tudo significa?

Bom, se você utiliza especificações, caso precise mudar sua query, você terá um ponto único de mudança, e isto refletirá em todo seu sistema. Se por exemplo, amanhã ou depois você decidir sempre listar todos os produtos para os clientes, basta modificar o ProductSpec e pronto!

Caso dê algo errado, você terá os testes cobrindo estas regras impostas na leitura de dados!

Em resumo, tratar as queries no formato de specs para mim traz os seguintes benefícios:

  • Mantém as regras de negócio concentradas no domínio
  • Remove as regras de negócio da camada de acesso a dados
  • Permite o reuso das queries
  • Permite execução de testes sobre as queries

E aí, o que acharam?

Lembrando que este e outros pontos sobre arquitetura de software você encontra nos meus treinamentos pagos!
http://andrebaltieri.net/#/

Se você gostou, confere esta implementação na prática neste meu repositório no GitHub
https://github.com/andrebaltieri/mwa-api

Este repositório faz parte do treinamento Modern Web Apps
http://modernwebapps.net/

 

Abraços,

Publicado por andrebaltieri

Microsoft MVP em ASP.NET, trabalha com desenvolvimento de aplicações web desde 2003, em projetos de médio e grande porte no Brasil, EUA, Inglaterra e Holanda. Atualmente é consultor independente e realiza treinamentos na plataforma web/.NET. http://andrebaltieri.net/

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: