Guión:
- Pila: Java, Spring, Hibernate.
- Modelo: Aplicación Cliente-Servidor.
- Patrón: Modelo-Vista-Controlador (MVC).
Las clases de capa de servicio tienen tres comportamientos:
Algunos servicios tienen la regla de negocios dentro de los métodos y delegan la persistencia a la aplicación. Me gusta:
EntityManager.save (entidad);
Algunos servicios simplemente llaman a una función de base de datos (pasando parámetros) Como:
CallableStatement cls = con.prepareCall ("{call databaseFunction (args)}");
Algunos servicios tienen métodos con ambos comportamientos.
Mis preguntas:
- ¿Hay algún problema en hacer que los servicios de aplicaciones llamen, directamente, a las funciones de la base de datos? ¿No se considera esto una mala práctica? ¿Cuál sería un modelo de arquitectura aplicable a un proyecto como este?
- ¿Hay algún problema en que el comportamiento se mezcle en el mismo servicio? ¿Como transacciones y consistencia?
- En el caso del mantenimiento, ¿esta encapsulación hace que sea oscuro para el desarrollador que también debe cambiar las funciones en la base de datos? ¿Cómo evitar esto?
- ¿Este escenario ocurre en otras aplicaciones alrededor del mundo o fue solo un error arquitectónico?
design-patterns
architecture
mvc
code-quality
linuxunil
fuente
fuente
Respuestas:
Creo que hay Está colocando un conocimiento sobre las partes internas de la base de datos al servicio de la aplicación. Cambiar la base de datos de cualquier manera (cambiar el motor de almacenamiento o incluso cambiar el nombre de un campo o crear un índice) puede requerir que cambie el servicio de la aplicación y eso viola SRP .
Ver comentario a continuación.
No creo que haya un problema técnico, pero sí uno lógico. Simplemente combina dos enfoques en la aplicación, lo que la hace vaga, menos estructurada y difícil de adaptar a los cambios. Vea los comentarios anteriores sobre la violación de SRP también.
Claro que si.
Coloque métodos y funciones que trabajen directamente con la base de datos en un nivel separado de abstracción (ya sea una capa DAO o un patrón de repositorio simple, depende de la complejidad de su aplicación)
Creo que en nuestro mundo todo sucede;)
fuente
Según lo que dijo, hay una capa de servicio, por lo que el patrón arquitectónico que parece adecuado es la Arquitectura en capas. Referencia adicional
Sí, generalmente es una mala práctica hacer llamadas directas a la base de datos en una capa que no sea de acceso a datos, de esa manera la capa de negocios solo accede a una abstracción de la base de datos.
En cuanto a los comportamientos de mezcla, el uso de algún patrón de diseño como el patrón DAO o el patrón de repositorio podría ayudar a delegar esas responsabilidades mejorando así el código.
Algunas de las ventajas de usar un patrón de diseño y un ORM es la legibilidad de su código, la encapsulación de las responsabilidades, por lo que si su acceso a la base de datos cambia, su capa empresarial no debería cambiar mucho.
fuente