¿Cuáles son algunos ejemplos de buenas estructuras de clase utilizadas para administrar el acceso a la base de datos? Soy un fanático de la encapsulación de clase y preferiría que los contenedores (por ejemplo, el automóvil) no realicen tareas de base de datos.
También me gustaría la posibilidad de colocar fácilmente cosas como una caché de base de datos en el futuro.
A menudo tomo el patrón de clases de contenedor, completo con getters y setters para validación y acceso a la base de datos realizado por una sola clase singleton. Dicho esto, esto a menudo se mezcla entre los dos y se vuelve bastante confuso.
Lo siento si mi pregunta es difícil de entender; No estoy absolutamente seguro de los términos relacionados con las bases de datos. No dude en solicitar una aclaración si es necesario.
Respuestas:
Prefiero el patrón de repositorio para encapsular el acceso a datos. En pocas palabras, el repositorio es responsable de cargar todos los datos necesarios para un objeto específico. Digamos que tiene un objeto Car, como en su ejemplo. Pero todos los atributos para el automóvil, marca, modelo, año, propietarios, características (reproductor de CD, 4wd, etc.) se almacenan en varias tablas a lo largo de la base de datos. El repositorio determina cómo cargar y guardar los datos. Si se necesitan múltiples consultas más pequeñas, está bien, pero solo el patrón del repositorio necesita saberlo. La capa de servicio que invoca el repositorio solo necesita saber qué repositorio invocar.
Eso se puede combinar con el patrón de unidad de trabajo . Entonces, en su ejemplo, la capa de servicio diría que necesita cargar una entidad de automóvil, tiene algún tipo de identificador único y envía ese identificador al repositorio. El repositorio devuelve la entidad del automóvil. Algún otro código manipula la entidad del automóvil y la envía de vuelta al repositorio para que se pueda guardar.
Si realmente quiere ir todo, la capa del repositorio solo expondría interfaces, como ICarRepository. El repositorio contendría una fábrica que la capa de servicio usaría para obtener la interfaz ICarRepository. Todo el acceso a la base de datos estaría oculto detrás de una interfaz, lo que hace que las pruebas unitarias sean mucho más fáciles.
fuente
He usado el Patrón de estrategia para encapsular el acceso a datos. Este patrón le permite ocultar el tipo de almacenamiento que está utilizando detrás de una interfaz común. En la interfaz, defina sus métodos de acceso a datos sin tener en cuenta el tipo de almacenamiento (archivo, base de datos, web). Luego, para su elección de almacenamiento actual, en una clase que comprende la interfaz de estrategia, implemente los detalles de acceso a datos. De esta manera, su aplicación no se preocupa por la fuente de datos que está utilizando.
También puede crear una capa de servicio que use la instancia de estrategia de almacenamiento de datos actual para definir más detalles específicos de la aplicación en lugar de combinar el acceso a los datos y la lógica empresarial.
fuente
Este es un ejemplo del patrón Factory de la base de datos;
fuente