2012-04-05 18 views
5

¿Hay una diferencia en el uso entreUsando class << self, ¿cuándo usar clases o módulos?

class Helper 
    class << self 
    # ... 
    end 
end 

y

module Helper 
    class << self 
    # ... 
    end 
end 

¿Cuándo utilizar uno sobre el otro?

+0

¿Una de ellas tiene una letra extra que la otra? :) ¿Qué quieres decir con "¿hay alguna diferencia"? Una es una clase, una es un módulo y en ambas está ingresando la clase propia. – Phrogz

+0

Creo que quiero preguntar, ¿cuándo usarías una sobre la otra? Edité la pregunta para reflejar eso. –

Respuesta

4

El class<<self parece ser una pista falsa, ya que la única diferencia aquí es una clase frente a un módulo. Tal vez esté preguntando "Quiero crear un objeto que no pretendo instanciar, pero que existe solo como un espacio de nombres para algunos métodos (y posiblemente como un singleton con su propio estado global)."

Si este es el caso, ambos funcionarán igual de bien. Si hay alguna posibilidad de que es posible que desee crear un derivado (otro objeto que hereda los mismos métodos) entonces debe usar una clase, ya que poco es más fácil escribir:

class Variation < Helper 

en lugar de

module Helper 
    module OwnMethods 
    # Put methods here instead of class << self 
    end 
    extend OwnMethods 
end 

module Variation 
    extend Helper::OwnMethods 

Sin embargo, solo para el espaciado de nombres generalmente usaría un módulo sobre una clase, ya que una clase implica que se realizará una instanciación.

2

La diferencia entre un Módulo y una Clase es que puede crear una instancia de una Clase, pero no un Módulo. Si necesita crear una instancia de Helper (h = Helper.new), entonces debería ser una clase. De lo contrario, probablemente sea mejor seguir siendo un módulo. No estoy seguro de cómo el resto de tu código es relevante para la pregunta; si tiene métodos de clase en un Módulo o una Clase no es relevante para si necesita crear instancias de ese objeto.

Cuestiones relacionadas