Você sim disse que é a mesma coisa.
Se A implementa B e nada mais, então A é B.
Isto é OO 101.
@Rubem Azenha
O mundo é maior que DDD. Leia sobre o padrão Repository no livro do Fowler e confronte com o padrão DataMapper (DAO) do mesmo livro. Não tem nada a haver com DDD.
O padrão Repository não pertence ao DDD e o nome “Repositorio” em DDD não diz respeito directamente ao padrão “Repository”.
Em DDD um repositorio pode ser qualquer coisa: um list, um DAO, um Map, um EJB, etc…
Em OO, o padrão Repository não pode ser um DAO ou um Map ou um List oum EJB. Ele pode ser composto por um DAO, um map, um list , um EJB…
São coisas totalmente diferentes. Quando se fala em DAO vs Repositorio não estamos em DDD porque em DDD essa diferença é irrelevante.
Quando falamos em DAO vs Repositorio estamos falando de OO e Padrões de Projeto. Estamos falando do Principio de Separação de Responsabilidade.
É um mundo maior que o de DDD.
Então o ponto é : Um objecto construido sob o padrão DAO tem a mesma responsabilidade que um construido sob Reposiotry ?
A resposta é não. Porquê ?
- Repositorio tem a responsabilidade primeira de conhecer o dominio. O DAO não.
- O DAO tem que conhecer a tecnologia de persistencia. O repositorio não.
- O repositorio executa pesquisas próprias ao domino onde os parametros são objetos que representam valores para parametros da pesquisa e nunca a pesquisa em si ( não QueryObjects) . O DAO só executa QueryObjects mas não os monta ( O DAO executa SQL, mas ele não escolhe o SQL)
- A implementação de um repositorio contém regras de negocio. A forma como as pesquisas são definidas é um regra. O DAO não contém regras de negocio. Ele executa de forma “burra” um certo comando.
- Mais geralmente DAO é um tipo especifico do padrão Service. Repositorio não é um Service.
Um exemplo simples da diferença. nos antigamentes um EJB tinha um home e vc executavas coias como findByXYZ() em cima do Home. A resposta era um objecto do tipo do EJB-Entidade ou uma lista deles. Este home tinha o papel de um repositorio do ponto de vista do resto do core de negocio. Mas era comum vc implementar os EJB-Entity usando um DAO para JDBC. Isto porque era suposto que seria possivel mudar o DAO ( por exemplo, se mudasse de banco). Os AS rápidamente viram que isto era muito chato e esta parte foi automatizada com o CMP. O DAO morreu, mas o Home(o repositorio) não. então :
- O reposiotrio nunca morre enquanto o dominio existe. o DAO morre quando a tecnologia de preservação (persistencia ou prevalencia) muda.
Um DAO é plugável e intercambável. Ou seja, é suposto vc poder titar um JDBCDAO e substituir por um XMLDAO ou um LDAPDAO. Um repositorio não é substituivel. O repositorio não é substituivel pela mesma razão que um entity não é. Não faz sentido vc ter duas implemetações de cliente, ou produto. A unica coisa que faz sentido neste tipo de objeto é o uso do padrão Strategy. JDBCDAO , XMLDAO, etc… não são Strategy, são implementações per-se de DAO ( porque estamos usando o padrão Service no fim de contas).
É claro agora ?