DDD: Repositories

En la actualidad, casi todo sistema requiere de un medio de persistencia, por lo general base de datos. La dependencia de los sistemas con la persistencia es tal que estos se construyen a partir de la base de datos. Se toman decisiones que favorecen las consultas y operaciones a base pero que dejan muy anemico el modelado del sistema. La base de datos llega a tomar mucha importancia, demasiada, las entidades u objetos de acceso a datos se juntan con los componentes de conexión de base, se juntan preocupaciones y razones de fallo, sin mencionar la alta dependencia.

¿Que busca Repository?.

Repository no es mas que un sinónimo del principio de única responsabilidad de SOLID. La preocupación y responsabilidades de las entidades no deben ser acerca del medio de persistencia. En DDD todas las entidades son agnósticas del medio de persistencia, existen comportamientos específicos para las operaciones de persistencia que son responsabilidad de los repositorios. Este patrón también aplica en muchos sabores de MV* , arquitecturas de micro servicios o sistemas desacoplados.

Persistencia no implica ni SQL, tampoco base de datos.

El concepto de repositorio esta pensado para no definir la base de datos como el elemento de persistencia por defecto, cualquier medio persistente vale para operar. Podrías construir repositorios de archivos de texto plano, Xml, Json o cualquier otro medio persistente sin que la lógica de las reglas de negocio se vea afectada directamente. Esta es una poderosa herramienta que permite invertir dependencias y restar complejidad a la solución. También agrega holgura al desarrollo. Al tener un componente especializado en la comunicación con el medio persistente, cualquier cambio o diferencia puede ser absorbida por el repositorio, con esto se busca mantener la pureza de las reglas de negocio.

Desacoplar el origen de datos facilita el Testing.

El beneficio inmediato de separar los detalles de la lectura/escritura en persistencia es el tener mas libertad para poder probar distintos escenarios. Uno de los desafíos mas grandes en sistemas legados o con alto acoplamiento es reproducir escenarios para buscar errores o solo hacer debugging. Comúnmente en errores relacionados con bases de datos se modifican datos en tablas para poder reproducir escenarios de pruebas. Al desacoplar los componentes es mas sencillo reproducir casos de pruebas creando fakes u orígenes de datos a medida.

Separar persistencia y entidades mejora la arquitectura de tus sistemas.

Los repositorios son una excelente practica para mejorar la calidad de tus aplicaciones. Reducen problemas de integración del modelo de la base de datos con las reglas de negocio. Al tener un componente especializado en proporcionar las entidades al sistema, este puede absorber los cambios sin afectar las reglas de negocio, entidades o comportamientos.

También evita conocer demasiado acerca de la estructura de la base de datos. En lugar de crear un contexto desde el ORM donde todas las tablas y artefactos son visibles teóricamente, se crea un contexto limitado que previene romper algo por accidente. Esto es particularmente valiosos en bases de datos monolíticas de legados o en migraciones de monolíticos a micro servicios.

Un repositorio permite tomar decisiones arquitectónicas complejas mas fácilmente, por ejemplo: cambiar el componente de acceso a datos puede ser una tarea costosa, o cambiar un query en código duro por un stored procedure.

Autor imagen: Bernhard Hanakam