Фон:
У мене є модуль, який оголошує кілька методів екземплярів
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
І я хочу назвати деякі з цих методів з класу. Як ви зазвичай робите це в рубіні, це так:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Проблема
include UsefulThings
приносить усі методи з UsefulThings
. У цьому випадку я хочу лише format_text
і явно не хочу get_file
і delete_file
.
Я бачу кілька можливих рішень для цього:
- Як-небудь викликати метод безпосередньо на модулі, не включаючи його ніде
- Я не знаю, як / якщо це можна зробити. (Звідси це питання)
- Якось включайте
Usefulthings
і вводьте лише деякі його методи- Я також не знаю, як / якщо це можна зробити
- Створіть клас проксі, включіть його
UsefulThings
, а потім делегуйтеformat_text
цьому екземпляру проксі- Це спрацювало б, але класи анонімних проксі - хак. Гидота.
- Розділіть модуль на 2 або більше менших модулів
- Це також би спрацювало, і, мабуть, найкраще рішення, про яке я можу придумати, але я вважаю за краще уникати цього, оскільки я б закінчився розповсюдженням десятків і десятків модулів - управління цим було б обтяжливим.
Чому в одному модулі багато незв’язаних функцій? Це ApplicationHelper
з програми рейки, яку наша команда де-факто визначила як сміттєвий майданчик для чогось, що не є достатньо конкретним, щоб належати деінде. Переважно окремі корисні методи, які звикають всюди. Я міг би розбити його на окремих помічників, але їх було б 30, усі з 1 методом кожен ... це здається непродуктивним
module UT; def add1; self+1; end; def add2; self+2; end; end
і ви хочете використовувати, add1
але не add2
в класі Fixnum
. Як це допоможе мати модульні функції для цього? Я щось пропускаю?
Module#included
зворотний виклик, щоб викликатиinclude
інший.format_text
Метод може бути переміщений у власний модуль це, так як здається , щоб бути корисним на його власний. Це зробило б менеджмент трохи менш обтяжливим.