ruby - mixin - Cuándo usar un módulo y cuándo usar una clase
mixins ruby (3)
En este caso particular, probablemente no usaría ni una clase ni un módulo.
Una clase es una fábrica de objetos (note el plural). Si no desea crear varias instancias de la clase, no es necesario que exista.
Un módulo es un contenedor de métodos, compartido entre múltiples objetos. Si no mezcla el módulo en varios objetos, no es necesario que exista.
En este caso, parece que solo quieres un objeto. Así que usa uno:
def (StyleParser = Object.new).process(text)
...
end
def StyleParser.style_tag?(text)
...
end
O alternativamente:
class << (StyleParser = Object.new)
def process(text)
...
end
def style_tag?(text)
...
end
end
Pero como ya escribió @Azeem: para una decisión adecuada, necesitas más contexto. No estoy lo suficientemente familiarizado con los aspectos internos de Prawn para saber por qué Gregory tomó esa decisión en particular.
Actualmente estoy trabajando en el libro de Gregory Brown Ruby Best Practices . Al principio, él está hablando sobre la refactorización de algunas funcionalidades de los métodos de ayuda en una clase relacionada, a algunos métodos en el módulo, y luego el módulo se extend self
.
No había visto eso antes, después de un rápido google, descubrí que extend self
en un módulo permite que los métodos definidos en el módulo se vean entre sí, lo cual tiene sentido.
Ahora, mi pregunta es ¿cuándo harías algo como esto?
module StyleParser
extend self
def process(text)
...
end
def style_tag?(text)
...
end
end
y luego referirse a ello en pruebas con
@parser = Prawn::Document::Text::StyleParser
A diferencia de algo como esto?
class StyleParser
def self.process(text)
...
end
def self.style_tag?(text)
...
end
end
¿Es para que puedas usarlo como mixin? ¿O hay otras razones que no estoy viendo?
Se debe utilizar una clase para la funcionalidad que requerirá la creación de instancias o que debe realizar un seguimiento del estado. Un módulo se puede usar como una forma de combinar la funcionalidad en varias clases, o como una forma de proporcionar características únicas que no necesitan ser instanciadas o para mantener un registro del estado. Un método de clase también podría ser utilizado para este último.
Con eso en mente, creo que la distinción radica en si realmente necesitas o no una clase. Un método de clase parece más apropiado cuando tiene una clase existente que necesita alguna funcionalidad de singleton. Si lo que está haciendo consiste solo en métodos singleton, tiene más sentido implementarlo como un módulo y acceder a él a través del módulo directamente.
Si es algo que quieres crear, usa una clase. El resto de su pregunta necesita más contexto para que tenga sentido.