Siempre pensé que la lógica de negocios tiene que estar en el controlador y que el controlador, dado que es la parte 'intermedia', permanece estático y que el modelo / vista debe encapsularse a través de interfaces. De esa manera, podría cambiar la lógica de negocios sin afectar nada más, programar múltiples Modelos (uno para cada base de datos / tipo de almacenamiento) y una docena de vistas (para diferentes plataformas, por ejemplo).
Ahora leí en esta pregunta que siempre debe poner la lógica de negocios en el modelo y que el controlador está profundamente conectado con la vista.
Para mí, eso realmente no tiene sentido e implica que cada vez que quiero tener los medios para soportar otra base de datos / tipo de almacenamiento, tengo que reescribir todo mi modelo, incluida la lógica comercial.
Y si quiero otra vista, tengo que reescribir la vista y el controlador.
¿Alguien puede explicar por qué es eso o si me equivoqué en alguna parte?
fuente
Usted y grandes partes del mundo de la programación parecen malinterpretar cuáles son los roles de las partes MVC. En resumen, son:
Modelo = lógica de dominio
Ver = lógica de salida
Controlador = lógica de entrada
Esto significa que el modelo es responsable de toda la lógica de negocios: todo lo relacionado con el dibujo de widgets en una pantalla, manejar una impresora, generar datos como HTML, analizar solicitudes HTTP, etc., etc. no pertenece al modelo.
Sin embargo, muchos de los marcos de trabajo llamados "MVC" modernos realmente no hacen MVC en absoluto, o etiquetan mal sus partes. Muy a menudo, lo que se llama "modelo" es la capa de persistencia del modelo, mientras que la lógica empresarial se encuentra en lo que llaman el "controlador"; el controlador real suele ser solo un punto de entrada central con una tabla de enrutamiento y un poco de código en los "controladores" individuales para enviar la entrada que reciben a los procesos comerciales correctos. Lo que estos frameworks llaman "vista" es realmente un poco de todo: algo de lógica de presentación (Ver), un poco de manejo y validación de entrada (Controlador) y algo más de lógica de negocios (Modelo). La mayor parte de la vista real generalmente se llama "plantillas".
También es posible que desee leer sobre la arquitectura de varios niveles; donde MVC es unidireccional (el flujo es Controlador -> Modelo -> Ver), Multi-Tier es una cosa de dos vías (Presentación -> Lógica -> Datos -> Lógica -> Presentación), y bastantes Los marcos que pretenden hacer MVC en realidad hacen tres niveles, reetiquetando presentación para ver, lógica para el controlador y datos para modelar.
fuente
Para aislar verdaderamente la lógica de negocios y separarla de la infraestructura de la capa de presentación, los servicios de aplicación deben encapsularla. La arquitectura MVC es una forma de implementar la capa de presentación y debe permanecer en ese ámbito, delegando toda la lógica empresarial a estos servicios de aplicación. Piense en los modelos de vista como adaptadores entre la vista y los datos que deben mostrarse o leerse. El controlador media la interacción entre los modelos de vista, las vistas y los servicios de aplicaciones que alojan la lógica empresarial.
Los servicios de aplicación implementan casos de uso de negocios y están desacoplados de la capa de presentación, ya sea MVC u otra cosa. A su vez, los servicios de aplicaciones pueden alojar scripts de transacciones o un diseño controlado por dominio .
Para el almacenamiento, el servicio de aplicación puede hacer referencia a un repositorio o cualquier abstracción de un mecanismo de persistencia. Se pueden admitir diferentes implementaciones abstrayendo el acceso a los datos en una interfaz. Por lo general, estas abstracciones tienen fugas y solo son parcialmente portátiles en las implementaciones y, a menudo, es un intento inútil de lograr la portabilidad total.
ACTUALIZAR
Mi sugerencia se basa en la arquitectura hexagonal . En una arquitectura hexagonal, su modelo de dominio (lógica de negocios) está en el centro. Este núcleo está encapsulado por servicios de aplicaciones que actúan como una fachada . Los servicios de aplicación son clases simples que tienen métodos correspondientes a casos de uso en su dominio. Para una discusión en profundidad sobre los servicios de aplicaciones, eche un vistazo a Servicios en diseño dirigido por dominio . El ejemplo de código contiene un
PurchaseOrderService
servicio de aplicación para un dominio de compras. (Tenga en cuenta que un servicio de aplicación no implica el uso de diseño controlado por dominio).En una arquitectura hexagonal, una capa de presentación MVC es un adaptador entre su modelo de dominio (lógica de negocios) y una GUI. El modelo de dominio no conoce la capa de presentación, pero la capa de presentación sí conoce el modelo de dominio.
Esta solución ciertamente tiene partes móviles que una solución que coloca la lógica empresarial en el controlador y debe sopesar los inconvenientes y los beneficios. La razón por la que sugiero es porque prefiero mantener la lógica de negocios desacoplada de la capa de presentación para combatir la complejidad. Esto se vuelve más importante a medida que crece la aplicación.
fuente
Depende de lo que entiendas por lógica empresarial. Cualquier "lógica" que dé significado al contenido del modelo debe estar en el modelo. En la pregunta vinculada, la respuesta más votada parece definir "lógica empresarial" como cualquier cosa relacionada con los datos; ¡Esto tiene sentido desde el punto de vista de que los datos de una empresa son su negocio!
Una vez vi un ejemplo del creador de Rails (creo) que estaba hablando exactamente sobre esto: no poner "lógica de negocios" en el modelo. Su ejemplo fue una clase de controlador y un método para el registro y el inicio de sesión de la aplicación: una contraseña suministrada en texto sin formato se cifró antes de insertarse o consultarse en el modelo (una base de datos).
No puedo pensar en un mejor ejemplo de algo que no sea la lógica del controlador y que pertenezca directamente al modelo.
El modelo podría ser una interfaz para miles de almacenes de datos, aliviando las preocupaciones de portabilidad. Es aquí donde uno podría encontrar confusión sobre si la interfaz del modelo es en realidad el "controlador".
En términos generales, el controlador vincula el modelo y la vista (que son la carne y la papa de la aplicación). En el desarrollo de Cocoa puede ser simplista hasta el punto en que el controlador se maneja a través de la GUI XCode (objetos y enlaces del controlador).
La sección "Patrones de diseño" del GoF en MVC, citada libremente:
MVC tiene que ver con las interfaces de usuario. La atención se centra en el modelo y la vista: definición y visualización de datos. Tenga en cuenta el "protocolo de suscripción / notificación": aquí es donde entra su controlador. Puede crear todas las vistas que desee; siempre y cuando se adhieran al protocolo, nunca tendrá que tocar el modelo o el controlador.
Si habla específicamente de desarrollo web, en mi humilde opinión, muchos marcos web populares son rápidos y flexibles con el término MVC y sus definiciones de componentes.
fuente
¿Por qué no introduces una capa de servicio?
Entonces su controlador será delgado y más legible, entonces todas sus funciones de controlador serán acciones puras.
Puede descomponer la lógica empresarial tanto como lo necesite dentro de la capa de servicio. La reutilización del código es mejor y no hay impacto en los modelos y repositorios.
fuente