Contexte:
J'ai un module qui déclare un certain nombre de méthodes d'instance
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Et je veux appeler certaines de ces méthodes à partir d'une classe. Voici comment vous faites normalement cela en rubis:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problème
include UsefulThingsapporte toutes les méthodes de UsefulThings. Dans ce cas, je veux seulement format_textet explicitement ne veux pas get_fileet delete_file.
Je peux voir plusieurs solutions possibles à cela:
- Invoquez d'une manière ou d'une autre la méthode directement sur le module sans l'inclure nulle part
- Je ne sais pas comment / si cela peut être fait. (D'où cette question)
- Incluez
Usefulthingset n'apportez que certaines de ses méthodes- Je ne sais pas non plus comment / si cela peut être fait
- Créez une classe de proxy, incluez
UsefulThings-la, puis déléguezformat_textà cette instance de proxy- Cela fonctionnerait, mais les classes proxy anonymes sont un hack. Beurk.
- Divisez le module en 2 modules plus petits ou plus
- Cela fonctionnerait également, et c'est probablement la meilleure solution à laquelle je puisse penser, mais je préférerais l'éviter car je me retrouverais avec une prolifération de dizaines et de dizaines de modules - gérer cela serait fastidieux.
Pourquoi y a-t-il beaucoup de fonctions non liées dans un seul module? Cela ApplicationHelperprovient d'une application de rails, que notre équipe a de facto choisie comme dépotoir pour tout ce qui n'est pas assez spécifique pour appartenir à ailleurs. Principalement des méthodes utilitaires autonomes qui sont utilisées partout. Je pourrais le diviser en assistants séparés, mais il y en aurait 30, tous avec 1 méthode chacun ... cela semble improductif
Module#includedrappel pour déclencher unincludede l'autre. Laformat_textméthode pourrait être déplacée dans son propre module, car elle semble être utile seule. Cela rendrait la gestion un peu moins lourde.