POP — Minnt Studio · Mayo 2026

TIPO DE
PROGRAMA
CIÓN

Filosofía, principios y los cuatro elementos del lenguaje que definen cómo se escribe y organiza el código cuando el propósito manda.

POP v2.0 Paradigma declarativo Propósito primero
01 Tipo de programación
01Por qué existe 02POP vs OOP 03Filosofía 04Principios 05Elementos 06Comunicación 07Reutilización 08Manejo de errores 09Casos reales
01

POR QUÉ
EXISTE POP

Los patrones actuales, Clean Architecture, DDD, MVC y sus variantes, resuelven problemas reales. Pero los introducen demasiado pronto. Un proyecto pequeño termina con cinco capas, interfaces abstractas y un repositorio para cada entidad antes de tener una sola función útil.

La pregunta que más se repite al comenzar un proyecto no es técnica: es ¿dónde va esto? Un desarrollador abre el proyecto y no sabe si la lógica de autenticación vive en services, en controllers, en usecases o en auth. Esa duda es el problema que POP resuelve.

POP parte de una pregunta distinta. En lugar de preguntar qué patrón aplica aquí, pregunta cuál es el propósito de esto. La respuesta decide todo lo demás: dónde vive el código, cómo se llama, con quién habla.

POP no es anti-patrones

No rechaza OOP ni Clean Architecture. Propone que la organización por propósito sea la capa base, sobre la cual se pueden aplicar patrones avanzados cuando el proyecto los justifique. Primero que funcione bien. Después que escale elegantemente.

Complejidad innecesaria vs propósito claro - Minnt Studio
02

POP
vs OOP

La diferencia no está en la sintaxis. Está en la pregunta de partida y en cómo esa pregunta moldea todas las decisiones que siguen.

OOP — la pregunta de partida
¿Qué objeto es responsable de esto?
¿De cuál clase hereda?
¿Qué interfaz debe implementar?
¿Es un servicio, un repositorio o un caso de uso?
¿Qué patrón de diseño aplica aquí?
POP — la pregunta de partida
¿Cuál es el propósito de esto?
¿Dónde vive según ese propósito?
¿Con qué necesita comunicarse?
¿Qué puede salir mal y cómo se resuelve?
¿Alguien nuevo entendería esto en 15 minutos?
Mismo problema, dos enfoques — sistema de autenticación
Estructura OOP típica
src/
  controllers/
    AuthController.js
  services/
    AuthService.js
  repositories/
    UserRepository.js
  interfaces/
    IAuthService.ts
    IUserRepository.ts
  models/
    User.js
  middleware/
    authMiddleware.js
  utils/
    tokenHelper.js
Estructura POP
funciones/
  usuario/
    iniciarSesion
    cerrarSesion
    registrarse
    verificarSesion
datos/
  usuario/
    Molde.Usuario
    Molde.Sesion
conexion/
  api/
    autenticacion

En OOP tienes que conocer la arquitectura del proyecto para saber dónde buscar. En POP el nombre de la carpeta te dice exactamente qué hay adentro. La diferencia parece pequeña al inicio; a los seis meses de proyecto, es enorme.

OOP puede derivar en jerarquías profundas

Cuando se abusa de la herencia, el comportamiento queda enterrado en capas. Para saber qué hace un método tienes que seguir la cadena: clase hija, clase padre, clase abstracta, interfaz. POP evita eso porque no hay herencia. Toda la lógica de una Acción está visible y sus dependencias son declaradas.

03

FILOSOFÍA

Todo elemento tiene un único propósito, un único lugar y un único responsable. El programador nunca debería preguntarse dónde va algo. Si la duda existe, la estructura está mal diseñada.

POP no organiza por tipo de archivo, por capa técnica ni por patrón. Organiza por intención. El código que autentica usuarios vive junto al resto de lo que tiene que ver con autenticación, sin importar si es una función, un esquema de datos o una regla de negocio.

La complejidad se gana, no se hereda. Un proyecto POP comienza simple porque simple es suficiente. Los patrones avanzados entran cuando el proyecto los pide, no porque el equipo quiera seguir mejores prácticas.

I

El propósito manda

La pregunta "¿para qué existe esto?" se responde antes de escribir una sola línea. El propósito define el nombre, la ubicación y las dependencias.

II

Un lugar, un dueño

Cada elemento tiene un lugar que no comparte con ningún otro. La duplicación de lógica es una señal de estructura mal diseñada.

III

Simplicidad ganada

La complejidad se justifica o no existe. No hay capas por convención. No hay abstracciones porque sí. Solo lo que el proyecto necesita ahora.

IV

Legible por humanos

