Ampliando el Patrón MVC: El Principio de los 'Thin Controllers'

Una vez que entiendes el flujo básico de MVC, surge una pregunta común: ¿dónde pongo exactamente la lógica? La respuesta profesional es seguir el principio de los Controladores Delgados (Thin Controllers).

¿Qué son los “Thin Controllers” (Controladores Delgados)?

El término “Delgado” se refiere a que el código dentro del Controlador debe ser minimalista, limpio y enfocado exclusivamente en la orquestación.

Concepto ClaveDescripción para el FrameworkRelevancia para Liderazgo y Calidad del Código
”Thin Controllers”Los frameworks te empujan a que el Controlador solo se encargue de gestionar el flujo (recibir la petición, llamar al Modelo/Servicio y retornar la Vista).Un líder tecnológico debe priorizar la Testabilidad. Los Controladores delgados son fáciles de probar porque solo prueban la orquestación, no la lógica pesada.
Lógica PesadaLa lógica de negocio pesada (cálculos, validaciones complejas, lógica de múltiples pasos) debe residir en las Clases de Servicio o en el Modelo.Mantener la lógica separada de la orquestación facilita el Mantenimiento y la Reutilización.

Concepto Clave: ¿Qué son las Clases de Servicio?

Al hablar de Controladores Delgados, mencionamos que la lógica de negocio pesada debe ir en el Modelo o en Clases de Servicio. Pero, ¿qué son estas clases?

Definición de Clases de Servicio

Una Clase de Servicio (o Service Layer) es una capa intermedia que se utiliza para contener lógica de negocio compleja que no encaja cómodamente dentro de una sola clase Modelo.

  1. Su Rol: Contener operaciones que involucran a múltiples Modelos o que requieren una secuencia de pasos muy específica.
  2. El Problema que Resuelve: Evita que el Modelo se sobrecargue con lógica que no está directamente relacionada con la manipulación de sus propios datos, y evita que el Controlador se engorde.
  3. Ejemplo Práctico:
    • Imagina que un usuario hace un Checkout. Esto requiere:
      1. Validar el carrito (Modelo Carrito).
      2. Crear una orden de compra (Modelo Orden).
      3. Restar el inventario (Modelo Producto).
      4. Enviar un email de confirmación (Librería Externa).
    • En lugar de poner toda esta secuencia en el Controlador, creas una clase CheckoutService con un método procesarCompra(). El Controlador solo llama a CheckoutService.procesarCompra(carrito).

En resumen:

  • Modelo: Sabe cómo guardar, actualizar o buscar sus propios datos.
  • Clase de Servicio: Sabe cómo coordinar a múltiples Modelos y otras herramientas para llevar a cabo una tarea de negocio compleja.
  • Controlador Delgado: Solo sabe que tiene que llamar al Servicio para que haga el trabajo.

De esta forma, mantienes la lógica de negocio separada de la orquestación (Controlador) y de la persistencia de datos (Modelo), logrando el máximo nivel de testabilidad y claridad.


Por Qué Debes Evitar los “Fat Controllers” (Controladores Gordos)

Un Controlador Gordo (Fat Controller) ocurre cuando pones toda la lógica de negocio directamente dentro de la función del Controlador.

Controlador Gordo (❌ Malo)Controlador Delgado (✅ Bueno)
Ejemplo: Dentro del Controlador, verificas 10 reglas de validación, calculas el precio final con impuestos y guardas todo en la base de datos.Ejemplo: El Controlador llama a una única función como UserService.crearNuevoUsuario(datos) y maneja el éxito o el error.
Consecuencia: Es difícil de testear y la lógica no se puede reutilizar en otro lugar (por ejemplo, en un job en segundo plano).Consecuencia: Es fácil de testear (solo compruebas la llamada al servicio) y la lógica de negocio es reutilizable.

En resumen: El trabajo del Controlador es dirigir, no ejecutar. Debe delegar las tareas pesadas a las clases especializadas (Modelos o Servicios) para mantener la claridad y la testabilidad de tu aplicación.

Mikel Cantero

Mikel Cantero

Ingeniero de Software

Llevo más de 7 años trabajando en soluciones personalizadas para pequeñas, medianas y grandes empresas. Proponiendo soluciones tecnologicas creativas y escalables para mejorar y agilizar la operación de los negocios.