Sobes.tech
Junior

¿Qué es el patrón de arquitectura MVC?

sobes.tech AI

Respuesta de la IA

MVC (Modelo-Vista-Controlador) es un patrón arquitectónico que divide la aplicación en tres partes interrelacionadas para mejorar la organización del código y facilitar el desarrollo y mantenimiento:

  • Modelo: Representa los datos y la lógica de negocio. Es responsable de obtener, almacenar y procesar datos, así como de las reglas que los gobiernan. No tiene una vista directa de la interfaz de usuario.
  • Vista: Es responsable de mostrar los datos al usuario. Obtiene datos del Modelo y los visualiza. No contiene lógica de negocio y no interactúa directamente con los datos, excepto para su renderizado.
  • Controlador: Actúa como intermediario entre el Modelo y la Vista. Maneja la interacción con el usuario (por ejemplo, clics, entrada de datos), obtiene datos del Modelo, los pasa a la Vista para su visualización y actualiza el Modelo cuando los datos cambian por acción del usuario.

Relaciones principales:

  • El usuario interactúa con la Vista.
  • La Vista pasa las acciones del usuario al Controlador.
  • El Controlador procesa las acciones del usuario, interactuando con el Modelo (solicita o actualiza datos).
  • El Modelo notifica al Controlador (o directamente a la Vista, en algunas variaciones del patrón) sobre cambios en los datos.
  • El Controlador actualiza la Vista en base a los cambios en el Modelo (o la Vista se actualiza automáticamente al interactuar directamente con el Modelo).

Ventajas:

  • Separación de responsabilidades: Facilita el desarrollo, prueba y mantenimiento de componentes individuales.
  • Reutilización de código: El Modelo y el Controlador pueden ser utilizados con diferentes Vistas.
  • Facilita las pruebas: Los componentes pueden ser probados de forma independiente.
  • Desarrollo paralelo: Diferentes equipos pueden trabajar en distintas partes (Modelo, Vista, Controlador) simultáneamente.

Desventajas:

  • Aumento de la complejidad: Puede ser excesivo para aplicaciones pequeñas.
  • Problema de "Controlador Gordo": El controlador puede volverse demasiado grande y complejo si no se siguen los principios de separación.
  • Dificultad para definir límites: A veces es difícil determinar claramente dónde termina un componente y empieza otro.

Ejemplo (esquemático):

// Modelo (por ejemplo, una clase para trabajar con datos)
class UserModel {
  constructor() {
    this.users = [{
      id: 1,
      name: 'Alice'
    }, {
      id: 2,
      name: 'Bob'
    }];
  }

  getUsers() {
    return this.users;
  }

  addUser(user) {
    this.users.push(user);
    // Notificar sobre el cambio (en una aplicación real - mediante eventos)
  }
}

// Vista (por ejemplo, función para renderizar la lista)
function renderUserList(users) {
  const list = document.getElementById('user-list');
  list.innerHTML = users.map(user => `<li>${user.name}</li>`).join('');
}

// Controlador (para manejar eventos y coordinar)
class UserController {
  constructor(model, view) {
    this.model = model;
    this.view = view;

    // Inicializar vista
    this.updateView();

    // Manejar eventos (por ejemplo, clic en botón)
    document.getElementById('add-user-button').addEventListener('click', () => {
      const newUser = {
        id: this.model.getUsers().length + 1,
        name: prompt('Enter user name:')
      };
      if (newUser.name) {
        this.model.addUser(newUser);
        this.updateView(); // Actualizar vista tras cambio en modelo
      }
    });
  }

  updateView() {
    const users = this.model.getUsers();
    this.view(users);
  }
}

// Uso
const model = new UserModel();
const controller = new UserController(model, renderUserList);

Este es un ejemplo simplificado que demuestra el principio básico. En frameworks reales (como Angular, React, Vue) se utilizan variaciones más avanzadas de este y otros patrones arquitectónicos.