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 UsefulThings
trae todos los métodos de UsefulThings
. En este caso solo quiero format_text
y explícitamente no quiero get_file
y 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
Usefulthings
y solo trae algunos de sus métodos- Tampoco sé cómo / si esto se puede hacer
- Crear una clase proxy, incluir
UsefulThings
y delegueformat_text
a 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 ApplicationHelper
de 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; end
y quiere usar add1
pero no add2
en clase Fixnum
. ¿Cómo ayudaría tener funciones de módulo para eso? ¿Me estoy perdiendo de algo?
Module#included
devolución de llamada para activar unoinclude
del otro. Elformat_text
mé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.