En mi post anterior sobre evitar conflitos de nombres con mixins utilicé una clase auxiliar que incluía el módulo que queriamos, tras lo cual era instanciada para tener accesibles los métodos del módulo.
En el último ejemplo del post propuse el siguiente código:
module Validable
def valid?
check
end
def check
true
end
end
class Ejemplo4
# clase auxiliar que incluye la funcionalidad de Validable
class ValidableHelper
include Validable
end
def check
if ValidableHelper.new.valid?
"Valid"
else
"Invalid"
end
end
end
>> Ejemplo4.new.check
=> "Valid"
Utilizamos la clase ValidableHelper para encapsular el módulo Validable y que los métodos de éste no interfieran con el resto de métodos de nuestra clase.
Podemos evitar tener que instanciar nuestra clase auxiliar extendiendo el módulo en lugar de incluirlo, para que sus métodos sean métodos de clase y no de instancia.
module Validable
def valid?
check
end
def check
true
end
end
class Ejemplo4
# clase auxiliar que incluye la funcionalidad de Validable
class ValidableHelper
extend Validable
end
def check
if ValidableHelper.valid?
"Valid"
else
"Invalid"
end
end
end
>> Ejemplo4.new.check
=> "Valid"
También podemos usar un módulo auxiliar para conseguir el mismo efecto:
module Validable
def valid?
check
end
def check
true
end
end
class Ejemplo4
# clase auxiliar que incluye la funcionalidad de Validable
module ValidableHelper
extend Validable
end
def check
if ValidableHelper.valid?
"Valid"
else
"Invalid"
end
end
end
>> Ejemplo4.new.check
=> "Valid"
