Continuando a série de posts sobre camadas de acesso a dados (se vc não sabe do que estou falando clique aqui: Camadas de Acesso a Dados). Existe um padrão que comumente utilizamos e que não fazemos ideia de que este realmente é um padrão documentado e utilizado por muitos, este é o padrão “Find or Create”.
Este padrão consiste da característica de: buscar um determinado dado na fonte de dados e, se o mesmo não for encontrado, então fazer a sua inclusão. Pode parecer simples, mas é um recurso bastante comum que utilizamos no nosso dia.
Outro ponto importante: este recurso funciona como ferramenta para evitar a entrada de dados duplicados em um contexto específico.
Alguns exemplos de sua utilização:
1 – Importação de dados: A tarefa de importação de dados de diferentes sistemas para uma única fonte de dados exige a criação de rotinas que evitem a duplicidade de registros. O pattern “Find or Create” auxilia este cenário, garantindo que ao fim de uma importação não vão existir dados duplicados e que todos os registros necessários estarão na sua fonte de dados de destino. Provavelmente este é o cenário de maior uso deste pattern.
2 – Tags de blog: Quando criamos um post em um blog fazendo a associação de tags, para categorizar e agrupar as publicações. Quando utilizamos o recurso de tags acabamos por utilizar o patter “Find or Create”, buscando por uma tag existente ou adicionando uma nova.
3 – Caixas de comandos e caixas de busca: Contextos de pesquisa, históricos de busca, históricos de comandos, indexadores de assuntos e categorias de pesquisa são baseadas neste padrão. E a lógica de implementação é a mesma: a partir de um dado que precisa ser armazenado para consultas futuras, verifique se o mesmo existe senão adicione um novo.
A implementação deste pattern é bastante simples e baseia-se em duas ações: “Find”, dado um valor busca-se na fonte de dados um registro associado ao mesmo; e “Create”, visto que não existe um registro associado ao valor buscado, então se cria um novo registro na fonte de dados utilizando este mesmo valor buscado.
No exemplo abaixo, dado um número de CPF, busca-se um cliente com este valor. Se existir um cliente com este CPF, então este cliente é retornado, senão é criado um novo registro na fonte de dados com este valor.
Para este exemplo utilize o Entity Framework e C#, mas a tecnologia empregada não é um fator limitador da implementação deste pattern.
public Cliente FindOrCreate(string cpf) { Cliente returnValue = null; using (var contexto = new ContextoLoja()) { // Executa o "Find" returnValue = contexto.Clientes.Where(c => c.Cpf == cpf) .FirstOrDefault(); // Verifica se existe um registro na base if (returnValue == null) { // Após percebido que não existe um resultado para o // "Find" executa-se o "Create" returnValue = new Cliente() { Cpf = cpf }; contexto.Clientes.Add(returnValue); contexto.SaveChanges(); } } return returnValue; }
Espero que este post seja útil.
Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#
Referências:
“DbContext – Programming Entity Framework” – J. Lerman & R. Miller.
Importing legacy data into Core Data with the find-or-create (or delete) pattern – http://thepugautomatic.com/2007/01/importing-legacy-data-into-core-data-with-the-find-or-create-or-delete-pattern/
Core Data Programming Guide – https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html
Bem legal!
Olá Gustavo!
Obrigado por postar!
[]s!