Modelo-Vista-Controlador: ¿El usuario interactúa con la Vista o con el Controlador? [cerrado]

14

Recientemente he aprendido sobre el patrón de diseño MVC. Estoy aprendiendo del libro Head First Design Pattern.

De acuerdo con este libro (si entiendo correctamente):

El modelo es la mayor parte de la lógica y los datos de la aplicación.

La Vista es básicamente la GUI que representa el Modelo visualmente para el usuario.

El Controlador es responsable de "mediar" y actuar como un "intermediario" entre la Vista y el Modelo. La Vista informa al Controlador que el usuario realizó una acción, y el Controlador la traduce a llamadas de método en el Modelo.

Sin embargo, muchos lugares en la web contradicen lo que entiendo de ese libro. Afirman que, en general, el usuario interactúa con el Controlador, no con la Vista.

¿Cuál es verdadero o más común? ¿El usuario interactúa directamente con el controlador o con la vista directamente? ¿Son aceptables ambos enfoques? ¿Cuál es más común?

Aviv Cohn
fuente
44
Esta pregunta no tiene una respuesta significativa en la forma en que la ha escrito. Danos un ejemplo de uno de los lugares en la web que contradice el libro, e intentaremos explicarlo. Sé específico con tu ejemplo.
Robert Harvey
1
2 respuestas, ambas votadas, una dice "interactuar con la vista" y la otra dice "interactuar con el controlador" ... ¡me hace pensar que MVC no es una arquitectura muy buena si está tan confundida a un nivel tan fundamental!
gbjbaanb
¿Hace clic en los controles de la aplicación o en las consultas de la base de datos? La interacción es directamente con la interfaz de usuario, que en sí misma es una vista. La vista generalmente invoca solicitudes al servidor (en el caso de aplicaciones web) o llama a los ganchos registrados en ellos (en el caso de aplicaciones cliente). Además de que todo el MVC es una mierda.
luke1985
@spectre No es útil descartar MVC sin proporcionar una explicación e, idealmente, una alternativa. De lo contrario, ese despido no aporta nada y debería haber quedado fuera de su comentario. Además, incluso con eso, todavía estaría fuera de tema.
underscore_d

Respuestas:

18

El usuario interactúa con la Vista , pero la Vista debe comunicar las acciones al Controlador . El controlador puede actualizar el modelo , pero no se requiere con cada / cualquier cambio.

La descripción que proporciono se basa en mi experiencia personal con la implementación .NET de MVC. Su implementación puede ser diferente.

El controlador es donde se procesan las acciones, básicamente una capa empresarial. Un controlador simple no hará más que obtener los datos del Modelo para alimentar a la Vista. Un controlador complicado realizará todo tipo de acciones, hasta la gestión de seguridad, autenticación, autorización, registro y posiblemente muchas otras cosas.

La Vista solo debe ser responsable de mostrar la información de una manera que el usuario pueda entender. Puede haber algún cruce aquí tanto con el Controlador como con el Modelo, ya que cosas como las Aplicaciones de Página Única (SPA) tendrán comentarios de validación de datos para el usuario. Cualquier otro cruce está muy mal visto.

El modelo trata con datos. Esto incluye la validación de datos (cuando corresponda). El almacenamiento y la recuperación de datos también se manejan en esta capa.


ACTUALIZAR

Parece haber cierta confusión sobre quién hace qué y cuándo. Incluí dos vistas generales diferentes de las arquitecturas MVC porque son similares, pero no iguales. Hay espacio para cualquier interpretación. Posiblemente, muchos más. Las descripciones anteriores son mi interpretación de MVC de múltiples fuentes, incluida mi propia experiencia en la creación de aplicaciones utilizando esta metodología. Con suerte, esta actualización ayudará a aclarar algo de esta confusión.

MVC es un intento de construir un patrón de diseño de Separación de preocupaciones para el desarrollo de software. Se ha implementado principalmente en aplicaciones basadas en web (que yo sepa).

La Vista maneja toda la interacción del usuario. Si su usuario hace clic en un botón, la Vista determina si el clic es una interacción de la interfaz de usuario o algo que está más allá de su interés (una interacción del Controlador). Si el botón hace algo como copiar valores de un campo a otro, su implementación determinará si eso es un problema de Vista o un problema de Controlador. Lo más probable es que solo tenga esta confusión de preocupaciones cuando trabaje con una Aplicación de página única (SPA).

El controlador es donde se procesan sus acciones. La Vista ha comunicado que el usuario decidió cambiar los valores de algunos campos. El Controlador puede realizar la validación de esos datos o puede ser manejado por el Modelo. Nuevamente, esto depende de la implementación. Si el controlador tiene características de seguridad, puede determinar que el usuario no tiene suficientes privilegios para realizar la acción. Rechazaría los cambios y actualizaría la Vista en consecuencia. El Controlador también determina qué datos recuperar del Modelo, cómo empaquetarlos y actualizar la Vista con esos datos.

El modelo determina cómo y dónde almacenar los datos. También puede realizar la validación de esos datos antes de almacenarlos (debería hacerlo porque las personas omitirán la Vista en ocasiones).


Wikipedia tiene un artículo sobre MVC .

  • Un modelo notifica su vista / vistas y controladores asociados cuando ha habido un cambio en su estado. Esta notificación permite que las vistas actualicen su presentación y que los controladores cambien el conjunto de comandos disponibles. En algunos casos, una implementación de MVC podría ser "pasiva", de modo que otros componentes deben sondear el modelo en busca de actualizaciones en lugar de recibir una notificación.
  • El controlador le dice a una vista toda la información que necesita para generar una representación de salida para el usuario. También puede proporcionar mecanismos genéricos para informar al controlador de la entrada del usuario.
  • Un controlador puede enviar comandos al modelo para actualizar el estado del modelo (por ejemplo, editar un documento). También puede enviar comandos a su vista asociada para cambiar la presentación de la vista del modelo (por ejemplo, desplazándose por un documento).

