Tło:
Mam moduł, który deklaruje kilka metod instancji
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
I chcę wywołać niektóre z tych metod z poziomu klasy. Sposób, w jaki zwykle robisz to w Ruby, wygląda tak:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Problem
include UsefulThings
wprowadza wszystkie metody z UsefulThings
. W tym przypadku chcę tylko format_text
i wyraźnie nie chcę get_file
i delete_file
.
Widzę kilka możliwych rozwiązań tego problemu:
- W jakiś sposób wywołuje metodę bezpośrednio w module, nie włączając jej nigdzie
- Nie wiem, jak / czy można to zrobić. (Stąd to pytanie)
- W jakiś sposób włączaj
Usefulthings
i wprowadzaj tylko niektóre z jego metod- Nie wiem też, jak / czy można to zrobić
- Utwórz klasę proxy, dołącz ją
UsefulThings
, a następnie delegujformat_text
do tej instancji proxy- To by zadziałało, ale anonimowe klasy proxy to hack. Fuj.
- Podziel moduł na 2 lub więcej mniejszych modułów
- To też by zadziałało i jest prawdopodobnie najlepszym rozwiązaniem, jakie przychodzi mi do głowy, ale wolałbym tego uniknąć, ponieważ skończyłoby się to mnożeniem dziesiątek modułów - zarządzanie tym byłoby uciążliwe
Dlaczego w jednym module jest wiele niezwiązanych ze sobą funkcji? Pochodzi ApplicationHelper
z aplikacji railsowej, którą nasz zespół de facto zdecydował jako wysypisko wszystkiego, co nie jest na tyle specyficzne, by należało do innego miejsca. W większości samodzielne metody narzędziowe, które są używane wszędzie. Mógłbym podzielić to na oddzielnych pomocników, ale byłoby ich 30, wszyscy z 1 metodą każda ... wydaje się to nieproduktywne
module UT; def add1; self+1; end; def add2; self+2; end; end
i chcesz używać, add1
ale nie add2
w klasie Fixnum
. Jak pomogłoby posiadanie do tego funkcji modułu? Czy coś mi brakuje?
Module#included
wywołania zwrotnego do wyzwalaniainclude
drugiego.format_text
Sposób można przenieść do niego własnego modułu, ponieważ wydaje się być przydatna na swój własny. Dzięki temu zarządzanie byłoby mniej uciążliwe.