DAO ou Repository? Qual usar?

14/06/2017

46

Olá, pessoal. Tudo bem com vocês?

Em meus estudos sobre padrões de projeto vi muito ser usado o DAO (Data Access Objects). Porém, mais recentemente vi também o padrão Repository, que faz quase a mesma coisa. Então me surgiu a dúvida de quando usar um ou outro. Qual é a diferença entre eles?

Obg. =)
Responder

Post mais votado

17/06/2017

Olá Rachael.
O DAO e o Repository podem ser usados juntos, mas são padrões com funções diferentes.

O DAO é considerado um padrão de integração e é usado como parte da infraestrutura da aplicação. Um DAO serve para você especificar qual o banco de dados vai ser usado, como ele será usado e todas as instruções que devem ser passadas a ele. Ou seja, o DAO conhece e sabe exatamente com qual infraestrutura (banco de dados, arquivos, memória, ...) ele está lidando.

O Repository é considerado um padrão de domínio e faz parte das regras de negócios de uma aplicação. Esse padrão não tem conhecimento da infraestrutura, assim, ele não sabe que está lidando com um banco de dados. Sua real função é trabalhar como uma porta ou janela de acesso a outra camada, que poderia ser o DAO.
E o que ele faz? Apenas retorna um objeto de domínio, como um objeto Pessoa ou uma lista de objetos do tipo Pessoa. Como ele retorna isso, bem, isso é um segredo para ele, já que ele não sabe o que está acontecendo do outro lado da janela.

Antes do uso de frameworks ORM, como o Hibernate, o DAO era bastante usado em aplicações com acesso a banco de dados. Com a chegada dos frameworks ORM ele continuou sendo usado, mas na verdade os frameworks é que fazem o trabalho de DAO, porque são eles que conhecem e lidam com a infraestrutura.
Só que se continuou usando o nome DAO para adicionar as classes que continham as instruções de CRUD. Algo como um extensão do que os frameworks ofereciam. Essa pratica gerou algumas controvérsias.

Alguns assumem que sim, se pode chamar essas classes de DAO, porque se elas possuem os objetos de consulta a banco de dados e as instruções HQL, JPQL ou mesmo SQL, seria ainda infraestrutura. Porque são comandos específicos de banco de dados e banco de dados estão ligados a infraestrutura.

Outros defendem que essas classes, com as consultas e demais operações, seriam um repositório. Já que quem lida com a infraestrutura é o framework.
Mas, o repositório deveria ser apenas uma janela, não deveria saber que um HQL vai devolver um objeto Pessoa ou uma lista qualquer de pessoas. Por conta disso, não se chega realmente a uma conclusão.

Eu acho que as classes com as instruções de banco de dados, mesmo usando um framework, são um DAO e a forma como você vai invocar os métodos dessas classes, poderia então ser o Repositoty.
Um exemplo bastante comum de DAO é aquele onde para cada classe concreta você tem uma interface:
interface PessoaDao {
    //assinaturas
}
class PessoaDaoImpl implements PessoaDao {
    //métodos
}


Eu considero essa interface como o Repositório. Desde que você acesse os métodos através da interface e não da classe concreta:
interface PessoaRepository {
    //assinaturas
}
class PessoaDaoImpl implements PessoaRepository {
    //métodos
}

Porque eu considero a interface o repositório? Porque se eu trocar o meu banco de dados relacional por um não relacional, a interface não vai saber disso, mas terei que de alguma forma mudar a implementação dos métodos da classe PessoaDao. As vezes, dependendo do banco de dados relacional, a própria instrução de consulta sofre diferenças devido ao dialeto especifico de cado banco de dados (Oracle, DBII, MySQL, PostgreSQL, H2, ...)
Outra coisa, se eu resolver não usar mais um banco de dados e sim arquivos, preciso mudar o DAO, mas a interface ainda continuaria intacta, sem saber que eu mudei a infraestrutura.

Desculpa pela longa resposta, mas é difícil falar sobre isso com poucas linhas. Agora, talvez você possa criar sua própria opinião sobre esses padrões.
Responder

Mais Posts

Excelente explicação, Ballem! Muito obrigado por compartilhar conosco todo esse conhecimento. :)

[]'
Responder
bom dia Marcio excelente explicacao muito obrigado pelo compartilhamento de conhecimento ;-)
abracos
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira