Como o padrão repository auxilia no controle de responsabilidades?
Published: 2020-11-25 22:05:39

Esta semana fui apresentado ao projeto repository e percebi alguns ganhos com esta abordagem, porém também tive algumas dúvidas que eu gostaria de abordar neste artigo. 
 Bom para começar o padrão repository foi criado por Martin Fowler e é descrito pelo mesmo desta forma: “Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.” sendo assim entendendo esta descrição podemos também entender a proposta deste padrão. Então me fiz as seguintes perguntas.

O que é domínio?

O que são camadas de mapeamento de dados?

Então irei me basear a partir desta etapa.

# O que é domínio?

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/16rzi0ozqpy78jkiq341.jpeg)

O domínio ao qual ele se refere nesta descrição trata-se de um conceito abordado no livro Domain-driven design (Ainda não pude ler, mas já pesquisei sobre), onde um domínio trata-se de uma camada que representa o alinhamento com o negócio, possuindo assim as suas regras e conceitos. 

# O que são camadas de mapeamento de dados?

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ckkux9gflnxoo98dtw4l.png)

Trata-se da camada da aplicação que é focado com a comunicação a fonte de dados, recebendo as requisições da camada de negócios, sendo assim necessário apenas efetuar mudanças nesta camada, quando for necessária uma mudança na fonte de dados.

# Entendi, mas o que realmente o repository faz? 

O padrão repository cria uma camada de abstração na camada de dados onde intermedia as necessidades do domínio para com a fonte de dados reduzindo lógicas duplicadas. 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ascdlhxdomlzm8lp8dcg.png)

Esta abordagem é interessante, pois podemos nos concentrar no que realmente se quer fazer com aquela interação com os dados, por exemplo, se para atualizar o estado de uma lista, precisamos alterar em duas tabelas então vamos utilizar o repository para utilizar a camada de acesso aos dados e apenas dar um nome para esta interação, caso seja necessário fazer isto em outra lista com outro contexto, será apenas necessário flexibilizar a interação e não o acesso aos dados inteiro, garantindo assim uma separação entre os interesses das camadas referentes a aplicação.

# Qual a diferença entre data access object(DAO) e repository?

Quando apliquei o repository eu acabei efetuando uma confusão que até onde li parece ser comum, eu entendi que apenas eu acessando os dados eu já estaria aplicando este padrão, porém eu acabei percebendo que eu estava fazendo o mesmo processo de um DAO, porém um DAO apenas efetua operações numa fonte de dados, padronizando o uso e dando contexto para aquela execução, por outro lado, o repository propõe ser a parte fortemente acoplada ao negócio na camada de dados, onde padroniza ações do negócio ao acesso à fonte de dados, sendo assim um repository pode se utilizar de um DAO. Por exemplo: A camada de negócio precisa inserir um novo dado, porém precisa validar se este dado já existe, então ele pede ao repository para persistir este dado, o repository então vai utilizar o DAO para atualizar os dados e verificar se este dado já existe, e após validado irá pedir ao DAO para inserir a fonte de dados, tornando assim o processo muito mais contextualizado para uma visão de negócios do que está acontecendo sem necessariamente precisar alterar algo no acesso dos dados.

# O que eu achei do uso deste padrão?

Acredito ser uma forma bem útil de melhorar a contextualização do sistema, porém para sistemas simples demais ou com comunicações diretas, sem uma real necessidade de uma visão de acesso aos dados mais voltados ao negócio acredito que apenas o DAO já dá conta, porém ao longo do tempo as coisas se tornarão mais complexas então será necessária esta implementação.

# Considerações finais

 Eu estou aprendendo mais sobre padrões de projetos atualmente, então eu posso ter cometido algum erro no entendimento, portanto a discussão é algo EXTREMAMENTE bem-vinda, pois vai enriquecer o meu conhecimento e de todos que lerão. Obrigado por ler até aqui, e recomendem mais tópicos de leitura para novos artigos

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/3q6gl3ifnszjjxey7nd3.gif)

Referências
* [Apresentando o padrão de projeto Repository](http://www.macoratti.net/11/10/net_pr1.htm)
* [Usando o padrão repository - Criando o repositório da nossa solução](http://www.macoratti.net/14/12/ef6_dalrp3.htm)
* [DDD - Introdução a Domain Driven Design](https://blog.db1group.com/domain-driven-design/)
* [Repository](https://martinfowler.com/eaaCatalog/repository.html)
* [Qual a diferença entre DAO e repository?](https://pt.stackoverflow.com/questions/12927/qual-a-diferença-entre-dao-e-repository)
* [Padrão de projeto “Repository”](https://felipelucioquirino.wordpress.com/2012/07/17/padrao-de-projeto-repository/)