Antecedentes:
Tengo un módulo que declara varios métodos de instancia
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Y quiero llamar a algunos de estos métodos desde una clase. La forma en que normalmente haces esto en ruby es así:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problema
include UsefulThingstrae todos los métodos de UsefulThings. En este caso solo quiero format_texty explícitamente no quiero get_filey delete_file.
Puedo ver varias soluciones posibles para esto:
- Invoca de alguna manera el método directamente en el módulo sin incluirlo en ningún lado
- No sé cómo / si esto se puede hacer. (De ahí esta pregunta)
- De alguna manera incluye
Usefulthingsy solo trae algunos de sus métodos- Tampoco sé cómo / si esto se puede hacer
- Crear una clase proxy, incluir
UsefulThingsy delegueformat_texta esa instancia de proxy- Esto funcionaría, pero las clases proxy anónimas son un truco. Yuck
- Divida el módulo en 2 o más módulos más pequeños.
- Esto también funcionaría, y es probablemente la mejor solución que se me ocurre, pero preferiría evitarlo, ya que terminaría con una proliferación de docenas y docenas de módulos; gestionar esto sería una carga
¿Por qué hay muchas funciones no relacionadas en un solo módulo? Es ApplicationHelperde una aplicación de rieles, que nuestro equipo ha decidido de facto como el vertedero de cualquier cosa que no sea lo suficientemente específica como para pertenecer a otro lugar. En su mayoría, métodos de utilidad independientes que se utilizan en todas partes. Podría dividirlo en ayudantes separados, pero habría 30 de ellos, todos con 1 método cada uno ... esto parece improductivo
module UT; def add1; self+1; end; def add2; self+2; end; endy quiere usar add1pero no add2en clase Fixnum. ¿Cómo ayudaría tener funciones de módulo para eso? ¿Me estoy perdiendo de algo?
Module#includeddevolución de llamada para activar unoincludedel otro. Elformat_textmétodo podría trasladarse a su propio módulo, ya que parece ser útil por sí mismo. Esto haría que la gestión sea un poco menos onerosa.