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 UsefulThings
apporte toutes les méthodes de UsefulThings
. Dans ce cas, je veux seulement format_text
et explicitement ne veux pas get_file
et 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
Usefulthings
et 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 ApplicationHelper
provient 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#included
rappel pour déclencher uninclude
de l'autre. Laformat_text
méthode pourrait être déplacée dans son propre module, car elle semble être utile seule. Cela rendrait la gestion un peu moins lourde.