Módulo de Ruby - una herramienta para agrupar pensamientos en un 'nivel superior'

En Ruby, un Módulo es una herramienta para modularizar y agrupar el código en un nivel superior. Entender la estructura del código como un mapa mundial.

밤치 90

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:

  1. Agrupar un espacio de nombres (Namespace)

  2. Compartir funcionalidades comunes (Mixin)

  3. 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 Registrable modulariza la "capacidad de registro"

  • Al hacer include Registrable,

    esa clase puede usar el método log como si fuera suyo

  • Es 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 superior

  • El 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"

  • Pedido combina 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.

  1. 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."
  1. Surge un lenguaje de dominio.
- "Payment::Pasarela", "Notification::Sender", "Auth::Tokenizable"
    → Se desarrollan vocabularios únicos para tus servicios
  1. 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`
  1. 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 Timestamped

  • Proporciona un método stamp

    • Al llamarlo: imprime el mensaje en el formato "[hora actual] mensaje"
  • Inclúyelo en las clases Post y Comment para 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 estudio

  • Study::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.