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 UsefulThingsporta tutti i metodi da UsefulThings. In questo caso voglio solo format_texted esplicitamente non voglio get_filee 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
Usefulthingse porti solo alcuni dei suoi metodi- Inoltre non so come / se ciò può essere fatto
- Creare una classe proxy, includerla
UsefulThings, quindi delegareformat_texta 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 ApplicationHelperda 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; ende di voler usare add1ma non add2in classe Fixnum. In che modo sarebbe utile disporre di funzioni del modulo? Mi sto perdendo qualcosa?
Module#includedcallback per attivare unoincludedegli altri. Ilformat_textmetodo potrebbe essere spostato nel proprio modulo, poiché sembra essere utile da solo. Ciò renderebbe la gestione un po 'meno onerosa.