Skip to content

Instantly share code, notes, and snippets.

@nhocki
Created August 9, 2011 04:20
Show Gist options
  • Save nhocki/1133409 to your computer and use it in GitHub Desktop.
Save nhocki/1133409 to your computer and use it in GitHub Desktop.
Clase de Ruby
# Los nombres de las CLASES y MODULOS debe empezar con mayúscula
# Se considera buena práctica poner estos nombres en un CamelCaseConMayusculaAlPrincipio
module Nameable
# El método self.included se llama cuando una clase INCLUYE este módulo
# El parámetro 'base' es la CLASE que incluye el método
# En este caso es la clase 'Car' y la clase 'User'
# NOTA: No existe un hook similar para extend (no existe self.extended(base)).
def self.included(base)
# EXTIENDE la clase con el módulo Nameable::ClassMethods
# La diferencia entre include y extend es:
# Los métodos que se INCLUYEN son de INSTANCIA
# Los métodos que se EXTIENDEN son de CLASE
base.extend(ClassMethods)
end
# Se pueden tener módulos dentro de módulos
# El nombre 'real' de este módulo es Nameable::ClassMethods
module ClassMethods
# Los nombres de los métodos y las variables debe ser en minúscula
# Se considera buena práctica reemplazar los espacios por underscores (_)
# NO usar camel case
def make_name(method)
define_method "pretty_#{method}" do
"1 - #{send(method)}"
end
end
end
end
class User
# Get / Set de un atributo 'login'
# Crea los metodos user.login y user.login=(otro_login)
attr_accessor :login
# Incluir el módulo Nameable
include Nameable
make_name :login
end
class Car
attr_accessor :plate, :model
# Reutilizar los métodos, para eso hicimos el módulo Nameable
# Es importante mostrar que muchos módulos reflejan en el nombre la funcionalidad
# Por ejemplo, "Trashable" para objetos que se pueden borrar
# Recuerden que el código que uno escribe debe ser entendible
# Uno escribe para el "futuro yo"
include Nameable
make_name :plate
end
c = Car.new
c.plate = "HSA380"
puts c.pretty_plate
u = User.new
u.login = "nhocki"
puts u.pretty_login
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment