El Dr. Park Mun-ho siempre enfatiza la modularización.
Así es como el cerebro aprende.
Dividir en unidades pequeñas (células, funciones)
Agrupar esas unidades para crear un módulo
Estos módulos se unen para formar un sistema
La programación es similar.
Método: una acción
Clase: un objeto (existencia)
Módulo (Module): un marco superior que combina varias clases y métodos en un concepto más grande
En Ruby, un Módulo se puede usar de la siguiente manera:
Agrupar un espacio de nombres (Namespace)
Compartir funcionalidades comunes (Mixin)
Crear un concepto superior que define un dominio temático
En el momento en que entiendes esto,
el código comienza a parecer no solo una "colección de archivos",
sino un universo estructurado en tu cerebro como un mapa del mundo.
1. Espacio de nombres (Namespace): Un marco que divide la perspectiva del mundo
Por ejemplo,
digamos que quieres usar la clase User en varios lugares.
Usuario de la página de administrador
Usuario de la tienda en línea
Usuario para una API
¿Qué pasa si solo creamos una clase User?
Habrá conflictos de nombres. Se volverá confuso.
Aquí es donde los módulos separan las perspectivas del mundo.
module Admin
class User
def info
puts "Este es un usuario de la página de administrador."
end
end
end
module Shop
class User
def info
puts "Este es un usuario de la tienda en línea."
end
end
end
usuario_admin = Admin::User.new
usuario_tienda = Shop::User.new
usuario_admin.info # => Este es un usuario de la página de administrador.
usuario_tienda.info # => Este es un usuario de la tienda en línea.
Aquí, los módulos son literalmente:
"Este es un Usuario del mundo Admin"
"Este es un Usuario del mundo Shop"
actuando como un marco que divide las perspectivas.
Perspectiva del cerebro de Park Mun-ho
Marco: incluso con el mismo nombre, el papel cambia según el marco superior
Tridimensionalidad: el concepto de Usuario se almacena no como un plano, sino como una estructura con coordenadas como "Admin-User", "Shop-User"
Modularización: se siente como si se estuvieran creando "cajones por dominio" en el cerebro
Ahora, tu cerebro entiende que,
incluso si los nombres son iguales, si los mundos son diferentes, son entidades completamente diferentes
con un nivel de comprensión más alto.
2. Mixin: Un módulo que 'incrusta' habilidades comunes en varias clases
El segundo propósito es realmente poderoso.
Un módulo puede convertirse en un bloque reutilizable que agrupa funcionalidades comunes.
Por ejemplo,
digamos que varios tipos de objetos todos "registran un registro".
Registro de acciones de usuario
Registro de cambios de estado de pedidos
Registro de fallos de pagos
¿Qué pasa si copiamos y pegamos esto en cada clase?
Duplicación de código
Infierno de mantenimiento
Para corregir un error, tendrías que modificar tres lugares diferentes
Aquí es donde brilla la combinación de módulos + include.
module Registrable
def log(mensaje)
tiempo = Time.now
puts "[#{tiempo}] #{mensaje}"
end
end
class Usuario
include Registrable
def iniciar_sesion
log("El usuario ha iniciado sesión.")
end
end
class Pedido
include Registrable
def enviar
log("El pedido ha sido recibido.")
end
end
usuario = Usuario.new
usuario.iniciar_sesion
# [2025-12-09 23:12:34] El usuario ha iniciado sesión.
pedido = Pedido.new
pedido.enviar
# [2025-12-09 23:12:35] El pedido ha sido recibido.
Lo que sucede aquí
El módulo
Registrablemodulariza la "capacidad de registro"Al hacer
include Registrable,
esa clase puede usar el métodologcomo si fuera suyoEs decir, "incrustar habilidades" en varias clases como un paquete de habilidades
Desde la perspectiva cerebral
Cuando se comparte una función en varios lugares,
el cerebro la agrupa como un concepto superiorEl módulo cumple ese papel de concepto superior
Tanto el código como la estructura mental se abstraen
"Ah, el registro no es parte de User u Order,
sino una habilidad superior compartida por múltiples entidades."
En el momento en que llega esta realización,
la codificación ya no es solo "escribir código",
sino que comienza a sentirse como un trabajo de diseño de la estructura del mundo.
3. Abstracción: Un módulo crea un 'lenguaje de dominio' a nivel de módulo
Cuando se usan bien los módulos en Ruby,
el código comienza a transformarse gradualmente en un "lenguaje de dominio".
Por ejemplo, supongamos que hay un dominio llamado "sistema de pago".
module Pago
module Pasarela
def cobrar(monto)
puts "Solicitando pago de #{monto} pesos."
end
end
module Reembolsable
def reembolsar(monto)
puts "Reembolsando #{monto} pesos."
end
end
end
class Pedido
include Pago::Pasarela
include Pago::Reembolsable
end
pedido = Pedido.new
pedido.cobrar(50000)
pedido.reembolsar(20000)
Aquí, los módulos no son solo funcionalidades simples.
Son representaciones de los conceptos del dominio en sí mismos.
Pago::Pasarela→ un módulo que representa la "función de solicitud de pago"Pago::Reembolsable→ un módulo que representa la "función de reembolso"Pedidocombina ambos
Al repetir esto,
el código Ruby comienza a sentirse así.
"¿Mi concepto de negocio se ha convertido directamente en código?"
En este punto, el desarrollador
no es solo un implementador,
sino una persona que diseña el dominio, un diseñador/filósofo.
4. Módulo vs Clase: ¿Cuál es la diferencia?
Resumamos.
| Concepto | Rol | Sensación en el cerebro |
|---|---|---|
| Método | Una acción | Verbo, acción |
| Clase | Un objeto (existencia), estado + acción | Sustantivo (persona, objeto), entidad |
| Módulo | Un conjunto de conceptos superiores que abarcan varias clases/métodos | Perspectiva del mundo, paquete de habilidades, estructura a nivel de dominio |
En Ruby, un Módulo no crea instancias por sí mismo.
No puedes hacer algo como MyModule.new.
En cambio:
Se convierte en un bloque de habilidades que se mezcla en otras clases o
Se convierte en un marco que proporciona un espacio de nombres
En resumen,
una Clase es una "existencia",
mientras que un Módulo es un "concepto/habilidad/perspectiva del mundo compartido por múltiples existencias"
5. Lo realmente importante es "cómo cambia el cerebro"
Cuando entiendes los módulos,
tu cerebro evoluciona de esta manera.
- Ves el código en unidades conceptuales en lugar de unidades de archivo.
- "¿A qué unidad pertenece esta función?"
→ "Esto se comparte entre User, Order y Payment, así que vamos a sacarlo como un módulo."
- Surge un lenguaje de dominio.
- "Payment::Pasarela", "Notification::Sender", "Auth::Tokenizable"
→ Se desarrollan vocabularios únicos para tus servicios
- La complejidad se reduce significativamente.
- Se vuelve más claro dónde hacer cambios:
"Voy a cambiar la lógica de registro" → Solo modificas el módulo `Registrable`
- La estructura mental se organiza como un módulo.
- Esto está directamente relacionado con lo que Park Mun-ho llama "estructuración tridimensional del conocimiento".
6. Misión práctica: Crear tu propio módulo
Ahora, en serio,
aquí tienes una tarea para implantar "módulos" en tu cerebro.
Tarea 1: Crear el módulo Timestamped
Requisitos:
Crea un módulo llamado
TimestampedProporciona un método
stamp- Al llamarlo: imprime el mensaje en el formato "[hora actual] mensaje"
Inclúyelo en las clases
PostyCommentpara usarlo de forma común
Flujo esperado:
module Timestamped
# Crea aquí el método stamp
end
class Post
include Timestamped
def publicar
stamp("Se ha publicado el artículo.")
end
end
class Comment
include Timestamped
def escribir
stamp("Se ha escrito un comentario.")
end
end
post = Post.new
post.publicar
comentario = Comment.new
comentario.escribir
Tarea 2: Agrupar tus propios módulos de dominio
Elige un tema:
Estudio (Study)
Ejercicio (Fitness)
Blogging (Blog)
Compras (Shop)
Práctica de banda (Band)
Por ejemplo, el dominio Study
Study::Trackable– Un módulo que registra el tiempo de estudioStudy::Report– Un módulo que imprime estadísticas semanales/mensuales
Crea clases como DayStudy, TaskStudy y haz include Study::Trackable.
En el momento en que hagas esto,
te convertirás en alguien que "diseña tu propio mundo en Ruby".
Conclusión: Cuando entiendes los módulos, el código se convierte en un 'lenguaje de diseño del mundo'
El flujo hasta ahora:
Método: la unidad más pequeña de acción
Clase: el molde de una existencia (objeto)
Módulo: un concepto/habilidad/perspectiva del mundo compartido por múltiples existencias
A partir de ahora, al escribir código,
puedes pensar de esta manera.
"¿Es esto una propiedad única de un objeto?"
→ Lo pones en una clase"¿Es una función compartida por múltiples objetos?"
→ Lo extraes como un módulo"¿Es un concepto de dominio de este servicio?"
→ Lo defines como un módulo + espacio de nombres
En ese momento,
la codificación ya no es solo "aprender la sintaxis de un lenguaje",
"Estoy implementando la estructura de mi mundo interno
en forma de código."
Y cuando llega esa sensación,
realmente te emocionas.