El asunto Repository X DAO ya está bien batido, lo sé, pero es impresionante como eso confunde a muchas personas hoy en día ... Muchas personas han escrito sobre eso, y yo quiero dar mis dos centavos.

Con la popularización de Domain-Driven Design muchas personas simplemente renombraron sus XptoDAO a XptoRepository pensando que así estarían aplicando DDD porque "llamar un objeto de Repository es más semántico que DAO." En estos días en Twitter vi un mensaje como este: "Repository o DAO? Me gusta el nombre repositorio me parece ser una abstracción más apropiada ". Vamos, esto no se trata sólo de nombres diferentes para la misma cosa.

El patrón DAO tiene el objetivo de crear una abstracción de la infraestructura de almacenamiento de datos para la aplicación. Una capa de persistencia es útil porque ofrece la funcionalidad de almacenamiento/persistencia de los datos sin revelar detalles específicos de la infraestructura subyacente. El almacenamiento puede hacerse en una base de datos, en varias bases de datos, en un web service, en un archivo de texto, lo que sea, pero desde el punto de vista de la capa de negocio que obtiene estos datos, por ejemplo, ella está lidiando apenas con buscar, modificar y grabar en algún lugar que no importa.

El patrón Repository tiene el objetivo de dar apoyo al domain model proveyendo persistencia. Al contrario de DAO, que es un objeto de infraestructura de aplicación y es parte de la capa de persistencia, Repository es parte del modelo de dominio que es parte de la capa de negocio.

Domain models (modelos de dominio) tienen sentido cuando la aplicación tiene reglas de negocio muy complejas. Aíslar las reglas de negocio en un modelo de dominio hace que sea más fácil centrarse en el trabajo y hacer frente a esas complejas reglas. Sin embargo, para que un software pueda funcionar fuertemente basado  en el modelo de dominio (que es la propuesta de Domain-Driven Design) se requiere entre otras cosas, que haya algún componente que haga parte de este modelo y nos permita hacer persistencia de datos - y de ahí vino Repository.

El año pasado hablamos mucho con el padre de DDD - Eric Evans - sobre eso y para él el problema es que las personas confunden estos dos conceptos porque realmente son bien parecidos. En la mayoría de los casos usted necesitará los dos, porque el modelo de dominio para búsquedas de objetos en un Repository, que a su vez delegará en el DAO, que es quien entiende como es la infraestructura para el almacenamiento de datos. Para él tampoco importa si el Repository es una clase o una interfaz, lo que importa es que los objetos en el modelo de dominio debieran siempre lidiar con búsquedas y persistencia de objetos utilizando el interfaz Repository, que tiene el compromiso de ser más semántica que la del DAO.

De Síndrome de DAO

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw