Modelo vista controlador: cómo separar responsabilidades

Clase 14 de 43Curso Profesional de Arquitectura de Software

Resumen

El modelo vista controlador es un patrón clave para organizar aplicaciones con claridad y escalabilidad. Al separar responsabilidades —lo que el usuario hace, cómo se representa el dominio y cómo se muestra en pantalla— permite que cada parte evolucione sin romper a las demás. Aquí entenderás su espíritu, sus variaciones y un ejemplo práctico centrado en la web.

¿Qué es modelo vista controlador y por qué separa responsabilidades?

El patrón divide el sistema en tres partes: la vista, el modelo y el controlador. La vista define cómo se ve la interfaz. El modelo describe qué puede hacer el sistema y representa el estado del dominio. El controlador gestiona las acciones del usuario y coordina la respuesta.

  • Separación de responsabilidades. La vista cambia sin tocar el modelo, y las acciones de usuario pueden reutilizar el mismo modelo y la misma vista.
  • Independencia de presentación y dominio. El modelo no debe conocer a las vistas ni cómo se muestran los datos. Así, el modelo evoluciona sin depender del diseño visual.
  • Comunicación focalizada. La relación más importante es entre vista y modelo, manteniendo bajo acoplamiento con el controlador cuando sea posible.
  • Flexibilidad sin exagerar la granularidad. No exige “un objeto por cada modelo” ni “una vista por cada tipo de aplicación”. Importa el rol, no la forma rígida.

¿Cómo se conectan vista, modelo y controlador en la práctica?

Lo esencial es definir cómo se comunican estos componentes. Hay implementaciones donde el controlador conoce a la vista y al modelo, y otras donde existen conectores alternativos. Cambian los enlaces, pero se mantiene la idea central: separar acciones del usuario, estado del sistema y presentación.

¿Qué ocurre en un ejemplo de carrito de compras y ruteo?

Imagina a una persona que desea ver su carrito de compras en un sitio web. La solicitud viaja a través de un ruteo que convierte una URL en un pedido a objetos hasta llegar a un controller.

  • El controller gestiona la acción: decide qué hacer para responder “ver el carrito”.
  • Coordina con el modelo: interactúa con el modelo que representa el carrito.
  • El modelo puede acceder a datos: ya sea mediante un ORM o ejecutando SQL queries.
  • El patrón no dicta persistencia: no define cómo conectarse a la base de datos, solo que exista un modelo que represente el estado del sistema.
  • La respuesta se renderiza con una vista: el controller puede elegir la vista adecuada.
  • Existen variaciones: el controller puede no conocer la vista; el ruteo puede vincularlos sin acoplarlos; incluso la vista puede observar al modelo y actualizarse sin controller en el medio.

¿Qué no define modelo vista controlador sobre persistencia?

El patrón no se preocupa por cómo el modelo se hace persistente ni por la tecnología de acceso a datos. Puede usar un ORM, consultas directas o no persistir. Lo crucial es que el modelo esté separado de la vista y del controlador.

¿Qué alternativas comparten el mismo espíritu de separación?

Existen patrones que comparten la misma idea de separar acciones del usuario, estado del sistema y presentación, variando en cómo conectan sus partes.

  • Model view, view model en C# y ASP .NET. Propone un modelo de vista que media entre la vista y el modelo, manteniendo responsabilidades separadas.
  • Modelo vista presentador. Cambia el rol de acción del usuario por un coordinador de vistas, pero sigue separado de vista y modelo.
  • Arquitectura flux. Define un flujo de datos de una sola vía, separando acciones de usuario (acciones), el modelo como store y las vistas como componentes de React.

¿Te gustaría compartir cómo aplicas estas separaciones en tus proyectos o qué variación te funcionó mejor?