Si alguien nuevo no puede orientarse en quince minutos, la estructura falló. El código es para personas primero, para máquinas después.

04

PRINCIPIOS

Siete reglas. Cada una se puede aplicar hoy, en cualquier proyecto, independientemente del lenguaje.

Regla 01

Todo tiene un lugar. Cada elemento pertenece a una sección específica. Si no sabes dónde colocarlo, la estructura está mal diseñada, no el elemento.

Regla 02

Un elemento, un propósito. Una Acción no hace dos cosas. Un Molde no mezcla dominios. Cuando algo hace demasiado, se divide.

Regla 03

El propósito define la ubicación. No importa el lenguaje, el framework ni la plataforma. La ubicación siempre depende del propósito, nunca del tipo de archivo.

Regla 04

Reutilizar antes que duplicar. Si dos elementos comparten estructura, se crea un Molde. Si comparten comportamiento, se crea una Acción en comun/.

Regla 05

Lo que no se usa se elimina. Un campo sin lectura, una Acción sin llamadas, un Molde sin Registros. Todo eso es peso muerto y se borra.

Regla 06

La simplicidad tiene prioridad. Ante dos soluciones posibles, la más simple gana. La complejidad debe justificarse con un problema real, no con una preferencia técnica.

Regla 07

El proyecto debe ser entendible por otra persona. Si un desarrollador nuevo no puede orientarse en quince minutos usando solo los nombres de carpetas y archivos, la estructura falló, no el desarrollador.

05

ELEMENTOS
DEL LENGUAJE

POP define cuatro elementos fundamentales. Cada uno tiene un propósito preciso y no se mezclan entre sí. El Molde es la forma. El Registro es el contenido. La Acción es el comportamiento. La Solución es la respuesta al error.

01

Molde

Define la estructura. Sin lógica, sin métodos.

Un Molde describe qué campos tiene un tipo de información y de qué tipo son cada uno. No ejecuta nada. No calcula nada. Solo define la forma que tendrán los datos.

Molde básico
Molde Usuario id texto nombre texto correo texto edad numero activo booleano creadoEn fecha
Molde con tipos opcionales
Molde Producto id texto nombre texto precio numero descripcion texto opcional imagenes lista de texto categoria texto stock numero
02

Registro

Un caso concreto basado en un Molde. Tiene valores reales.

El Molde es la forma; el Registro es el contenido. Si el Molde dice que un usuario tiene un nombre de tipo texto, el Registro tiene el nombre real. Un Registro siempre referencia su Molde.

Registro de usuario
Registro Usuario id = "u-001" nombre = "Alejandro Galvis" correo = "ag@minnt.studio" edad = 20 activo = verdadero creadoEn = 2026-05-01
Registro de producto
Registro Producto id = "p-042" nombre = "Camiseta Minnt Studio" precio = 35000 descripcion = vacio imagenes = ["img1.jpg"] categoria = "ropa" stock = 12
03

Acción

Comportamiento ejecutable. Entrada, resultado y fallas declaradas.

Una Acción tiene un propósito único, entradas definidas, un resultado esperado y una lista explícita de lo que puede salir mal. No pertenece a ningún Molde. Existe por sí misma en la sección funciones/.

Acción simple
Accion iniciarSesion en funciones/usuario/iniciarSesion
entrada correo texto contrasena texto
resultado sesion Registro Sesion
puede fallar credenciales invalidas usuario inactivo demasiados intentos
Acción con dependencias
Accion crearPedido en funciones/pedido/crearPedido
entrada usuario Registro Usuario items lista Registro Item
usa inventario.verificarStock pagos.procesarCobro notif.enviarConfirmacion
resultado pedido Registro Pedido
puede fallar stock insuficiente pago rechazado
04

Solución

La respuesta explícita a cada falla posible.

La Solución reemplaza el try-catch genérico. En lugar de atrapar cualquier error y hacer algo vago con él, POP exige que cada falla posible tenga una respuesta específica declarada junto a la Acción que la puede producir.

Soluciones por tipo de error
Accion procesarImagen
puede fallar
si imagen corrupta Solucion reprocesar max 2 intentos
si formato no soportado Solucion convertir convierte a jpg antes
si tamano excedido Solucion comprimir reduce al 80% de calidad
si falla persistente Solucion escalar notifica al sistema
Comparación con try-catch
// OOP — genérico try { await procesarImagen(img) } catch (e) { console.log(e) // ¿qué hacemos aquí? }
// POP — específico Accion procesarImagen puede fallar si imagen corrupta Solucion reprocesar cada error tiene nombre y respuesta definida
POP los 4 elementos y su jerarquia - Minnt Studio
06

COMUNICACIÓN
ENTRE MÓDULOS

