Sfondo:
Ho un modulo che dichiara una serie di metodi di istanza
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
E voglio chiamare alcuni di questi metodi all'interno di una classe. Come si fa normalmente in ruby è così:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problema
include UsefulThings
porta tutti i metodi da UsefulThings
. In questo caso voglio solo format_text
ed esplicitamente non voglio get_file
e delete_file
.
Vedo diverse possibili soluzioni a questo:
- In qualche modo invocare il metodo direttamente sul modulo senza includerlo ovunque
- Non so come / se ciò può essere fatto. (Da qui questa domanda)
- In qualche modo includi
Usefulthings
e porti solo alcuni dei suoi metodi- Inoltre non so come / se ciò può essere fatto
- Creare una classe proxy, includerla
UsefulThings
, quindi delegareformat_text
a tale istanza proxy- Funzionerebbe, ma le classi proxy anonime sono un hack. Che schifo.
- Suddividere il modulo in 2 o più moduli più piccoli
- Funzionerebbe anche questa, ed è probabilmente la migliore soluzione a cui riesco a pensare, ma preferirei evitarlo dato che finirei con una proliferazione di dozzine e dozzine di moduli - gestire questo sarebbe gravoso
Perché ci sono molte funzioni non correlate in un singolo modulo? Viene ApplicationHelper
da un'app di binari, che il nostro team ha di fatto deciso come discarica per qualsiasi cosa non abbastanza specifica da appartenere a nessun'altra parte. Principalmente metodi di utilità autonomi che vengono utilizzati ovunque. Potrei dividerlo in aiutanti separati, ma ce ne sarebbero 30, tutti con 1 metodo ciascuno ... questo sembra improduttivo
module UT; def add1; self+1; end; def add2; self+2; end; end
e di voler usare add1
ma non add2
in classe Fixnum
. In che modo sarebbe utile disporre di funzioni del modulo? Mi sto perdendo qualcosa?
Module#included
callback per attivare unoinclude
degli altri. Ilformat_text
metodo potrebbe essere spostato nel proprio modulo, poiché sembra essere utile da solo. Ciò renderebbe la gestione un po 'meno onerosa.