Del resumen de Microsoft de MVC .

  • Modelos. Los objetos modelo son las partes de la aplicación que implementan la lógica para el dominio de datos de la aplicación. A menudo, los objetos modelo recuperan y almacenan el estado del modelo en una base de datos. Por ejemplo, un objeto Producto puede recuperar información de una base de datos, operar en ella y luego escribir información actualizada en una tabla de Productos en una base de datos de SQL Server.

    En aplicaciones pequeñas, el modelo es a menudo una separación conceptual en lugar de física. Por ejemplo, si la aplicación solo lee un conjunto de datos y lo envía a la vista, la aplicación no tiene una capa de modelo físico y clases asociadas. En ese caso, el conjunto de datos asume el papel de un objeto modelo.

  • Puntos de vista. Las vistas son los componentes que muestran la interfaz de usuario (IU) de la aplicación. Por lo general, esta IU se crea a partir de los datos del modelo. Un ejemplo sería una vista de edición de una tabla de Productos que muestra cuadros de texto, listas desplegables y casillas de verificación basadas en el estado actual de un objeto Producto.

  • Controladores. Los controladores son los componentes que manejan la interacción del usuario, trabajan con el modelo y, en última instancia, seleccionan una vista para representar que muestra la IU. En una aplicación MVC, la vista solo muestra información; el controlador maneja y responde a la entrada e interacción del usuario. Por ejemplo, el controlador maneja valores de cadena de consulta y pasa estos valores al modelo, que a su vez podría usar estos valores para consultar la base de datos.

Adam Zuckerman
fuente
¿Qué pasa si no tienes GUI para todas las acciones? ¿Qué sucede si solo tiene una API implementada para algunas partes específicas? ¿Eso significa que el usuario a veces interactúa con la Vista y otras con el Controlador directamente?
Mahdi
1
Desde mi perspectiva, no. La API toma el lugar de la vista.
Adam Zuckerman
pero la API podría ser simple url-routes, ubicada en el Controller. Me refiero a ninguna vista en absoluto ...
Mahdi
1
@ AdamZuckerman Gracias por responder. En el siguiente comentario, describiré cómo creo que funciona una implementación MVC común, confirme si es correcta o no. Gracias
Aviv Cohn
2
@Mahdi Una API, por definición, está ahí como una interfaz de programación , no como una interfaz de usuario . Los programas interactúan con la API, los usuarios interactúan con la Vista.
Eric King
4

El usuario interactúa con el controlador . Desde el punto de vista técnico, no estás interactuando con la Vista , solo la estás usando para interactuar con el Controlador .

En la superficie, parece que el usuario está interactuando con la GUI; también para un no programador, esto tiene más sentido, sin embargo, al hacer clic en un botón, básicamente está hablando con el Controlador, no con la Vista .

Además, no todas las aplicaciones, incluso las aplicaciones web MVC, tienen una GUI. Puede interactuar con el controlador a través de una API, simplemente simple, url-routespor ejemplo, ubicado en el controlador .

El controlador debe ser el lugar que recibe y maneja las solicitudes del usuario. Entonces, si de alguna manera está accediendo al Modelo directamente desde la Vista , no importa cómo, entonces ya no es MVC .

Mahdi
fuente
2
+1 Esto es correcto. Cosas como menús y barras de herramientas son parte de la GUI pero no parte de la vista, y van directamente al controlador. Pulsaciones de teclas del mismo modo.
david.pfx
1
La razón por la que las opiniones existen como una abstracción es para que podamos sustituirlas fácilmente cuando sea necesario. Un controlador para una aplicación en varias plataformas puede ser el mismo, pero las vistas deben reconocer los gestos de los usuarios de manera diferente y traducirlos en operaciones del controlador. No estoy de acuerdo, por lo tanto, que los usuarios interactúen directamente con los controladores.
Fuhrmanator
1
@Mahdi Diría que en ese caso, no hay interacción del usuario, es la vista que se comunica con el controlador mediante programación. Las únicas interacciones que inicia el usuario son a través de la vista.
Eric King
1
@ david.pfx Las pulsaciones de teclas no pueden ir directamente desde una ventana del navegador a un controlador.
Adam Zuckerman
1
@Izkata "La Vista es la parte del código a la que se envían las solicitudes" - Lo siento, pero esto es lo peor que escuché aquí. ¿Cómo es eso posible? ¿Puede respaldarlo proporcionando una referencia en un artículo o libro?
Mahdi
1

Usemos un ejemplo concreto de por qué los usuarios interactúan directamente con vistas y no con controladores.

En la aplicación de música en el iPhone, una función de alto nivel es reproducir una lista de reproducción. "Reproducir una lista de reproducción" es una función de un controlador de la aplicación.

Hay más de una forma de activar esa función. Puedo hacer clic en la lista de reproducción dentro de la aplicación, o puedo pedirle a Siri (interfaz de voz) que realice la misma función. Esos son dos gestos diferentes que son reconocidos por los diferentes puntos de vista.

La retroalimentación en cada vista también es diferente. Siri le dirá que está reproduciendo la música que solicitó. La aplicación de música le mostrará una respuesta visual de que está reproduciendo la lista de reproducción.

Fuhrmanator
fuente