Los módulos no se llaman directamente entre sí. Se comunican a través de Acciones declaradas. La declaración usa es explícita: cualquiera que lea la Acción sabe exactamente de qué depende, sin seguir el código ni leer documentación externa.

Principio de dependencia declarada
en funciones/pedido/crearPedido
Accion crearPedido
entrada usuario Registro Usuario productos lista de Registro Producto
usa inventario.verificarDisponibilidad modulo inventario pagos.procesarCobro modulo pagos notificaciones.enviarConfirmacion modulo notif comun.generarId funcion comun
resultado pedido Registro Pedido
puede fallar stock insuficiente pago rechazado usuario no verificado

El bloque usa es el grafo de dependencias de la Acción, visible sin herramientas externas. Si ves este archivo sabes exactamente qué módulos toca. Eso facilita el testing, el debugging y la revisión de código.

Comunicación unidireccional

Las dependencias siempre van en una dirección. Un módulo puede usar Acciones de otro, pero no puede ser usado por el mismo módulo que usa. Esto previene dependencias circulares por diseño, no por convención.

07

REUTILIZACIÓN

POP no tiene herencia. Reutiliza de dos formas: composición de Moldes con incluye y Acciones compartidas en funciones/comun/.

Composición de Moldes — incluye

Un Molde puede incluir a otro como parte de su estructura. No lo hereda, lo contiene. La diferencia es importante: si el Molde base cambia, los cambios son explícitos y trazables.

Molde Direccion calle texto ciudad texto pais texto codigo texto opcional
cliente y empresa reutilizan Direccion sin heredar
Molde Cliente id texto nombre texto correo texto envio incluye Direccion facturacion incluye Direccion
Molde Empresa id texto razonSocial texto nit texto sedesPrincipales lista de incluye Direccion
Acciones compartidas — funciones/comun/

Si el mismo comportamiento se necesita en varios dominios, se extrae a funciones/comun/. Cualquier Acción puede usarla declarándola en su bloque usa.

en funciones/comun/validarCorreo
Accion validarCorreo entrada correo texto resultado valido booleano
usada por iniciarSesion, registrarse, actualizarPerfil cada uno la declara en su bloque 'usa'
Accion registrarse usa comun.validarCorreo comun.hashContrasena comun.generarId
08

MANEJO
DE ERRORES

En la mayoría de los paradigmas el manejo de errores es una capa separada, algo que se agrega después. En POP los errores son parte del contrato de la Acción desde el principio.

Cada Acción declara explícitamente qué puede salir mal. Eso convierte los errores en documentación viva: cualquiera que lea la Acción sabe qué fallas puede producir y cómo el sistema las resuelve.

Tipos de Solución
Solucion reintentar — vuelve a intentar automáticamente Solucion transformar — convierte el input a algo válido Solucion escalar — notifica a otro sistema o persona Solucion degradar — continua con funcionalidad reducida Solucion abortar — detiene el proceso y notifica
Ejemplo completo — subir archivo
Accion subirArchivo
entrada archivo binario tipo texto usuario Registro Usuario
usa almacenamiento.subir comun.validarTipo
resultado url texto
puede fallar
si tipo no permitido Solucion abortar informa al usuario el tipo valido
si tamano excedido Solucion transformar comprime si es imagen, rechaza si es otro tipo
si almacenamiento falla Solucion reintentar max 3 veces, espera 2s entre intentos
si falla persistente Solucion escalar notifica al equipo de infraestructura
09

CASOS
REALES

POP aplicado a escenarios concretos. Los tres dominios más comunes donde la pregunta "¿cuál es el propósito?" cambia todo.

E-commerce — flujo completo de compra
funciones/carrito/agregarProducto Accion agregarProducto entrada carritoId texto productoId texto cantidad numero usa inventario.verificarStock carrito.buscarActivo resultado carrito Registro Carrito puede fallar producto sin stock carrito expirado cantidad invalida
Red social — publicación con moderación
funciones/publicacion/crear Accion crearPublicacion entrada autor Registro Usuario contenido texto imagenes lista de texto opcional usa moderacion.verificarContenido comun.limpiarTexto notif.avisarSeguidores resultado publicacion Registro Publicacion puede fallar contenido inapropiado usuario bloqueado limite diario alcanzado
Videojuego — combate por turnos
funciones/combate/ejecutarAtaque Accion ejecutarAtaque entrada atacante Registro Personaje objetivo Registro Personaje habilidad Registro Habilidad usa combate.calcularDano combate.verificarPrecision efectos.aplicarEstado ui.mostrarAnimacion resultado turno Registro ResultadoTurno puede fallar sin puntos de accion habilidad en enfriamiento objetivo fuera de rango