Fundo:
Eu tenho um módulo que declara vários métodos de instância
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
E eu quero chamar alguns desses métodos de dentro de uma classe. Como você normalmente faz isso em ruby é assim:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problema
include UsefulThings
traz todos os métodos de UsefulThings
. Neste caso, eu só quero format_text
e explicitamente não quero get_file
e delete_file
.
Eu posso ver várias soluções possíveis para isso:
- De alguma forma, invoque o método diretamente no módulo sem incluí-lo em nenhum lugar
- Não sei como / se isso pode ser feito. (Daí esta pergunta)
- De alguma forma, inclua
Usefulthings
e apenas traga alguns métodos- Também não sei como / se isso pode ser feito
- Crie uma classe de proxy, inclua nela e,
UsefulThings
em seguida, delegueformat_text
para essa instância de proxy- Isso funcionaria, mas classes proxy anônimas são um hack. Que nojo.
- Divida o módulo em 2 ou mais módulos menores
- Isso também funcionaria, e é provavelmente a melhor solução em que consigo pensar, mas prefiro evitá-la, pois acabo com uma proliferação de dezenas e dezenas de módulos - gerenciar isso seria oneroso
Por que existem muitas funções não relacionadas em um único módulo? É ApplicationHelper
de um aplicativo de trilhos, que nossa equipe decidiu de fato como o depósito de lixo para qualquer coisa não específica o suficiente para pertencer a qualquer outro lugar. Métodos utilitários principalmente independentes que são usados em qualquer lugar. Eu poderia dividi-lo em ajudantes separados, mas haveria 30 deles, todos com 1 método cada ... isso parece improdutivo
module UT; def add1; self+1; end; def add2; self+2; end; end
e queira usar, add1
mas não add2
na aula Fixnum
. Como ajudaria a ter funções de módulo para isso? Estou esquecendo de algo?
Module#included
retorno de chamada para acionar uminclude
do outro. Oformat_text
método pode ser movido para seu próprio módulo, pois parece ser útil por si só. Isso tornaria a administração um pouco menos onerosa.