POP — Minnt Studio · Mayo 2026
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.
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.
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.
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.
¿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í?
¿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?
src/
controllers/
AuthController.js
services/
AuthService.js
repositories/
UserRepository.js
interfaces/
IAuthService.ts
IUserRepository.ts
models/
User.js
middleware/
authMiddleware.js
utils/
tokenHelper.js
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.
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.
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.
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.
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.
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.
Si alguien nuevo no puede orientarse en quince minutos, la estructura falló. El código es para personas primero, para máquinas después.
Siete reglas. Cada una se puede aplicar hoy, en cualquier proyecto, independientemente del lenguaje.
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.
Un elemento, un propósito. Una Acción no hace dos cosas. Un Molde no mezcla dominios. Cuando algo hace demasiado, se divide.
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.
Reutilizar antes que duplicar. Si dos elementos comparten estructura, se crea un Molde. Si comparten comportamiento, se crea una Acción en comun/.
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.
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.
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.
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.
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.
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.
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/.
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.
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.
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.
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.
POP no tiene herencia. Reutiliza de dos formas: composición de Moldes con incluye y Acciones compartidas en funciones/comun/.
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.
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 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.
POP aplicado a escenarios concretos. Los tres dominios más comunes donde la pregunta "¿cuál es el propósito?" cambia todo.